(57)【要約】【課題】コストの増加を抑えつつ演算処理速度を向上させる演算処理装置及び演算処理装置の制御方法を提供する。【解決手段】各積和演算部５０１〜５０３は、行列を形成する第１データの第１所定行に含まれるそれぞれ異なる第１要素データをレジスタファイル４１０から取得し、且つ、行列を形成する第２データの第２所定行に含まれる同じ第２要素データをレジスタファイル４２０から取得し、取得した第１要素データ及び第２要素データを用いて演算を行う処理を所定回数行うことで、第１データの１行分の演算である行分演算を行い、行分演算の結果を基に第１データと第２データとを用いた演算を実行する。【選択図】図４
2018106559.tif 000002
【特許請求の範囲】
【請求項１】
行列に含まれる要素データを有する第１データ及び第２データをそれぞれ格納するデータ格納部と、
複数の演算部と、
前記演算部毎に配置され、前記データ格納部に格納された前記第１データの第１所定行を格納する第１格納部と、
前記演算部毎に配置され、前記データ格納部に格納された前記第２データの第２所定行を格納する第２格納部と、
前記演算部毎に複数配置された各々が前記第１所定行に含まれるそれぞれ異なる第１要素データを前記第１格納部から取得し、且つ、前記第２所定行に含まれる同じ第２要素データを前記第２格納部から取得し、取得した前記第１要素データ及び前記第２要素データを用いて演算を行う処理を所定回数行うことで、前記第１データの１行分の演算である行分演算を行なった結果を基に前記第１データと前記第２データとを用いた演算を実行する積和演算部と
を備えたことを特徴とする演算処理装置。
【請求項２】
複数の前記演算部は、前記第１データ又は前記第２データのサイズを基に演算を行う自己の数を決定し、且つ、前記第１データ又は前記第２データのサイズの何れか一方及び前記第２データの移動量を基に前記演算部が有する第２演算部の数を決定することを特徴とする請求項１に記載の演算処理装置。
【請求項３】
各前記積和演算部は、それぞれ前記第１所定行の先頭から１つずつ先の番号の前記第１要素データを先頭として演算毎にストライド数ずつ進めた前記第１要素データを取得し、且つ、前記第２所定行に含まれる連番で並ぶ前記第２要素データを演算毎に番号順に取得し、取得した前記第１要素データ及び前記第２要素データを乗算した値を前の演算結果に加算する演算を繰り返すことで前記行分演算を行うことを特徴とする請求項１又は２に記載の演算処理装置。
【請求項４】
各前記積和演算部は、前記第１所定行に含まれる連番で並ぶ前記第１要素データのうち、番号順に異なる前記第１要素データをそれぞれが取得し、且つ、前記第２所定行に含まれる連番で並ぶ前記第２要素データを演算毎に番号順に取得し、取得した前記第１要素データ及び前記第２要素データを乗算した値を、前の演算においてストライド数先の積和演算部が算出した演算結果に加算する演算を繰り返すことで前記行分演算を行うことを特徴とする請求項１又は２に記載の演算処理装置。
【請求項５】
行列を形成する要素データを有する第１データ及び第２データをそれぞれ格納した記憶装置に接続する演算処理装置の制御方法であって、
前記記憶装置に格納された前記第１データの第１所定行を、積和演算器を複数有する演算器毎に配置された第１格納装置に格納し、
前記記憶装置に格納された前記第２データの第２所定行を前記演算器毎に配置された第２格納装置に格納し、
前記第１所定行に含まれるそれぞれ異なる第１要素データを前記第１格納装置から取得し、且つ、前記第２所定行に含まれる同じ第２要素データを前記第２格納装置から取得し、取得した前記第１要素データ及び前記第２要素データを用いて演算を行う演算処理を各前記積和演算器に実行させ、
前記演算処理を所定回数行うことで、前記第１データの１行分の演算である行分演算を各前記積和演算器に実行させ、
前記行分演算の結果を基に前記第１データと前記第２データとを用いた演算を各前記積和演算器に実行させる
ことを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置に用いられるＧＰＵ（Graphic  Processing  Unit）は、元々は画像処理用のプロセッサであるが、後述する浮動小数点の積和演算器を多数有し、行列計算に最適化されているため、機械学習用の処理を行うプロセッサとしても用いられることが多い。そして、深層学習（ディープラーニング）を行う処理においても、ＧＰＵが用いられることが一般的である。
【０００３】
深層学習では、ニューラルネットワークを用いて処理が行われることが多い。例えば、画像認識の深層学習の場合、与えられた画像が何か判断するフォワード処理及び判断するためのニューラルネットワークのパラメータを更新するためのバックワード処理の２つの処理を有する。深層学習を行う演算処理装置は、フォワード処理での計算結果と期待値との差分を用いてバックワード処理を行い、ニューラルネットワークのパラメータを更新する。そして、演算処理装置は、更新したパラメータを用いてフォワード処理の精度を向上させる。
【０００４】
ニューラルネットワークは複数の層で構成され、各層で特徴量の抽出などの演算処理が行われ、且つ、学習が繰り返される。このように、ニューラルネットワークは、それぞれの層で実施される異なる演算処理が行われる多層の構造を有する。このような構造を有することから、層毎のパラメータの更新を行うために、後の層の計算結果と期待値との差分を求め、その差分を１つ前の層に、その層の差分計算の結果をさらに１つ前の層に伝搬しながら学習が行われる。ここでの説明における１つ前及び１つ先は、フォワード処理が進む方向を基準とする。
【０００５】
さらに、深層学習の中で主に画像認識で用いられる演算処理として、畳み込みニューラルネットワークという処理がある。畳み込みニューラルネットワークでは、畳み込みと呼ばれる演算が多用される。以下では、「畳み込み演算」という。例えば、画像認識を行う場合、入力画像上の領域に予め決められたパラメータを各要素として有する重み枠を元画像に配置する。そして、重み枠が配置された入力画像の各要素と、重み枠の各要素とを乗算したものを合計することで、入力画像における重み枠が配置された領域の特徴量を算出する。この元画像への重み枠の配置を予め決められた重み枠の移動幅を用いて入力画像全体に行い、算出した特徴量をまとめたものが、畳み込み演算の結果として出力される出力画像となる。重み枠は、「フィルタ」と呼ばれる場合がある。
【０００６】
例えば、入力画像として、８×８の要素を有する画像、すなわち８×８ビットのグレースケールの画像を考える。以下では、８×８の入力画像という。また、４×４の要素を有するフィルタを用いる場合で、且つフィルタを入力画像における１列又は１行ずつずらす場合について説明する。以下では、４×４のフィルタという。また、以下では、行が延びる方向を「行方向」といい、列が延びる方向を「列方向」という。この場合、８×８の入力画像の行方向の一方の端に配置された４×４のフィルタを行方向に５（＝８−３）回移動させると他方の端に到達する。すなわち、出力画像は行方向に５つの要素を有する。同様に、８×８の入力画像の列方向の一方の端に配置された４×４のフィルタを列方向に８−３回移動させると他方の端に到達する。すなわち、出力画像は列方向にも５つの要素を有する。したがって、出力画像は、５×５の画像となる。そして、出力画像の各要素は、フィルタを入力画像に配置した状態の、フィルタの各要素とその各要素に対応する位置の入力画像の各要素を乗算した合計値となる。
【０００７】
このような乗算した値を合計する演算を行う場合、演算処理装置は、ｆｍａ（Fused  Multiply  Add）と呼ばれる命令を用いることが多い。ｆｍａとは、（Ａ×Ｂ）＋Ｃの形で表される浮動小数点の積和演算を行う命令である。
【０００８】
さらに、このような畳み込み演算を行う場合に、１つの命令を実行することにより、複数のデータに対する演算処理を同時に行い、同時に複数の演算結果出力を得るＳＩＭＤ（Single  Instruction  Multiple  Data）という方式が用いられる場合がある。例えば、４個のデータを並列に処理するＳＩＭＤを用いた演算の場合で説明する。以下では、ｎ個のデータを並列に処理するＳＩＭＤを、ｎＳＩＭＤという。すなわち、この場合の演算処理は、４ＳＩＭＤの演算処理といえる。また、以下では、ＳＩＭＤを用いた演算を、ＳＩＭＤ演算という。
【０００９】
上述した８×８の入力画像及び４×４のフィルタを用いた畳み込み演算の場合、演算装置は、フィルタを１列ずつ４回ずらした各配置状態のフィルタの１つの要素と対応する入力画像の要素とを乗算した結果である４つの値を一度で計算できる。すなわち、４ＳＩＭＤの演算を行う場合、演算処理装置は、４つの異なる配置のフィルタの状態に対応する出力画像の要素を並行して算出することができる。
【００１０】
このようなＳＩＭＤを用いた演算処理を行う場合、演算処理装置は、記憶装置としてのメモリに格納された入力画像のデータのうち、演算に用いるデータを、ＳＩＭＤ演算で用いるレジスタに格納してから１回の演算を行う。この処理を繰り返すことで、演算処理装置は、畳み込み演算を行うことができる。例えば、４ＳＩＭＤの演算処理の場合、１回のＳＩＭＤ演算に用いられるレジスタは４つである。演算処理装置は、ＳＩＭＤ演算においてレジスタへのデータの格納を行う場合、ＳＩＭＤのロード命令を用いて１度にＳＩＭＤレジスタの全てのレジスタにデータを格納する。
【００１１】
ここで、畳み込み演算では、出力画像の１つの要素を求める場合に、フィルタの各要素とそれに対応する入力画像の各要素とを用いる。さらに、ＳＩＭＤを用いた畳み込み演算では、フィルタの範囲をずらしながら、繰り返し演算が行われるため、並行する畳み込み演算の中で、同じデータが何度も用いられる。
【００１２】
従来、畳み込み演算では、１つのフィルタの配置状態毎に、各要素の乗算及び乗算結果の合計がまとめて行われる。そのため、ＳＩＭＤを用いた場合のように複数の演算器で並行して計算を行う場合、処理速度を向上するため、計算順の調整を行い同じデータの使用を回避することや同じデータのコピーを用意して同時に使用することが行われる。
【００１３】
例えば、畳み込み演算に関する技術としては、１ライン毎に乗算器を設け、各ラインの重みを格納するシフトレジスタを設け、値をシフトさせて順次乗算を行い、乗算結果を加算する従来技術がある。また、隣接するライン同士が乗算器を共有するように、各ラインに対応させて乗算器を設け、畳み込み演算を行う従来技術がある。また、メモリのラインデータを格納する領域と重みデータを格納する領域とに分け、メモリ領域を循環させて演算を行う従来技術がある。また、乗算器の出力を他の乗算器に渡して演算を行う従来技術がある。さらに、計算式を簡略化することで乗算器及び加算器を削減した従来技術がある。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特開２０１０−１３４６９７号公報
【特許文献２】特開２０１５−２１０７０９号公報
【特許文献３】特開２００８−３１０７００号公報
【特許文献４】特開２０１２−２０５２９８号公報
【特許文献５】特開２００１−６７３３８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、同じデータの読み出しを回避するために計算順の調整を行う場合、使用するデータを決めるために乗算や除算が用いられる。乗算や除算は加算や減算と比較して、演算により多くのサイクル数を消費するため、計算コストが高い。そして、乗算や除算の演算中には、演算器が毎サイクル動作できないおそれがある。このため、計算順の調整を行うことで、演算の処理速度が低下するおそれがある。また、同じデータの読み出しを回避するためにデータのコピーを用意する場合、同時に使用されないようなデータの並び替えが煩雑になる可能性やコピーするデータ数が増えるおそれがある。例えば、フィルタの１度の移動距離が２列２行以上の場合、読み出すデータが各演算器でばらばらになるため、上記の問題が発生する。すなわち、１つのフィルタの配置状態毎にまとめて演算を行う処理方法を用いた場合、処理速度を向上させるには多くの計算コストがかかるおそれがある。
【００１６】
また、異なるデータを使用する場合でも、レジスタにデータを移動する方法によってはレジスタからデータを読み出せない状態になる場合もある。例えば、２つの演算器が同じタイミングで同じレジスタからデータを読み出そうとした場合、データの読み出しが困難となることが考えられる。そのため、演算の処理速度が低下するおそれがある。
【００１７】
さらに、バックワード処理では、入力データが小さく出力データが多いため、同じデータを使って実施する演算の回数が多い。そこで、より多くの演算器を使用して計算することで処理を効率的に行うことができるが、単に演算器を増やして従来の方法で演算を行った場合、多数の演算器へ効率的にデータ供給を行うことは困難である。
【００１８】
開示の技術は、上記に鑑みてなされたものであって、コストの増加を抑えつつ演算処理速度を向上させる演算処理装置及び演算処理装置の制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１９】
本願の開示する演算処理装置及び演算処理装置の制御方法の一つの態様において、データ格納部は、行列に含まれる要素データを有する第１データ及び第２データをそれぞれ格納する。演算部は、複数配置される。第１格納部は、前記演算部毎に配置され、前記データ格納部に格納された前記第１データの第１所定行を格納する。第２格納部は、前記演算部毎に配置され、前記データ格納部に格納された前記第２データの第２所定行を格納する。積和演算部は、前記演算部毎に複数配置された各々が前記第１所定行に含まれるそれぞれ異なる第１要素データを前記第１格納部から取得し、且つ、前記第２所定行に含まれる同じ第２要素データを前記第２格納部から取得し、取得した前記第１要素データ及び前記第２要素データを用いて演算を行う処理を所定回数行うことで、前記第１データの１行分の演算である行分演算を行なった結果を基に前記第１データと前記第２データとを用いた演算を実行する。
【発明の効果】
【００２０】
１つの側面では、本発明は、コストの増加を抑えつつ演算処理速度を向上させることができる。
【図面の簡単な説明】
【００２１】
【図１】図１は、深層学習の全体的な流れを説明するための図である。
【図２】図２は、畳み込みフォワード演算及びバックワード演算を説明するための図である。
【図３】図３は、演算処理装置のブロック図である。
【図４】図４は、演算部の詳細を表すブロック図である。
【図５】図５は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。
【図６】図６は、畳み込みバックワードの重み差分演算時の要素データの読み出しを説明するための図である。
【図７Ａ】図７Ａは、畳み込みバックワードの重み差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。
【図７Ｂ】図７Ｂは、畳み込みバックワードの重み差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。
【図８Ａ】図８Ａは、畳み込みバックワードの重み差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。
【図８Ｂ】図８Ｂは、畳み込みバックワードの重み差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。
【図９】図９は、畳み込みバックワードの重み差分演算における１回目の計算における演算部を表す図である。
【図１０】図１０は、畳み込みバックワードの重み差分演算における２回目の計算における演算部を表す図である。
【図１１】図１１は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。
【図１２】図１２は、畳み込みバックワードのボトム差分演算時の要素データの読み出し及び格納を説明するための図である。
【図１３Ａ】図１３Ａは、畳み込みバックワードのボトム差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。
【図１３Ｂ】図１３Ｂは、畳み込みバックワードのボトム差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。
【図１３Ｃ】図１３Ｃは、畳み込みバックワードのボトム差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。
【図１４Ａ】図１４Ａは、畳み込みバックワードのボトム差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。
【図１４Ｂ】図１４Ｂは、畳み込みバックワードのボトム差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。
【図１５】図１５は、ストライド数が１の場合の畳み込みバックワードのボトム差分演算の１行目の計算時の演算部を表す図である。
【図１６】図１６は、ストライド数が１の場合の畳み込みバックワードの重み差分演算における２行目の計算における演算部を表す図である。
【図１７】図１７は、ストライド数が２の場合の畳み込みバックワードのボトム差分演算における１行目の計算における演算部を表す図である。
【図１８】図１８は、ストライド数が１の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。
【図１９】図１９は、ストライド数が２の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。
【図２０】図２０は、畳み込みバックワードの重み差分演算のフローチャートである。
【図２１】図２１は、畳み込みバックワードのボトム差分演算のフローチャートである。
【図２２】図２２は、複数の演算部によるボトムデータ及びトップデータの指定を説明するための図である。
【図２３】図２３は、複数の演算部を用いた場合の畳み込み演算全体のフローチャートである。
【図２４】図２４は、複数の演算部を用いた畳み込みフォワード演算のプログラムの記述例を説明するための図である。
【図２５】図２５は、複数の演算部を用いた場合の畳み込みバックワードの重み差分演算のプログラムの記述例を説明するための図である。
【図２６】図２６は、複数の演算部を用いた場合の畳み込みバックワードのボトム差分演算のプログラムの記述例を説明するための図である。
【図２７】図２７は、演算処理装置のハードウェア構成図である。
【発明を実施するための形態】
【００２２】
以下に、本願の開示する演算処理装置及び演算処理装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理装置の制御方法が限定されるものではない。
【実施例】
【００２３】
図１は、深層学習の全体的な流れを説明するための図である。ここで、本実施例では、画像認識のための深層学習について説明する。以下では、畳み込み演算を例に説明するが、ニューラルネットワークの各層で行われる演算は畳み込み演算以外の演算もある。
【００２４】
図１に示すように、演算処理装置１は、入力データ１０の入力を受ける。そして、演算処理装置１は、複数の演算処理層を有する。各演算処理層では、それぞれ異なる特徴点の抽出などの演算処理を行う。演算処理装置１は、取得した入力データ１０に対して第１層である演算処理層１０１で重みデータを用いて畳み込み演算を実行する。ここで、重みデータは、フィルタにあたる。次に、演算処理装置１は、演算処理層１０１からの特徴量でもある出力データ２０に対して第２層である演算処理層１０２で重みデータを用いて畳み込み演算を行う。演算処理装置１は、このように各層での演算処理を順次行っていき、第ｎ層である演算処理層１０３での重みデータを用いた畳み込み演算の演算結果を特徴量でもある出力データ２０として出力する。このようにして、例えば、入力データ１０を入力画像とすれば、各層での出力データ２０は、画像認識のための特徴量として取得でき、各層で取得した特徴量を用いて繰り返しパラメータ更新する深層学習をさせることで、画像認識の精度は向上し、演算処理装置１は、画像認識を行うことができる。また、例えば、音声認識の場合には、入力データ１０は、音声データ、テキストマイニングの場合には入力データ１０は単語となる。ここで説明した、演算処理装置１による矢印Ｐ１へ向かう方向の畳み込み演算による演算処理は、「畳み込みフォワード演算」と呼ばれる場合がある。
【００２５】
さらに、演算処理装置１は、各層における特徴点の抽出の精度を上げるために、期待値の差分を用いて重みデータの変更を行う。例えば、演算処理装置１は、予め決められた期待値を有し、第ｎ層である演算処理層１０３からの出力データ２０と期待値とを比較する。そして、演算処理装置１は、出力データ２０と期待値との差分を求め、その求めた差分及びｎ−１層からの入力データ１０を用いて重みデータの期待値との差分を求める。さらに、演算処理装置１は、求めた重みデータの期待値との差分を用いて重みデータを修正する。そして、演算処理装置１は、修正した重みデータ及び出力データ２０と期待値との差分を用いて第ｎ−１層における重みデータを修正するためのデータであるトップ差分データを求める。次に、演算処理装置１は、ｎ−２層からの入力データ１０に対して、求めた第ｎ−１層の出力データ２０と第ｎ−１層における出力の期待値との差分を用いて第ｎ−１層の重みデータを修正する。
【００２６】
ここで、矢印Ｐ１方向を各層の並び方向とすると、演算処理装置１は、特定の演算処理層の１つ前の演算処理層において特定の演算処理層におけるトップ差分データを算出する。そして、演算処理装置１は、算出した特定の演算処理層におけるトップ差分データと１つ前の演算処理装置１からの出力データ２０とを用いて、特定の演算処理層における重みデータの期待値との差分を求める。さらに、演算処理装置１は、求めた特定の演算処理層における重みデータの期待値との差分を用いて重みデータを修正する。その後、演算処理装置１は、修正した特定の演算処理層における重みデータと特定の演算処理層における出力データ２０と期待値との差分とを用いて、特定の演算処理層の１つ前の演算処理層におけるトップ差分データを算出する。
【００２７】
演算処理装置１は、各演算処理層における重みデータの修正及び１つ前の演算処理層におけるトップ差分データの算出を順次繰り返す。これにより、演算処理装置１は、演算処理層１０１〜１０３の全ての層の重みデータを演算処理層１０３の出力データ２０の期待値に合わせて修正することができる。ここで説明した、演算処理装置１による矢印Ｐ２へ向かう方向の各演算処理層における重みデータを修正するための演算処理は、「畳み込みバックワード演算」と呼ばれる場合がある。
【００２８】
以下では、特定の演算処理層における畳み込みフォワード演算に用いる入力データを、「ボトムデータ」という。ボトムデータは、特定の演算処理層の１つ前の演算処理層からの出力データにあたる。また、特定の演算処理層における重みデータの期待値との差分のデータを、「重み差分データ」という。また、特定の演算処理装置における畳み込みバックワード演算の演算結果のデータを「ボトム差分データ」という。さらに、特定の演算処理層において畳み込みバックワード演算において重みデータの修正に用いられる元データを、「トップ差分データ」という。ここで、特定の演算処理層における畳み込みバックワード演算の算出結果は、特定の演算処理層の１つ前の演算処理層の畳み込みバックワード演算の元データとして用いられる。すなわち、特定の演算処理層において算出されたボトム差分データは、特定の演算処理層の１つ前の演算処理層のトップ差分データにあたる。
【００２９】
また、畳み込みバックワード演算において、トップ差分データとボトムデータとを用いて重み差分データを求める演算を、「畳み込みバックワードの重み差分演算」という。さらに、修正された重みデータとトップ差分データとを用いてボトム差分データを算出する演算を、「畳み込みバックワードのボトム差分演算」という。
【００３０】
さらに、本実施例では、ボトムデータ及び重みデータを正方形に行列として並んだ要素データを有する場合で説明する。そこで、以下では、重みデータの行数及び列数を「カーネル数」あるいはカーネル数に応じた単位として「カーネルサイズ」という。ただし、ボトムデータ及び重みデータは、それぞれ長方形でもよい。また、畳み込みフォワード演算における重みデータの１回の移動量、並びに、畳み込みバックワード演算におけるトップ差分データの１回の移動量及び重みデータの１回の移動量を「ストライド数」という場合がある。また、行方向及び列方向いずれにも、ストライド数分の一回の移動が行われる。
【００３１】
図２は、畳み込みフォワード演算及びバックワード演算を説明するための図である。図２では、入力データ１０を用いて演算処理を始める第１層から出力データ２０６と期待値２０７からトップ差分データ２０３を生成する第ｎ層までを記載した。ここでは、演算処理層１０１を第１層とし、演算処理層１０４を第ｎ−１層とし、演算処理層１０３を第ｎ層として、第ｎ層まで各演算処理層１０１〜１０４における演算を例に記載した。また、図２中の円で記載した処理は演算処理を表す。演算処理Ｆ１は、畳み込みフォワード演算を表す。演算処理Ｆ２は、畳み込みバックワードの重み差分演算を表す。また、演算処理Ｆ３は、畳み込みバックワードのボトム差分演算を表す。
【００３２】
演算処理装置１は、演算処理層１０１において入力データ１０及び第１層での重みデータ２０２に対して演算処理Ｆ１で表される畳み込みフォワードを行い、演算結果２０９を算出する。その後は、図示しないが、同様に次の第２層において、前の層の演算結果２０９及び第２層での重みデータ２０２に対して同様に演算処理Ｆ１で表される畳み込みフォワード演算を行う。これらを繰り返し、最後の第ｎ層である演算処理層１０３は、同様に演算処理層１０４の演算結果２０９から取得したボトムデータ２０１及び第ｎ層での重みデータ２０２に対して演算処理Ｆ１で表される畳み込みフォワード演算を行う。さらに、演算処理層１０３は、出力データ２０６と期待値２０７とを比較して、トップ差分データ２０３を算出する。ここで、入力データ１０は、第２層〜第ｎ層におけるボトムデータ２０１にあたるため、以下では、第１層のボトムデータ２０１として扱う。また、第ｎ層の出力データ２０は、第１層〜第ｎ−１層における演算結果２０９にあたる。
【００３３】
さらに続けて、バックワード演算を説明すると、演算処理装置１は、演算処理層１０３において、トップ差分データ２０３及びボトムデータ２０１に対して演算処理Ｆ２で表される畳み込みバックワードの重み差分演算を行い、重み差分データ２０４を算出する。さらに、演算処理装置１は、重み差分データ２０４を用いて重みデータ２０２を更新する。ここで、図２における破線の矢印が重みデータ２０２の更新の処理を表す。具体的には、演算処理装置１は、重み差分データ２０４に学習率を乗算して、新たな重みデータ２０２を算出する。
【００３４】
また、演算処理装置１は、フォワード演算で使用した重みデータ２０２及びトップ差分データ２０３に対して演算処理Ｆ３で表される畳み込みバックワードのボトム差分演算を行い、ボトム差分データ２０５を算出する。
【００３５】
ここで、図２では、最後の層である演算処理層１０３を例に図示したが、他の層においても同様の演算が行われる。ただし、他の層では、演算処理装置１は、トップ差分データ２０３として１つ後の層で算出されたボトム差分データ２０５を用いる。
【００３６】
次に、図３を参照して、演算処理装置１の詳細について説明する。図３は、演算処理装置のブロック図である。図３に示すように、演算処理装置１は、記憶装置としてのメモリ１１、第１データ制御部１２、第２データ制御部１３、レジスタファイル（ＲＦ：Register  File）４１１〜４１３，４２１〜４２３及び４３１〜４３３を有する。また、演算処理装置１は、演算部５１〜５３及びポインタ制御部１６を有する。
【００３７】
ここで、レジスタファイル４１１〜４１３は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル４１１〜４１３を区別しない場合、「レジスタファイル４１０」という。また、レジスタファイル４２１〜４２３は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル４２１〜４２３を区別しない場合、「レジスタファイル４２０」という。また、レジスタファイル４３１〜４３３は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル４３１〜４３３を区別しない場合、「レジスタファイル４３０」という。また。演算部５１〜５３は、いずれも同じ機能を有する。そこで、以下では、演算部５１〜５３を区別しない場合、「演算部５０」という。
【００３８】
メモリ１１は、計算に用いる各種データを格納する記憶部である。例えば、メモリ１１は、ボトムデータ２０１及び重みデータ２０２を格納する。さらに、メモリ１１は、後述する演算部５１〜５３により算出されたトップ差分データ２０３及び重み差分データ２０４も格納する。
【００３９】
レジスタファイル４１０，４２０及び４３０は、演算時に演算に用いるデータが一時的に格納される記憶部である。レジスタファイル４１０，４２０及び４３０は、本実施例では、各演算部５０にそれぞれ１つずつの３つが割り当てられる。
【００４０】
レジスタファイル４１０は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる一方のデータを格納する。また、レジスタファイル４２０は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる他方のデータを格納する。さらに、レジスタファイル４３０は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算における演算結果が格納される。
【００４１】
第１データ制御部１２は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ１１からデータを読み出し、各演算部５０に対応するレジスタファイル４１０それぞれに格納する。
【００４２】
第１データ制御部１２は、畳み込みフォワード演算の場合、演算に用いるボトムデータ２０１の要素データをメモリ１１から読み込み、各演算部５０に対応するレジスタファイル４１０それぞれに格納する。
【００４３】
畳み込みバックワードの重み差分演算の場合、第１データ制御部１２は、読み込みを開始する行の先頭位置の指定を受ける。そして、第１データ制御部１２は、指定された先頭位置からボトムデータ２０１の要素データを１行ずつメモリ１１から読み込み、各演算部５０に対応するレジスタファイル４１０に格納する。
【００４４】
ここで、畳み込みバックワード演算を行う場合、トップ差分データ２０３は、その１行１列の位置をボトムデータ２０１の１行１列の位置に合わせた位置から行方向にストライド数ずつ移動される。以下では、１行１列を一致させた位置を初期位置という。そして、トップ差分データ２０３は、カーネル数にストライド数の整数倍を足した数でボトムデータ２０１の行数より大きく且つ最小の数となる場合の整数倍に用いた数まで、ボトムデータ２０１の初期位置から行方向にストライド数ずつ移動される。以下では、カーネル数にストライド数の整数倍を足した数でボトムデータ２０１の行数より大きく且つ最小の数となる場合の整数倍に用いた数を、「最大移動数」という。
【００４５】
第１データ制御部１２は、ボトムデータ２０１の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納を、レジスタファイル４１０の数分まで繰り返す。ただし、レジスタファイル４１０の個数が最大移動数分以上ある場合、第１データ制御部１２は、最大移動数分行うと、要素データの読込及びレジスタファイル４１０への格納を終了する。
【００４６】
次に、レジスタファイル４１０に格納した要素データを用いた演算が完了した後、第１データ制御部１２は、行分演算の終了の通知を演算部５０から受ける。そして、第１データ制御部１２は、先頭位置をストライド数分列方向に移動させ、ボトムデータ２０１の要素データの１行ずつのメモリ１１からの読み込み及びレジスタファイル４１０への格納を行う。ボトムデータ２０１とトップ差分データ２０３とが正方形である場合、列方向にストライド数分ずつ初期位置からトップ差分データ２０３を移動させると、最大移動数の回数の移動を行うと、トップ差分データ２０３は、ボトムデータ２０１からはみ出す。そこで、第１データ制御部１２は、最大移動数の回数、ボトムデータ２０１の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納を繰り返す。
【００４７】
第１データ制御部１２は、ボトムデータ２０１の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納が、最大移動数回終了していない場合、同様の処理を最大移動数の回数に達するまで繰り返す。
【００４８】
また、畳み込みバックワードのボトム差分演算の場合、第１データ制御部１２は、読み込みを開始する行の先頭位置の指定を受ける。そして、第１データ制御部１２は、トップ差分データ２０３の要素データを１行ずつ読み込み、各演算部５０に対応するそれぞれのレジスタファイル４１０に格納する。
【００４９】
第１データ制御部１２は、トップ差分データ２０３の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納を、レジスタファイル４１０の個数分繰り返す。ただし、レジスタファイル４１０の個数がトップ差分データ２０３の行数分以上ある場合、第１データ制御部１２は、行数分行うと、要素データの読込及びレジスタファイル４１０への格納を終了する。
【００５０】
次に、レジスタファイル４１０に格納した要素データを用いた演算が終了した後、第１データ制御部１２は、行分演算の終了の通知を演算部５０から受ける。そして、第１データ制御部１２は、先頭位置を１行下の行に移動させ、トップ差分データ２０３の要素データを１行ずつのメモリ１１からの読み込み及びレジスタファイル４１０への格納を行う。第１データ制御部１２は、重みデータ２０２の行数、トップ差分データ２０３の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納を繰り返す。
【００５１】
第１データ制御部１２は、トップ差分データ２０３の要素データの１行ずつの読み込み及びレジスタファイル４１０への格納が、最大移動数回終了していない場合、同様の処理を最大移動回数に達するまで繰り返す。
【００５２】
第２データ制御部１３は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ１１からデータを読み出し、各演算部５０に対応するレジスタファイル４２０に格納する。
【００５３】
第２データ制御部１３は、畳み込みフォワード演算の場合、演算に用いる重みデータ２０２の要素データを、配置されたレジスタファイル４２０の数分だけメモリ１１から読み込む。そして、第２データ制御部１３は、読み込んだ要素データを各演算部５０に対応するレジスタファイル４２０に格納する。
【００５４】
また、畳み込みバックワードの重み差分演算の場合、第２データ制御部１３は、要素データの読み込みの先頭位置としてトップ差分データ２０３の先頭の指定を受ける。そして、第２データ制御部１３は、指定された先頭位置から１行分のトップ差分データ２０３の要素データを、配置されたレジスタファイル４２０の数分だけメモリ１１から読み込む。そして、第２データ制御部１３は、読み込んだ要素データを各演算部５０に対応するレジスタファイル４２０に格納する。すなわち、第２データ制御部１３は、各演算部５０に対応するレジスタファイル４２０の全てに同じ要素データを格納する。
【００５５】
レジスタファイル４２０に格納した要素データを用いた演算が終了した後、第２データ制御部１３は、行分演算の終了の通知を演算部５０から受ける。そして、第２データ制御部１３は、トップ差分データ２０３における読み込みの先頭位置を１行下の行の先頭に移動する。そして、第２データ制御部１３は、先頭位置から１行分のトップ差分データ２０３の要素データを、配置されたレジスタファイル４２０の数分までメモリ１１から読み込み、レジスタファイル４２０に格納する。第２データ制御部１３は、先頭位置からの１行分の要素データの読み込み及びレジスタファイル４２０への格納を繰り返す。
【００５６】
第２データ制御部１３は、最大移動数の回数、要素データの読み込み及びレジスタファイル４２０への格納を行った時点で、演算処理が終了していない場合、トップ差分データ２０３における読み込みの先頭位置をトップ差分データ２０３の先頭に移動する。そして、第２データ制御部１３は、演算処理が終了するまで、同様の処理を繰り返す。
【００５７】
また、畳み込みバックワードのボトム差分演算の場合、第２データ制御部１３は、要素データの読み込みの先頭位置として重みデータ２０２の先頭の指定を受ける。そして、第２データ制御部１３は、指定された先頭位置から１行分の重みデータ２０２の要素データを、配置されたレジスタファイル４２０の数分までメモリ１１から読み込む。そして、第２データ制御部１３は、読み込んだ要素データを各演算部５０に対応するレジスタファイル４２０に格納する。すなわち、第２データ制御部１３は、各演算部５０に対応するレジスタファイル４２０の全てに同じ要素データを格納する。
【００５８】
レジスタファイル４２０に格納した要素データを用いた演算が終了した後、第２データ制御部１３は、行分演算の終了の通知を演算部５０から受ける。そして、第２データ制御部１３は、重みデータ２０２における読み込みの先頭位置を１行下の行の先頭に移動する。そして、第２データ制御部１３は、先頭位置から１行分の重みデータ２０２の要素データを、配置されたレジスタファイル４２０の数分までメモリ１１から読み込み、レジスタファイル４２０に格納する。第２データ制御部１３は、先頭位置からの１行分の要素データの読み込み及びレジスタファイル４２０への格納を繰り返す。
【００５９】
第２データ制御部１３は、最大移動数の回数、要素データの読み込み及びレジスタファイル４２０への格納を行った時点で、演算処理が終了していない場合、重みデータ２０２における読み込みの先頭位置を重みデータ２０２の先頭に移動する。そして、第２データ制御部１３は、演算処理が終了するまで、同様の処理を繰り返す。
【００６０】
演算部５０は、レジスタファイル４１０及び４２０に格納された要素データを用いて、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算を実行し、演算結果をレジスタファイル４３０に格納する。図４は、演算部の詳細を表すブロック図である。
【００６１】
図４に示すように、演算部５０は、並列に配置されたＦＭＡの演算を行う積和演算部５０１〜５０３を有する。各積和演算部５０１〜５０３は、異なる計算経路を形成する。演算部５０は、行う演算に合わせて使用する積和演算部５０１〜５０３の数を変更することができる。また、レジスタファイル４３０は、積和演算部５０１〜５０３に対応するレジスタファイル３０１〜３０３を有する。以下に、演算部５０による畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算の詳細を説明する。
【００６２】
畳み込みバックワードの重み差分演算の場合、演算部５０は、算出する重みデータ２０２のカーネル数の積和演算部５０１〜５０３を使用して以下の演算を繰り返す。積和演算部５０３は、重みデータ２０２のカーネル数個目の積和演算部である。この場合、レジスタファイル４１０には、ボトムデータ２０１の１行分のデータが行の先頭から順に格納される。また、レジスタファイル４２０には、トップ差分データ２０３の１行分のデータが行の先頭から順に格納される。
【００６３】
演算部５０は、レジスタファイル４１０に格納されたボトムデータ２０１における先頭ポインタの位置の指定をポインタ制御部１６から受ける。より詳しくは、演算部５０は、最初にレジスタファイル４１０に格納されたボトムデータ２０１の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部１６から受ける。その後、演算部５０は、１回の積和演算を計算する毎に、レジスタファイル４１０に格納されたボトムデータ２０１の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部１６から順次受ける。演算部５０は、行の最後の要素データからカーネル数前の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部１６から受ける。
【００６４】
積和演算部５０１は、レジスタファイル４１０におけるポインタ制御部１６により指定された先頭ポインタの位置のボトムデータ２０１の要素データを読み込む。続いて、積和演算部５０２〜５０３は、順次先頭ポインタから１つずつ進めた位置のボトムデータ２０１の要素データを読み込む。具体的には、また、積和演算部５０２は、先頭ポインタの位置から１つ進めた位置のボトムデータ２０１の要素データを読み込む。また、積和演算部５０３は、先頭ポインタの位置からカーネル数分進めた位置のボトムデータ２０１の要素データを読み込む。
【００６５】
また、演算部５０は、レジスタファイル４２０に格納されたトップ差分データ２０３における先頭ポインタの位置の指定をポインタ制御部１６から受ける。より詳しくは、演算部５０は、最初にレジスタファイル４２０に格納されたトップ差分データ２０３の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部１６から受ける。その後、演算部５０は、１回の積和演算を計算する毎に、レジスタファイル４２０に格納されたトップ差分データ２０３の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部１６から順次受ける。演算部５０は、行の最後の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部１６から受ける。
【００６６】
積和演算部５０１〜５０３は、レジスタファイル４２０におけるポインタ制御部１６により指定された先頭ポインタの位置のトップ差分データ２０３の要素データを読み込む。すなわち、積和演算部５０１〜５０３は、同じトップ差分データ２０３の要素データを読み込む。
【００６７】
そして、積和演算部５０１〜５０３は、読み込んだボトムデータ２０１の要素データとトップ差分データ２０３の要素データとを乗算する。次に、積和演算部５０１〜５０３は、対応するレジスタファイル３１１〜３１３に格納されたデータを読み出す。そして、積和演算部５０１〜５０３は、読み出したデータと乗算結果を加算し、対応するレジスタファイル３１１〜３１３に格納する。ここで、レジスタファイル３１１〜３１３は、初期値として０が格納される。積和演算部５０１は、先頭ポインタが最後の位置に達するまで計算を繰り返す。
【００６８】
各レジスタファイル３１１〜３１３に格納された値が、重み差分データ２０４の１行のそれぞれの値の算出の中間値にあたる。
【００６９】
この計算により、演算部５０は、ボトムデータ２０１の１行に対してトップ差分データ２０３を先頭に重ね、その後スライド数分ずつずらしながら重なった各要素データの積を合計する積和演算を行い、各積和演算の結果の合計を求める行分演算が行える。行分演算が完了すると、演算部５０は、行分演算の完了を第１データ制御部１２及び第２データ制御部１３に送信する。その後、演算部５０は、レジスタファイル４１０及び４２０に新たに格納された要素データを用いて重み差分積和演算を繰り返す。ここで、演算部５０は、畳み込みバックワードの重み差分演算を最大移動数分行う間、各行の要素データにおいて先頭からの位置が同じ要素データを用いた重み差分積和演算の結果を、レジスタファイル４３０の同じ位置の値に加算していく。この計算を、畳み込みバックワードの重み差分演算を最大移動数の回数繰り返すことで、レジスタファイル３１１〜３１３に格納された中間値に順次値が加算され、最終的に、重み差分データ２０４の１行分の値が算出される。
【００７０】
畳み込みバックワードの重み差分演算を最大移動数分行った場合、演算部５０は、演算結果をメモリ１１が有する重み差分データ２０４に格納する。その後、全ての重み差分データ２０４の算出が終わっていなければ、演算部５０は、新たな重み差分データ２０４の要素データの算出として、同様の処理を繰り返す。
【００７１】
また、畳み込みバックワードのボトム差分演算の場合、演算部５０は、トップ差分データ２０３の列数の積和演算部５０１〜５０３を使用して以下の演算を繰り返す。積和演算部５０３は、トップ差分データ２０３の列数個目の積和演算部である。また、演算部５０は、レジスタファイル４３０の中の算出するボトム差分データ２０５の行数のレジスタファイル３０１〜３０３を用いる。
【００７２】
レジスタファイル４１０には、トップ差分データ２０３の１行分のデータが行の先頭から順に格納される。また、レジスタファイル４２０には、重みデータ２０２の１行分のデータが行の先頭から順に格納される。
【００７３】
演算部５０は、レジスタファイル４２０に格納された重みデータ２０２の行の先頭の要素データから順に計算毎にストライド数ずつ進んだ要素データを示す先頭ポインタの指定をポインタ制御部１６から受ける。また、演算部５０は、レジスタファイル４３１に格納されたボトム差分データ２０５の行の先頭から順に計算毎にストライド数ずつ進んだ要素データを示すポインタの指定をポインタ制御部１６から受ける。
【００７４】
積和演算部５０１〜５０３は、レジスタファイル４１０に格納されたトップ差分データ２０３のポインタが示す位置から順に要素データを読み込む。すなわち、積和演算部５０１〜５０３は、トップ差分データ２０３の１行分のそれぞれ異なる値を格納する。
【００７５】
また、積和演算部５０１〜５０３のうち先頭及び先頭からストライド数番目ずつの積和演算部は、レジスタファイル４２０に格納された重みデータ２０２の行の先頭から計算毎にストライド数ずつ進めた位置の要素データの読み込みを繰り返す。また、積和演算部５０１〜５０３のうち先頭のストライド数内の所定番目及びそこからストライド数番目ずつの積和演算部は、重みデータ２０２の１行のうちの先頭ポインタの位置から計算毎にストライド数ずつ進めた要素データの読み込みを計算毎に繰り返す。このように、積和演算部５０１〜５０３は、先頭からストライド数番目の１つ手前の積和演算部が、要素データを読み込むまで１つずつずらした要素データの読み込みを行う。
【００７６】
そして、積和演算部５０１〜５０３は、読み込んだトップ差分データ２０３の要素データ及び重みデータ２０２を乗算する。そして、積和演算部５０１〜５０３は、レジスタファイル４３０が有するレジスタファイル３０１〜３０３に設定された先頭ポインタから計算毎にストライド数ずつ進めたレジスタフィル３０１〜３０３からデータを取得する。言い換えれば、積和演算部５０１〜５０３は、自己に対応するレジスタファイル３０１〜３０３のうち計算回数から１を減算した数にストライド数を乗算した数番目のレジスタファイル３０１〜３０３の値を取得し、乗算結果を加算して、値の取得元に格納する。ただし、格納するレジスタファイル３０１〜３０３を表す番号が配置されたレジスタファイル３０１〜３０３の数を超えた場合、すなわち、ボトム差分データ２０５の列数を超えた場合、積和演算部５０１〜５０３は、超えた分の数番目のレジスタファイル３０１〜３０３に対して値の読み込み及び格納を行う。
【００７７】
例えば、積和演算部５０１は、１番目のレジスタファイル３０１に対応する。そこで、ストライド数１であれば、積和演算部５０１は、１回目の計算では、レジスタファイル３０１の値を取得して乗算結果を加算した値を格納し直す。２回目の計算では、積和演算部５０１は、レジスタファイル３０２の値を取得し乗算結果を加算した値を格納し直す。また、ストライド数が２であれば、１回目の計算は同じであるが、２回目の計算では、積和演算部５０１は、３番目のレジスタファイル３０１〜３０２の値を取得し乗算結果を加算した値を格納し直す。
【００７８】
積和演算部５０１〜５０３は、レジスタファイル４２０に格納されたトップ差分データ２０３の１行分の要素データ全てについて重み差分積和演算を行うまで同様の処理を繰り返し行分演算を行う。
【００７９】
この行分演算を重みデータ２０２の行数分行った場合、演算部５０は、演算結果をメモリ１１が有するボトム差分データ２０５に格納する。その後、全てのボトム差分データ２０５の算出が終わっていなければ、演算部５０は、新たなボトム差分データ２０５の要素データの算出として、同様の処理を繰り返す。
【００８０】
さらに、図１の最終層の第ｎ層である演算処理層１０３の場合、演算部５０は、出力データをモニタなどの出力装置（不図示）へ出力しユーザに演算結果を提供する。例えば、画像認識の場合、演算部５０は、認識結果を出力装置へ出力する。
【００８１】
ポインタ制御部１６、畳み込みバックワードの重み差分演算の場合、最初にレジスタファイル４１０における先頭ポインタを、レジスタファイル４１０に格納されたボトムデータ２０１の先頭に設定する。また、ポインタ制御部１６は、最初にレジスタファイル４２０におけるポインタを、レジスタファイル４２０に格納されたトップ差分データの先頭に設定する。
【００８２】
ポインタ制御部１６は、１回の演算完了の通知を受ける毎に、レジスタファイル４１０における先頭ポインタをトップ差分データ２０３の行においてストライド数分移動した位置に設定する。また、ポインタ制御部１６は、レジスタファイル４２０におけるポインタを１つ移動した位置に設定する。そして、レジスタファイル４１０における先頭ポインタの移動をボトムデータ２０１の行方向の移動数分行った場合、ポインタ制御部１６は、先頭ポインタをレジスタファイル４１０の先頭に戻す。すなわち、レジスタファイル４１０における先頭ポインタは、ボトムデータ２０１の次の行の先頭に設定される。また、ポインタ制御部１６は、レジスタファイル４２０におけるポインタをレジスタファイル４２０の先頭に戻す。すなわち、レジスタファイル４２０におけるポインタは、トップ差分データ２０３の次の行の先頭に設定される。ポインタ制御部１６は、演算部５０による畳み込みバックワードの重み差分演算が終了するまで、同様の処理を繰り返す。
【００８３】
また、畳み込みバックワードのボトム差分演算の場合、ポインタ制御部１６は、最初にレジスタファイル４２０におけるポインタを、レジスタファイル４２０に格納された重みデータ２０２の行の先頭に設定する。
【００８４】
ポインタ制御部１６は、１回の演算完了の通知を受ける毎に、レジスタファイル４２０における先頭ポインタを重みデータ２０２の行上でストライド数分移動した位置に設定する。そして、レジスタファイル４２０における先頭ポインタの移動を重みデータ２０２の行方向の移動数分行った場合、ポインタ制御部１６は、先頭ポインタをレジスタファイル４２０の先頭に戻す。すなわち、レジスタファイル４２０における先頭ポインタは、重みデータ２０２の次の行の先頭に設定される。ポインタ制御部１６は、演算部５０による畳み込みバックワードのボトム差分演算が終了するまで、同様の処理を繰り返す。
【００８５】
さらに、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算について詳細に説明する。
【００８６】
まず、図５を参照して、畳み込みバックワードの重み差分演算を実行する場合について説明する。図５は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図５では、演算処理装置１は、１２行１２列に要素データが並んだボトムデータ２０１及び８行８列に要素データが並んだトップ差分データ２０３を用いる。ボトムデータ２０１は、要素データｂ００〜ｂ１４３を有する。また、トップ差分データ２０３は、ボトムデータ２０１及び５行５列の重みデータ２０２を用いて、ストライド数が１の場合に求められたものとし、要素データｔ００〜ｔ６３を有する。さらに、重み差分データ２０４は、５行５列となり、その各要素データをｗ００〜ｗ２４と表す。
【００８７】
さらに、本実施例では、重み差分データ２０４の行数の演算部５０が用いられる。これにより、演算部５０は、行方向への移動を行うことで、全てのボトムデータ２０１に対する畳み込みバックワード重み差分演算を行うことができる。例えば、図５では、５個の演算部５１〜５３が用いられる。また、本実施例では、各演算部５０は、５つの積和演算部５１１〜５１４を有する。積和演算部５１１〜５１４は、図４における積和演算部５０１〜５０３にあたる。さらに、レジスタファイル４３１〜４３３は、それぞれ内部に５つのレジスタファイル３１０〜３１４を有する。レジスタファイル３１０〜３１４は、図４におけるレジスタファイル３０１〜３０３にあたる。
【００８８】
第１データ制御部１２は、畳み込みバックワードの重み差分演算で用いるボトムデータ２０１及びトップ差分データ２０３のサイズを予め記憶する。例えば、第１データ制御部１２は、表示装置及び入力装置を用いて設定された設定値により、ボトムデータ２０１及びトップ差分データ２０３のサイズ（あるいはカーネル数）を取得して記憶する。
【００８９】
第１データ制御部１２は、ボトムデータ２０１における先頭位置から１行分の要素データをメモリ１１から読み込む。例えば、第１データ制御部１２は、要素データｂ００〜ｂ１１のデータを読み込む。そして、第１データ制御部１２は、要素データｂ００〜ｂ１１をボトムデータ格納用のレジスタファイル４１１に格納する。
【００９０】
また、第１データ制御部１２は、ボトムデータ２０１における次の１行の要素データをメモリ１１から読み込む。そして、第１データ制御部１２は、ボトムデータ格納用のレジスタファイル４１２に読み込んだ要素データを格納する。例えば、第１データ制御部１２は、要素データｂ１２〜ｂ２３をボトムデータ格納用のレジスタファイル４１２に格納する。
【００９１】
このように、第１データ制御部１２は、重み差分データ２０４の行数、１行毎の要素データのメモリ１１から読み込み及び異なるボトムデータ格納用のレジスタファイル４１１〜４１３（以降、これを単にレジスタファイル４１１，４１２，４１３とする。）への格納を繰り返す。例えば、第１データ制御部１２は、要素データｂ４８〜ｂ５９をレジスタファイル４１３に格納する。
【００９２】
また、第２データ制御部１３は、トップ差分データ２０３における先頭位置から１行分の要素データをメモリ１１から読み込む。例えば、第２データ制御部１３は、トップ差分データ２０３の要素データｔ００〜ｔ０７をメモリ１１から読み込む。そして、第２データ制御部１３は、レジスタファイル４２１〜４２３に要素データｔ００〜ｔ０７を格納する。
【００９３】
ここで、演算部５１を例に演算部５０による計算を説明する。積和演算部５１０〜５１４は、レジスタファイル４１１に格納されたボトムデータ２０１の１行のうちの先頭ポインタが示す要素データから順にそれぞれ異なる５つの要素データｂ００〜ｂ０４を読み込む。ここで、読み込む要素データの数は、重み差分データ２０４の数である。さらに、積和演算部５１０〜５１４は、レジスタファイル４２１に格納されたトップ差分データ２０３の１行のうちの先頭ポインタが示す要素データｔ００を読み込む。そして、積和演算部５１０〜５１４は、ボトムデータ２０１の要素データとトップ差分データ２０３の要素データ２０３とを乗算する。さらに、積和演算部５１０〜５１４は、レジスタファイル４３０の中の対応するレジスタファイル３１０〜３１４に格納された値にそれぞれ乗算結果を加算する。
【００９４】
次に、レジスタファイル４１１における先頭ポインタが１つ移動される。また、レジスタファイル４１２における先頭ポインタが１つ移動される。そして、積和演算部５１０〜５１４は、それぞれレジスタファイル４１１に格納されたボトムデータ２０１の１行のうちの移動された先頭ポインタが示す要素データから５つの要素データｂ０１〜ｂ０５を読み込む。さらに、積和演算部５１０〜５１４は、レジスタファイル４２１に格納されたトップ差分データ２０３の１行のうちの更新された先頭ポインタが示す要素データｔ０１を読み込む。そして、積和演算部５１０〜５１４は、ボトムデータ２０１の要素データとトップ差分データの要素データとを乗算する。さらに、積和演算部５１０〜５１４は、レジスタファイル４３１の中の対応するレジスタファイル３１０〜３１４に格納された値にそれぞれ乗算結果を加算する。
【００９５】
このように、積和演算部５１０〜５１４は、計算毎にレジスタファイル４１１において１つずつ移動される先頭ポインタの位置から５つの要素データをそれぞれ読み込むことを繰り返す。さらに、積和演算部５１０〜５１４は、計算毎にレジスタファイル４１２において１つずつ移動される先頭ポインタが示す要素データを読み込むことを繰り返す。そして、積和演算部５１０〜５１４は、読み込んだ要素データを乗算し、乗算結果を対応するレジスタファイル３１０〜３１４に加算していくことを繰り返す。
【００９６】
これにより、積和演算部５１０は、ｂ００×ｔ００＋ｂ０１×ｔ０１＋・・・ｂ０７×ｔ０７を算出する。同様に、積和演算部５１１は、ｂ０１×ｔ００＋ｂ０２×ｔ０１＋・・・ｂ０８×ｔ０７を算出する。積和演算部５１２は、ｂ０２×ｔ００＋ｂ０３×ｔ０１＋・・・ｂ０９×ｔ０７を算出する。同様に、積和演算部５１３は、ｂ０３×ｔ００＋ｂ０４×ｔ０１＋・・・ｂ１０×ｔ０７を算出する。そして、積和演算部５１４は、ｂ０４×ｔ００＋ｂ０５×ｔ０１＋・・・ｂ０１１×ｔ０７を算出する。レジスタファイル３１０〜３１４には、重み差分データ２０４の要素データｗ００〜ｗ０５の計算途中の中間値が格納される。
【００９７】
演算部５２〜５３も、演算部５１と同様の重み差分積和演算を行い、演算結果であるｗ０６〜０９，・・・，ｗ２０〜ｗ２４の中間値をそれぞれ演算結果格納用のレジスタファイル４３２〜４３３に格納する。
【００９８】
次に、第１データ制御部１２により、レジスタファイル４１１には、ストライド数分先の行の要素データｂ１２〜ｂ２３が格納され、レジスタファイル４１２には、ストライド数分先の行の要素データｂ２４〜ｂ３５が格納され、レジスタファイル４１３には、要素データｂ３６〜ｂ４７が格納される。また、第２データ制御部１３により、レジスタファイル４２１〜４２３には、要素データｔ０８〜ｔ１５が格納される。
【００９９】
演算部５１は、１回目と同様に、レジスタファイル４１１に格納された要素データｂ１２〜ｂ２３とレジスタファイル４２１に格納された要素データｔ０８〜ｔ１５とを用いて畳み込みバックワードの重み差分演算を行う。積和演算部５１０〜５１４は、対応するレジスタファイル３１０〜３１４に格納された値に算出結果を足し込んでいくことで、重み差分データ２０４の要素データｗ００〜ｗ０５の中間値を更新する。演算部５２〜５３も、演算部５１と同様の重み差分積和演算を行い、演算結果を足し込んでいくことで、演算結果としてレジスタファイル４３２〜４３３に格納された重み差分データ２０４の要素データｗ０６〜０９，・・・，ｗ２０〜ｗ２４の中間値を更新する。
【０１００】
このように、第１データ制御部１２は、ボトムデータ２０１の先頭の行から順にストライド数ずつ先の行の要素データをレジスタファイル４１０に格納する。また、第２データ制御部１３は、トップ差分データ２０３の先頭の行から順に１行ずつ要素データをレジスタファイル４２０に格納する。同様に、第１データ制御部１２及び第２データ制御部１３は、１行ずつずらした行を先頭にしてレジスタファイル４１１〜４１３及び４２１〜４２３に各要素データを格納する。そして、演算部５１〜５３は、レジスタファイル４１１〜４１３及び４２１〜４２３に格納された要素データを用いて重み差分演算を実行する。これにより、レジスタファイル４３１〜４３３それぞれのレジスタファイル３１１〜３１３に重み差分データ２０４の要素データｗ００〜ｗ２４が格納される。各演算部５１〜５４は、算出したレジスタファイル４３１〜４３３それぞれのレジスタファイル３１１〜３１３の値を、メモリ１１に重み差分データ２０４の要素データｗ００〜ｗ２４として格納する。
【０１０１】
ここで、図６を参照して、図５における畳み込みバックワードの重み差分演算時のレジスタファイル４１１からの要素データの読み出しについて詳細に説明する。図６は、畳み込みバックワードの重み差分演算時の要素データの読み出しを説明するための図である。状態４６１〜４６８はそれぞれ、演算部５１による、ボトムデータ２０１の最初の１列を読み込んだ際の１〜８回目の計算時の状態を表す。ここでは、一例として、レジスタファイル４１１が、配列４５０〜４５４という５列の配列を有する。
【０１０２】
積和演算部５１０〜５１４がレジスタファイル４１１から所望の要素データを読み出すためには、実際には、図６に示すクロスバスイッチ４７０が配置される。そして、図６における状態４６１〜４６８は、要素データｂ００〜ｂ１１がレジスタファイル４１１に格納された場合の１〜８回目の計算時のそれぞれの状態を表す。
【０１０３】
各状態４６１〜４６８では、ポインタ制御部１６は、太枠で囲んだ要素データの先頭に先頭ポインタを配置する。そして、各状態４６１〜４６８において太枠で囲んだ要素データがその計算において読み出される要素データとなる。
【０１０４】
状態４６１で示される１回目の計算では、ポインタ制御部１６は、要素データｂ００に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ００を配列４５０から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０１を配列４５１から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０２を配列４５２から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０３を配列４５３から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０４を配列４５４から取得する。
【０１０５】
状態４６２で示される２回目の計算では、ポインタ制御部１６は、先頭ポインタを１つ進め要素データｂ０１に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０１を配列４５１から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０２を配列４５２から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０３を配列４５３から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０４を配列４５４から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０５を配列４５０から取得する。
【０１０６】
状態４６３で示される３回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０２に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０２を配列４５２から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０３を配列４５３から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０４を配列４５４から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０５を配列４５０から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０６を配列４５１から取得する。
【０１０７】
状態４６４で示される４回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０３に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０３を配列４５３から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０４を配列４５４から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０５を配列４５０から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０６を配列４５１から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０７を配列４５２から取得する。
【０１０８】
状態４６５で示される５回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０４に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０４を配列４５４から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０５を配列４５０から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０６を配列４５１から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０７を配列４５２から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０８を配列４５３から取得する。
【０１０９】
状態４６６で示される６回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０５に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０５を配列４５０から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０６を配列４５１から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０７を配列４５２から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０８を配列４５３から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ０９を配列４５４から取得する。
【０１１０】
状態４６７で示される７回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０６に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０６を配列４５１から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０７を配列４５２から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０８を配列４５３から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ０９を配列４５４から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ１０を配列４５０から取得する。
【０１１１】
状態４６８で示される８回目の計算では、ポインタ制御部１６は、先頭ポインタをさらに１つ進め要素データｂ０７に先頭ポインタを配置する。積和演算部５１０は、先頭ポインタが示す要素データｂ０７を配列４５２から取得する。積和演算部５１１は、先頭ポインタから２番目の要素データｂ０８を配列４５３から取得する。積和演算部５１２は、先頭ポインタから３番目の要素データｂ０９を配列４５４から取得する。積和演算部５１３は、先頭ポインタから４番目の要素データｂ１０を配列４５０から取得する。積和演算部５１４は、先頭ポインタから５番目の要素データｂ１１を配列４５１から取得する。
【０１１２】
このように、５つの配列４５０〜４５４を用いることで、積和演算部５１０〜５１４は、異なる配列４５０〜４５４から要素データを読み出すため、コンフリクトを起さず要素データを読み出すことができる。そして、積和演算部５１０〜５１４は、状態４６１〜４６８で読み込んだ要素データを用いて積和演算を行うことで、１行分の積和演算を実行する。
【０１１３】
ここで、図７Ａ、７Ｂ、８Ａ及び８Ｂを参照して、レジスタファイル４１０及び４２０に格納される要素データの遷移について説明する。図７Ａ及び７Ｂは、畳み込みバックワードの重み差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。また、図８Ａ及び８Ｂは、畳み込みバックワードの重み差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。ここでは、演算部５１〜５３が５つ存在し、それぞれが５つの積和演算部５１０〜５１４を有する場合で説明する。演算部５３は、５番目の演算部とする。また、レジスタファイル４１１〜４１３は、演算部５１〜５３に対応して５つ存在する場合で説明する。レジスタファイル４１３は、５番目のレジスタファイルとする。この場合も、１２行１２列のボトムデータ２０１及び５行５列の重みデータ２０２を用いて畳み込みフォワード演算を行い算出したトップ差分データ２０３を使用する。
【０１１４】
ストライド数が１の場合、最初に、図７Ａの状態４７１に示すように、レジスタファイル４１１には、要素データｂ００〜ｂ１１が格納される。また、レジスタファイル４１２には、要素データｂ１２〜ｂ２３が格納される。また、レジスタファイル４１３には、要素データｂ４８〜ｂ５９が格納される。さらに、レジスタファイル４２１〜４２３には、要素データｔ００〜ｔ０７が格納される。
【０１１５】
演算部５１の積和演算部５１０は、計算毎に要素データｂ００〜ｂ０７をレジスタファイル４１１から順次読み込む。また、演算部５１の積和演算部５１１は、計算毎に要素データｂ０１〜ｂ０８をレジスタファイル４１１から順次読み込む。また、演算部５１の積和演算部５１４は、計算毎に要素データｂ０４〜ｂ１１をレジスタファイル４１１から順次読み込む。演算部５２〜５３のそれぞれの各積和演算部５１０〜５１４も同様に対応するレジスタファイル４１２〜４１３から要素データを読み込む。さらに、演算部５１〜５３の各積和演算部５１０〜５１４は、それぞれ対応するレジスタファイル４２１〜４２３から要素データｔ００〜ｔ０７を計算毎に順次読み込む。そして、演算部５１〜５３の各積和演算部５１０〜５１４は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
【０１１６】
次に、状態４７１の演算が終了すると、状態４７２に示すように、レジスタファイル４１１〜４１３には、状態４７１で格納されていた要素データの次の１行分の要素データが格納される。また、状態４７２に示すように、レジスタファイル４２１〜４２３には、状態４７１で格納されていた要素データの次の１行分の要素データが格納される。そして、演算部５１〜５３の各積和演算部５１０〜５１４は、状態４７１と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態４７１の計算結果に加算していく。
【０１１７】
このように、演算が終了する毎に、前の状態で格納されていた要素データの次の１行分の要素データがレジスタファイル４１１〜４１３及び４２１〜４２３に格納される。そして、演算部５１〜５３の各積和演算部５１０〜５１４は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
【０１１８】
トップ差分データ２０３は、８行８列であり、トップ差分データ２０３の１行を用いた演算を８行分行うことで１つの重み差分データ２０４を算出することができる。そこで、８回の演算をおこなうことで、演算部５１〜５３は、重み差分データ２０４の全ての要素を算出できる。そこで、状態４７４は、８回目の計算時の状態を表す。
【０１１９】
ここで、算出される重み差分データ２０４の各要素データを、ボトムデータ２０１やトップ差分データ２０３と同様に、１行１列目から順にｗ００〜ｗ２４とする。演算部５１の積和演算部５１０は、状態４７１〜４７４までの８回の演算結果を順次加算していくことで、初期位置にトップ差分データ２０３を配置した状態の重み差分データ２０４の要素データｗ００を算出する。また、演算部５１の積和演算部５１１は、初期位置からトップ差分データ２０３を１列ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０１を算出する。また、演算部５１の積和演算部５１２は、トップ差分データ２０３を初期位置から２列ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０２を算出する。また、演算部５１の積和演算部５１３は、トップ差分データ２０３を初期位置から３列ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０３を算出する。また、演算部５１の積和演算部５１４は、トップ差分データ２０３を初期位置から４列ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０４を算出する。トップ差分データ２０３を初期位置から４列ずらした位置は、言い換えれば、トップ差分データ２０３の８列目とボトムデータ２０１の１２列目とが一致する位置である。以上のことから、演算部５１は、初期位置からトップ差分データ２０３を行方向に移動させることで算出される重み差分データ２０４の要素データｗ００〜ｗ０４を算出する。
【０１２０】
同様に、演算部５２は、初期位置から１列下げた位置からトップ差分データ２０３を列方向に移動させることで算出される重み差分データ２０４の要素データｗ０５〜ｗ０９を算出する。そして、演算部５３は、初期位置から４列下げた位置からトップ差分データ２０３を列方向に移動させることで算出される重み差分データ２０４の要素データｗ２０〜ｗ２４を算出する。初期位置から４列下げた位置は、言い換えれば、トップ差分データ２０３の８行目とボトムデータ２０１の１２行目とが一致する位置である。
【０１２１】
このように、図７Ａ及び７Ｂに記載した状態４７１〜４７４における演算が終了した時点で、演算部５１〜５３は、重み差分データ２０４の全ての要素データｗ００〜ｗ２４を算出し終え、畳み込みバックワードの重み差分演算が完了する。
【０１２２】
また、ストライド数が２の場合、ボトムデータ２０１が１２行１２列であり、重みデータ２０２が５行５列でカーネルが５であるとすると、トップ差分データ２０３は、４行４列となる。
【０１２３】
この場合、最初に、図８Ａの状態４８１に示すように、レジスタファイル４１１には、要素データｂ００〜ｂ１１が格納される。また、レジスタファイル４１２には、要素データｂ１２〜ｂ２３が格納される。また、レジスタファイル４１３には、要素データｂ４８〜ｂ５９が格納される。さらに、レジスタファイル４２１〜４２３には、要素データｔ００〜ｔ０３が格納される。
【０１２４】
演算部５１の積和演算部５１０は、スライド数が２であるので、計算毎に先頭ポインタが示す要素データｂ００から１つ飛びでｂ０２、ｂ０４及びｂ０６をレジスタファイル４１１から順次読み込む。また、演算部５１の積和演算部５１１は、計算毎に先頭ポインタの次の要素データｂ０１から１つ飛びでｂ０３、ｂ０５、ｂ０７をレジスタファイル４１１から順次読み込む。また、演算部５１の積和演算部５１４は、計算毎に先頭ポインタから４つ先の要素データｂ０４、ｂ０６、ｂ０８、ｂ１０をレジスタファイル４１１から順次読み込む。演算部５２〜５３のそれぞれの各積和演算部５１０〜５１４も同様に対応するレジスタファイル４１２〜４１３から要素データを読み込む。さらに、演算部５１〜５３の各積和演算部５１０〜５１４は、それぞれ対応するレジスタファイル４２１〜４２３から１行分の要素データｔ００〜ｔ０３を計算毎に順次読み込む。そして、演算部５１〜５３の各積和演算部５１０〜５１４は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
【０１２５】
次に、状態４８１の演算が終了すると、状態４８２に示すように、レジスタファイル４１１〜４１３には、状態４８１で格納した行の２ストライド先の１行分の要素データが格納される。また、状態４８２に示すように、レジスタファイル４２１〜４２３には、状態４８１で格納されていた行の２ストライド先の１行分の要素データが格納される。そして、演算部５１〜５３の各積和演算部５１０〜５１４は、状態４８１と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態４８１の計算結果に加算していく。
【０１２６】
このように、演算が終了する毎に、前の状態で格納されていた行の２ストライド先の１行分の要素データがレジスタファイル４１１〜４１３及び４２１〜４２３に格納される。そして、演算部５１〜５３の各積和演算部５０１〜５０３は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
【０１２７】
トップ差分データ２０３は、８行８列であり、ストライド数が２の場合、トップ差分データ２０３の１行を用いた演算を４行分行うことで１つの重み差分データ２０４を算出することができる。そこで、４回の演算をおこなうことで、演算部５１〜５３は、重み差分データ２０４の全ての要素を算出できる。
【０１２８】
ここで、算出される重み差分データ２０４の各要素データを、ボトムデータ２０１やトップ差分データ２０３と同様に、１行１列目から順にｗ００〜ｗ２４とする。演算部５１の積和演算部５１０は、状態４８１〜４８４までの４回の演算結果を順次加算していくことで、初期位置にトップ差分データ２０３を配置した状態の重み差分データ２０４の要素データｗ００を算出する。また、演算部５１の積和演算部５１１は、初期位置からトップ差分データ２０３を１つ分のストライド数ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０１を算出する。また、演算部５１の積和演算部５１２は、トップ差分データ２０３を初期位置から２つ分のストライド数ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０２を算出する。また、演算部５１の積和演算部５１３は、トップ差分データ２０３を初期位置から３つ分のストライド数ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０３を算出する。また、演算部５１の積和演算部５１４は、トップ差分データ２０３を初期位置から４つ分のストライド数ずらした位置に配置した状態の重み差分データ２０４の要素データｗ０４を算出する。以上のことから、演算部５１は、初期位置からトップ差分データ２０３を行方向に移動させることで算出される重み差分データ２０４の要素データｗ００〜ｗ０４を算出する。
【０１２９】
同様に、演算部５２は、初期位置から１つ分のストライド数ずらした位置からトップ差分データ２０３を列方向に移動させることで算出される重み差分データ２０４の要素データｗ０５〜ｗ０９を算出する。そして、演算部５３は、初期位置から４つ分のストライド数ずらした位置からトップ差分データ２０３を列方向に移動させることで算出される重み差分データ２０４の要素データｗ２０〜ｗ２４を算出する。ここで、トップ差分データ２０３が４行４列で、ストライド数が２の場合、１２行１２列のボトムデータ２０１の１２行目及び１２列目は計算に使用されない。
【０１３０】
このように、図８Ａ及び８Ｂに記載した状態４８１〜４８４における演算が終了した時点で、演算部５１〜５３は、重み差分データ２０４の全ての要素データｗ００〜ｗ２４を算出し終え、畳み込みバックワードの重み差分演算が完了する。
【０１３１】
次に、図９及び１０を参照して、演算部５１における畳み込みバックワードの重み差分積和演算の詳細についてさらに説明する。図９は、畳み込みバックワードの重み差分演算の１回目の計算における演算部を表す図である。図１０は、畳み込みバックワードの重み差分演算の２回目の計算における演算部を表す図である。
【０１３２】
まず、畳み込みバックワードの重み差分積和演算を開始する場合、レジスタファイル４１１に要素データｂ００〜ｂ１１が格納される。また、レジスタファイル４２１にトップ差分データ２０３の要素データｔ００〜ｔ０７が格納される。
【０１３３】
ポインタ制御部１６は、レジスタファイル４１１に格納された最初の要素データｂ００にレジスタファイル４１１における先頭ポインタ１６３を設定する。その後、積和演算部５１０〜５１４の１回の計算が終了する毎に先頭ポインタ１６３を１つずつ移動させる。
【０１３４】
演算部５１の積和演算部５１０は、レジスタファイル４１１の先頭ポインタ１６３の位置の要素データを順次取得することで、点線６３１で囲われた部分の要素データｂ００〜ｂ０７を計算毎に順次取得する。また、演算部５１の積和演算部５１０は、レジスタファイル４２１の先頭から要素データｔ００〜ｔ０７を計算毎に順次取得する。そして、演算部５１の積和演算部５１０は、取得した要素データｂ００〜ｂ０７と要素データｔ００〜ｔ０７とをそれぞれ乗算する。次に、演算部５１の積和演算部５１０は、レジスタファイル３１０に格納された重み差分データ２０４の要素データｗ００の値を取得する。ここで、要素データｗ００の初期値は０である。そして、演算部５１の積和演算部５１０は、各乗算結果とレジスタファイル３１０に格納された要素データｗ００の値を合計し、計算結果をレジスタファイル３１０に格納する。
【０１３５】
演算部５１の積和演算部５１４は、レジスタファイル４１１の先頭ポインタ１６３から４つ先の要素データを順次取得することで、点線６３２で囲われた部分の要素データｂ０４〜ｂ１１を計算毎に順次取得する。また、演算部５１の積和演算部５１４は、レジスタファイル４２１の先頭から要素データｔ００〜ｔ０７を計算毎に順次取得する。そして、演算部５１の積和演算部５１４は、取得した要素データｂ０４〜ｂ１１と要素データｔ００〜ｔ０７とをそれぞれ乗算する。次に、演算部５１の積和演算部５１４は、レジスタファイル３１４に格納された重み差分データ２０４の要素データｗ０４の値を取得する。ここで、要素データｗ０４の初期値は０である。そして、演算部５１の積和演算部５１４は、各乗算結果とレジスタファイル３１４に格納された要素データｗ０４の値を合計し、計算結果をレジスタファイル３１４に格納する。
【０１３６】
次に、ポインタ制御部１６は、先頭ポインタ１６３を１つ下の行の先頭に移動させ図１０の状態とする。そして、ポインタ制御部１６は、レジスタファイル４１１に格納された要素データｂ１２にレジスタファイル４１１における先頭ポインタ１６３を設定する。その後、積和演算部５１０〜５１４の１回の計算が終了する毎にポインタを１つずつ移動させる。
【０１３７】
演算部５１の積和演算部５１０は、レジスタファイル４１１の先頭ポインタ１６３の位置の要素データを順次取得することで、点線６３３で囲われた部分の要素データｂ１２〜ｂ１９を計算毎に順次取得する。また、演算部５１の積和演算部５１０は、レジスタファイル４２１の先頭から要素データｔ０８〜ｔ１５を計算毎に順次取得する。そして、演算部５１の積和演算部５１０は、取得した要素データｂ１２〜ｂ１９と要素データｔ０８〜ｔ１５とをそれぞれ乗算する。次に、演算部５１の積和演算部５１０は、レジスタファイル３１０に格納された重み差分データ２０４の要素データｗ００の値を取得する。ここで、２回目の計算の前に、要素データｗ００には、１回目の計算結果が格納されている。そして、演算部５１の積和演算部５１０は、各乗算結果とレジスタファイル３１０に格納された要素データｗ００の値を合計し、計算結果をレジスタファイル３１０に格納する。
【０１３８】
演算部５１の積和演算部５１４は、レジスタファイル４１１の先頭ポインタ１６３から４つ先の要素データを順次取得することで、点線６３４で囲われた部分の要素データｂ１６〜ｂ２３を計算毎に順次取得する。また、演算部５１の積和演算部５１４は、レジスタファイル４２１の先頭から要素データｔ０８〜ｔ１５を計算毎に順次取得する。そして、演算部５１の積和演算部５１４は、取得した要素データｂ１６〜ｂ２３と要素データｔ０８〜ｔ１５とをそれぞれ乗算する。次に、演算部５１の積和演算部５１４は、レジスタファイル３１４に格納された重み差分データ２０４の要素データｗ０４の値を取得する。ここで、２回目の計算の前に、要素データｗ０４には、１回目の計算結果が格納されている。そして、演算部５１の積和演算部５１４は、各乗算結果とレジスタファイル３１４に格納された要素データｗ０４の値を合計し、計算結果をレジスタファイル３１４に格納する。
【０１３９】
その後、ポインタ制御部１６は、先頭ポインタ１６３のストライド数分の移動を６回繰り返し畳み込みバックワードの重み差分積和演算における重み差分データ２０４の要素データｗ０１〜ｗ０４の算出を終了する。
【０１４０】
次に、図１１を参照して、畳み込みバックワードのボトム差分演算を実行する場合について説明する。図１１は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図１１では、演算処理装置１は、８行８列に要素データが並んだトップ差分データ２０３及び５行５列に要素データが並んだ重みデータ２０２を用いる。重みデータ２０２は、要素データｗ００〜ｗ２４を有する。また、トップ差分データ２０３は、１２行１２列のボトムデータ２０１及び重みデータ２０２を用いて、ストライド数が１の場合に求められたものであり、要素データｔ００〜ｔ６３を有する。
【０１４１】
さらに、本実施例では、トップ差分データ２０３の行数の演算部５１〜５３が用いられる。これにより、演算部５１〜５３は、トップ差分データ格納用のレジスタファイル４１１〜４１３のデータの入れ替えを行わずに、全てのボトムデータ２０１に対する畳み込みバックワードのボトム差分演算を行うことができる。例えば、図１１では、７個の演算部５１〜５３が用いられる。ここでは、演算部５３が７番目の演算部とする。さらに、演算部５１〜５３は、図４における積和演算部５０１〜５０３としてそれぞれ８個の積和演算部５２０〜５２７を有する。また、レジスタファイル４３１〜４３３は、図４におけるレジスタファイル３０１〜３０３としてそれぞれ算出するボトム差分データ２０５の行数と同数の１２個のレジスタファイル３２０〜３３１を有する。また、ここでは、積和演算部５２０〜５２７には、順番に０〜８の番号が振られており、さらに、レジスタファイル３２０〜３３１には、順番に０〜１１の番号が振られているものとして説明する。
【０１４２】
第１データ制御部１２は、畳み込みバックワードの重み差分演算で用いるトップ差分データ２０３、重みデータ２０２及びボトムデータ２０１のサイズを予め記憶する。例えば、第１データ制御部１２は、予め表示装置及び入力装置を用いて設定された設定値の入力により、トップ差分データ２０３、重みデータ２０２及びボトムデータ２０１のサイズ及び重みデータ２０２のサイズ（あるいはカーネル数）を取得して記憶する。
【０１４３】
第１データ制御部１２は、トップ差分データ２０３における先頭位置から１行分の要素データをメモリ１１から読み込む。例えば、第１データ制御部１２は、要素データｔ００〜ｔ０７のデータを読み込む。そして、第１データ制御部１２は、要素データｔ００〜ｔ０７をレジスタファイル４１１に格納する。
【０１４４】
また、第１データ制御部１２は、トップ差分データ２０３における次の１行の要素データをメモリ１１から読み込む。例えば、第１データ制御部１２は、要素データｔ０８〜ｔ１５のデータを読み込む。そして、第１データ制御部１２は、要素データｔ０８〜ｔ１５をレジスタファイル４１２に格納する。
【０１４５】
第１データ制御部１２は、トップ差分データ２０３の行数、１行毎の要素データのメモリ１１から読み込み及び異なるレジスタファイル４１１〜４１３への格納を繰り返す。例えば、第１データ制御部１２は、要素データｔ５６〜ｔ６３をレジスタファイル４１３に格納する。
【０１４６】
また、第２データ制御部１３は、重みデータ２０２における先頭位置から１行分の要素データをメモリ１１から読み込む。例えば、第２データ制御部１３は、要素データｗ００〜ｗ０４をメモリ１１から読み込む。そして、第２データ制御部１３は、レジスタファイル４２１〜４２３に要素データｗ００〜ｗ０４を格納する。
【０１４７】
演算部５１は、レジスタファイル４１１に格納された要素データｔ００〜ｔ０７とレジスタファイル４２１に格納された要素データｗ００〜ｗ０４とを用いてボトム差分積和演算を行い、ボトム差分データ２０５の要素データｂ００〜ｂ１１の仮の値を算出する。そして、演算部５１は、演算結果用のレジスタファイル４３１にボトム差分データ２０５の要素データｂ０１〜ｂ１１の値を格納する。
【０１４８】
ここで、演算部５１の積和演算部５２０〜５２７による積和演算の詳細について説明する。
【０１４９】
積和演算部５２０〜５２７は、レジスタファイル４１１に格納された要素データｔ００〜ｔ０７の先頭から順にそれぞれ要素データｔ００〜ｔ０７を取得する。また、積和演算部５２０〜５２７は、レジスタファイル４２１の先頭の要素データｗ００を取得する。そして、積和演算部５２０〜５２７は、取得した要素データｔ００〜ｔ０７と要素データｗ００とを乗算する。さらに、積和演算部５２０〜５２７は、自己と同じ番号を有するレジスタファイル３２０〜３２７からそれぞれ要素データｂ００〜ｂ０７を取得する。ここで、レジスタファイル３２０〜３３１には、初期値として０が格納される。そして、積和演算部５２０〜５２７は、それぞれが有する要素データｔ００〜ｔ０７と要素データｗ００との乗算結果をそれぞれが取得した要素データｂ００〜ｂ０７に加算し、加算結果を要素データｂ００〜ｂ０７の取得元のレジスタファイル３２０〜３２７に格納する。
【０１５０】
次に、積和演算部５２０〜５２７は、それぞれが取得した要素データｔ００〜ｔ０７を保持する。また、積和演算部５２０〜５２７は、レジスタファイル４２１の先頭の次の要素データｗ０１を取得する。そして、積和演算部５２０〜５２７は、保持する要素データｔ００〜ｔ０７と要素データｗ０１とを乗算する。さらに、積和演算部５２０〜５２７は、自己と同じ番号の次の番号を有するレジスタファイル３２１〜３２８からそれぞれ要素データｂ０１〜ｂ０８を取得する。そして、積和演算部５２０〜５２７は、それぞれが有する要素データｔ００〜ｔ０７と要素データｗ０１との乗算結果をそれぞれが取得した要素データｂ０１〜ｂ０８に加算し、加算結果を要素データｂ０１〜ｂ０８の取得元のレジスタファイル３２１〜３２８に格納する。
【０１５１】
このように、積和演算部５２０〜５２７は、ｋ回目（ｋ＝１〜５）の計算の場合、レジスタファイル４２１の先頭からｋ個ずらした位置の要素データｗ（００＋ｋ−１）を取得する。そして、積和演算部５２０〜５２７は、保持する要素データｔ００〜ｔ０７と取得した要素データｗ（００＋ｋ）とを乗算する。さらに、積和演算部５２０〜５２７は、自己と同じ番号のからｋ個ずつずらした番号を有するレジスタファイル（３２０＋ｋ−１）〜（３２７＋ｋ−１）からそれぞれ要素データｂ（００＋ｋ−１）〜ｂ（０７＋ｋ−１）を取得する。そして、積和演算部５２０〜５２７は、乗算結果をそれぞれが取得した要素データｂ（００＋ｋ−１）〜ｂ（０７＋ｋ−１）に加算し、加算結果を要素データｂ（００＋ｋ−１）〜ｂ（０７＋ｋ−１）の取得元のレジスタファイル（３２０＋ｋ−１）〜（３２７＋ｋ−１）に格納する。これにより、積和演算部５２０〜５２７は、ボトム差分データ２０５の要素データｂ０１〜ｂ１１の算出を完了する。
【０１５２】
演算部５２〜５３の積和演算部５２０〜５２７も、それぞれレジスタファイル４１２〜４１３及び４３２〜４３３に格納された要素データを用いて、演算部５１と同様のボトム差分積和演算を行う。そして、演算部５２〜５３は、演算結果である要素データｂ１２〜ｂ２３，ｂ２４〜ｂ３５，・・・，ｂ８４〜ｂ９５の仮の値をそれぞれレジスタファイル４３２〜４３３に格納する。
【０１５３】
次に、レジスタファイル４１１〜４１３は、保持するデータを維持する。また、第２データ制御部１３により、レジスタファイル４２１〜４２３には、要素データｗ０５〜ｗ０９が格納される。
【０１５４】
演算部５１は、レジスタファイル４１１に格納された要素データｔ００〜ｔ０７とレジスタファイル４２１に格納された要素データｗ０５〜ｗ０９とを用いて、前回と同様にボトム差分積和演算を行う。演算部５１は、レジスタファイル４３１のポインタが示す位置にボトム差分データ２０５の値を足しこんでいくことで、ボトム差分データ２０５の要素データｂ１２〜ｂ２３の値をレジスタファイル４３１に格納する。そして、演算部５１は、レジスタファイル４３１に格納されたボトム差分データ２０５の要素データｂ１２〜ｂ２３の値をメモリ１１に書き込む。
【０１５５】
演算部５１は、同様に、順次レジスタファイル４１１に格納された要素データｔ００〜ｔ０７とレジスタファイル４２１に格納された要素データｗ１０〜ｗ２４とを用いて、ボトム差分積和演算を行う。演算部５１は、レジスタファイル４３１のポインタが示す位置にボトム差分データ２０５の値を足しこんでいくことで、ボトム差分データ２０５の要素データｂ２４〜ｂ３５，ｂ３６〜４７，ｂ４８〜ｂ５９の値を算出し、算出結果をメモリ１１に書き込んでいく。ここで、演算部５１は、メモリ１１に書きこんだ演算結果は、レジスタファイル４３１から削除していく。
【０１５６】
演算部５２〜５３も、演算部５１と同様の重み差分積和演算を行い、演算結果をレジスタファイル４３２〜４３３の値に足しこんでいく。そして、レジスタファイル４２０に重みデータ２０２の最後の行の要素データｗ２０〜ｗ２４が格納された状態で演算を行った時点で、演算部５１〜５３は、ボトム差分積和演算を終了し、各ボトム差分データ２０５の値を確定する。そして、演算部５１〜５３は、確定したボトム差分データ２０５の値をメモリ１１に書き込む。
【０１５７】
このように、第１データ制御部１２は、トップ差分データ２０３の先頭の行から順に１行ずつ要素データをレジスタファイル４１１〜４１３に格納する。また、第２データ制御部１３は、トップ差分データ２０３の先頭の行から順に演算毎に１行ずつずらしながら要素データをレジスタファイル４２１〜４２３に格納する。そして、演算部５１〜５３は、カーネル数の演算を行うと演算を終了する。
【０１５８】
ここで、図１２を参照して、図１１における畳み込みバックワードのボトム差分演算時のレジスタファイル４１３への要素データの読み出し及び格納について詳細に説明する。図１２は、畳み込みバックワードのボトム差分演算時の要素データの読み出し及び格納を説明するための図である。状態７０１〜７０５はそれぞれ、演算部５１による、ボトムデータ２０１の最初の１列を読み込んだ際の１〜５回目の計算時の状態を表す。ここでは、一例として、レジスタファイル４３１が、配列７１０〜７１７という７列の配列を有する。
【０１５９】
積和演算部５２０〜５２７がレジスタファイル４３１に対する所望の要素データの読み出し及び書き込みを行うためには、実際には、図１２に示すクロスバスイッチ７０が配置される。そして、図１２における状態７０１〜７０５は、要素データｂ００〜ｂ１１がレジスタファイル４３１に格納された場合の１〜５回目の計算時のそれぞれの状態を表す。
【０１６０】
各状態７０１〜７０５では、ポインタ制御部１６は、太枠で囲んだ要素データの先頭に先頭ポインタを配置１６３する。そして、各状態７０１〜７０５において太枠で囲んだ要素データがその計算において読み出される要素データとなる。畳み込みバックワードのボトム差分演算では、積和演算部５２０〜５２７は、ボトム差分データ２０５の要素データｂ００〜ｂ１１をレジスタファイル４３１から読み出す。そして、積和演算部５２０〜５２７は、重みデータ２０２とトップ差分データ２０３との乗算結果を読み出した要素データｂ００〜ｂ１１に加算してレジスタファイル４３１の読み出し元の位置に再度格納する。以下に、各状態７０１〜７０５の詳細を説明する。
【０１６１】
状態７０１で示される１回目の計算では、ポインタ制御部１６は、要素データｂ００に先頭ポインタを配置する。積和演算部５２０は、先頭ポインタが示す要素データｂ００を配列７１０から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ００を格納する。積和演算部５２１は、先頭ポインタから２番目の要素データｂ０１を配列７１１から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０１を格納する。積和演算部５２２は、先頭ポインタから３番目の要素データｂ０２を配列７１２から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０２を格納する。積和演算部５２３は、先頭ポインタから４番目の要素データｂ０３を配列７１３から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０３を格納する。積和演算部５２４は、先頭ポインタから５番目の要素データｂ０４を配列７１４から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０４を格納する。積和演算部５２５は、先頭ポインタから６番目の要素データｂ０５を配列７１５から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０５を格納する。積和演算部５２６は、先頭ポインタから７番目の要素データｂ０６を配列７１６から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０６を格納する。積和演算部５２７は、先頭ポインタから６番目の要素データｂ０７を配列７１７から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データｂ０７を格納する。
【０１６２】
状態７０２〜７０５では、ポインタ制御部１６は、先頭ポインタを１つずつ進めていく。積和演算部５２０は、破線矢印で示すように先頭ポインタが示す位置のデータに対して読み出し及び格納を行う。積和演算部５２１は、破線矢印で示すように先頭ポインタから２番目のデータに対して読み出し及び格納を行う。積和演算部５２２は、破線矢印で示すように先頭ポインタから３番目のデータに対して読み出し及び格納を行う。積和演算部５２３は、破線矢印で示すように先頭ポインタから４番目のデータに対して読み出し及び格納を行う。積和演算部５２４は、破線矢印で示すように先頭ポインタから５番目のデータに対して読み出し及び格納を行う。積和演算部５２５は、破線矢印で示すように先頭ポインタから６番目のデータに対して読み出し及び格納を行う。積和演算部５２６は、破線矢印で示すように先頭ポインタから７番目のデータに対して読み出し及び格納を行う。積和演算部５２７は、破線矢印で示すように先頭ポインタから８番目のデータに対して読み出し及び格納を行う。
【０１６３】
このように、７つの配列７１０〜７１７を用いることで、積和演算部５２０〜５２７は、異なる配列７１０〜７１７から要素データを読み出すため、データの読み出し及び書き込み時にコンフリクトの発生を回避する。
【０１６４】
次に、図１３Ａ〜１３Ｃ、１４Ａ及び１４Ｂを参照して、レジスタファイル４１１〜４１３、４２１〜４２３及び４３１〜４３３に格納される要素データの遷移について説明する。図１３Ａ〜１３Ｃは、畳み込みバックワードのボトム差分演算におけるストライド数が１の場合の格納される要素データの遷移を表す図である。また、図１４Ａ及び１４Ｂは、畳み込みバックワードのボトム差分演算におけるストライド数が２の場合の格納される要素データの遷移を表す図である。ここでは、トップ差分データ２０３が８行８列で、カーネルサイズが５の場合を例に説明する。
【０１６５】
ストライド数が１の場合、積和演算部５２０〜５２７は、トップサイズである８とストライド数である１とを乗算した８個が演算に用いられる。そして、最初に、図１３Ａの状態７２１に示すように、レジスタファイル４１１には、要素データｔ００〜ｔ０７が格納される。また、レジスタファイル４１２には、要素データｔ０８〜ｔ１５が格納される。また、レジスタファイル４１３には、要素データｔ５６〜ｔ６３が格納される。また、レジスタファイル４２１〜４２３には、要素データｗ００〜ｗ０４が格納される。
【０１６６】
演算部５１の積和演算部５２０〜５２７は、先頭から順に要素データｔ００〜ｔ０７をレジスタファイル４１１からそれぞれ読み込む。演算部５２〜５３のそれぞれの各積和演算部５２０〜５２７も同様に対応するレジスタファイル４１２〜４１３から要素データを読み込む。さらに、演算部５１〜５３の各積和演算部５２０〜５２７は、それぞれ対応するレジスタファイル４２１〜４２３から要素データｗ００〜ｗ０４を先頭から順に計算毎に読み込む。そして、演算部５１〜５３の各積和演算部５２０〜５２６は、読み込んだ要素データ同士を乗算する。そして、各積和演算部５２０〜５２７は、乗算結果を番号が１つ大きい積和演算部５２１〜５２７が前回の計算で算出した計算結果に加算する。これは、各積和演算部５２０〜５２７が、自己と同じ番号から終了した計算回数だけ多い番号を有するレジスタファイル３２０〜３３１が保持する値に乗算結果を足し込む処理である。これにより、演算部５１は、ボトム差分データ２０５の要素データｂ００〜ｂ１１を算出し、演算部５２〜５３は、ボトム差分データ２０５の要素データｂ１２〜ｂ２３，・・・，ｂ８４〜ｂ９５の仮の値を算出する。
【０１６７】
次に、状態７２１の演算が終了すると、次の計算状態である状態７２２に移行する。この場合、レジスタファイル４１１〜４１３は、状態７２１と同様の状態である。また、レジスタファイル４２１〜４２３には、状態７２１で格納されていた要素データの次の１行分の要素データｗ０５〜ｗ０９が格納される。そして、演算部５１〜５３の各積和演算部５２０〜５２７は、状態７２１と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部５２０〜５２６は、乗算結果を番号が１つ大きい積和演算部５２１〜５２７が前回の計算で算出した計算結果に加算する。これにより、演算部５１〜５３は、ボトム差分データ２０５の要素データｂ１２〜ｂ２３，ｂ２４〜ｂ３５，・・・，ｂ９６〜ｂ１０７の仮の値を算出する。そして、演算部５１〜５３は、計算結果を隣の演算部５２〜５３が状態７２１の計算で算出したボトム差分データ２０５の要素データｂ１２〜ｂ２３，ｂ２４〜ｂ３５，・・・，ｂ８４〜ｂ９５の仮の値に加算する。ただし、演算部５３は、隣の演算部が無いので加算する計算結果として０を用いる。
【０１６８】
このように、演算が終了する毎に、図１３Ａ〜１３Ｃに記載した前の状態７２１〜７２４で格納されていた要素データの次の１行分の要素データがレジスタファイル４１１〜４１３及び４２１〜４２３に格納される。そして、演算部５１〜５３の各積和演算部５２１〜５２７は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ２０５の仮の値を算出する。そして、演算部５１〜５３は、算出した仮の値を隣の演算部５２〜５３が１つ前の状態７２１〜７２４で算出したボトム差分データ２０５の仮の値に加算しレジスタファイル４３１〜４３３に格納する。
【０１６９】
このような演算を、演算部５１〜５３は、カーネル数だけ繰り返す。そして、演算部５１は、状態７２１〜７２５において、ボトム差分データ２０５の要素データｂ００〜ｂ１１，ｂ１２〜ｂ２３，・・・，ｂ４８〜ｂ５９を算出する。また、演算部５２〜５３は、状態７２５におけるボトム差分データ２０５の要素データｂ６０〜ｂ７１，・・・，ｂ１３２〜ｂ１４３をそれぞれの値として確定する。
【０１７０】
このように、演算部５１〜５３は、状態７２１〜７２４における演算が終了した時点で、ボトム差分データ２０５の全ての要素データｂ００〜ｂ１４３を算出し終え、畳み込みバックワードの重み差分演算が完了する。
【０１７１】
ストライド数が２の場合、積和演算部５２０〜５３５は、トップサイズである８とストライド数である２とを乗算した１６個が演算に用いられる。最初に、図１４Ａの状態７３１に示すように、レジスタファイル４１１には、要素データｔ００〜ｔ０７が格納される。また、レジスタファイル４１２には、要素データｔ０８〜ｔ１５が格納される。また、レジスタファイル４１３には、要素データｔ５６〜ｔ６３が格納される。また、レジスタファイル４２１〜４２３には、ストライド数の行数分の要素データｗ００〜ｗ０９が格納される。
【０１７２】
演算部５１の積和演算部５２０，５２２，・・・，５３４は、レジスタファイル４１１の先頭から順番に異なる要素データｔ００〜ｔ０７をそれぞれ読み込む。また、演算部５１の積和演算部５２１，５２３，・・・，５３５も同様に、レジスタファイル４１１の先頭から順番に異なる要素データｔ００〜ｔ０７をそれぞれ読み込む。次に、演算部５１の積和演算部５２０，５２２，・・・，５３４は、計算毎に要素データｗ００、ｗ０２及びｗ０４をレジスタファイル４２１から順次読み込む。また、演算部５１の積和演算部５２１，５２３，・・・，５３５は、計算毎に要素データｗ０１及びｗ０３をレジスタファイル４２１から順次読み込む。そして、演算部５１の積和演算部５２０〜５３５は、読み込んだ要素データ同士を乗算する。そして、各積和演算部５２０〜５３５は、乗算結果を番号が２つ大きい積和演算部５２１〜５３５が前回の計算で算出した計算結果に加算する。これは、各積和演算部５２０〜５３４が、終了した計算回数に２を乗算した数だけ自己と同じ番号より多い番号を有するレジスタファイル３２０〜３３５が保持する値に乗算結果を足し込む処理である。
【０１７３】
次に、演算部５１の積和演算部５２０〜５３５は、トップ差分データ２０３の値を保持する。また、演算部５１の積和演算部５２０，５２２，・・・，５３４は、計算毎に次の行の要素データｗ０５、ｗ０７及びｗ０９をレジスタファイル４２１から順次読み込む。また、演算部５１の積和演算部５２１，５２３，・・・，５３５は、計算毎に次の行の要素データｗ０６及びｗ０８をレジスタファイル４２１から順次読み込む。そして、演算部５１の積和演算部５２０〜５３４は、読み込んだ要素データ同士を乗算する。そして、各積和演算部５２０〜５３４は、乗算結果を番号が２つ大きい積和演算部５２１〜５３５が前回の計算で算出した計算結果に加算する。
【０１７４】
次に、状態７３１の演算が終了すると、次の計算状態である状態７３２に移行する。この場合、レジスタファイル４１１〜４１３は、状態７３１と同様の状態である。また、レジスタファイル４２１〜４２３には、状態７３１で格納されていた要素データの次の２行分の要素データｗ１０〜ｗ１９が格納される。そして、演算部５１〜５３の各積和演算部５２０〜５３５は、状態７３１と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部５２０〜５３５は、乗算結果を番号が２つ大きい積和演算部５２１〜５２７が前回の計算で算出した計算結果に加算する。
【０１７５】
次に、状態７３２の演算が終了すると、次の計算状態である図１４Ｂの状態７３３に移行する。この場合、レジスタファイル４１１〜４１３は、状態７３２と同様の状態である。また、レジスタファイル４２１〜４２３には、状態７３２で格納されていた要素データの次の２行分の要素データｗ２０〜ｗ２９が格納される。そして、演算部５１〜５３の各積和演算部５２０〜５３４は、状態７３１と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部５２０〜５３４は、乗算結果を番号が２つ大きい積和演算部５２１〜５３５が前回の計算で算出した計算結果に加算する。
【０１７６】
このように、演算が終了する毎に、前の状態７３１〜７３２で格納されていた要素データの次の１行分の要素データがレジスタファイル４１１〜４１３に格納される。また、演算が終了する毎に、前の状態７２１〜７２４で格納されていた要素データの次のストライド数の行分の要素データが４２１〜４２３に格納される。そして、演算部５１〜５３の各積和演算部５２１〜５３５は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ２０５の仮の値を算出する。そして、演算部５１〜５３は、算出した仮の値を番号が２つ大きい演算部５２〜５３が１つ前の状態７３１〜７３２で算出したボトム差分データ２０５の仮の値に加算しレジスタファイル４３１〜４３３に格納する。
【０１７７】
このような演算を、演算部５１〜５３は、カーネル数だけ繰り返してボトム差分データ２０５を算出することで、畳み込みバックワードの重み差分演算を完了する。
【０１７８】
ここで、図１５及び１６を参照して、レジスタファイル４１０及び４２０に格納される要素データの遷移について説明する。図１５は、ストライド数が１の場合の畳み込みバックワードのボトム差分演算の１行目の計算時の演算部を表す図である。また、図１６は、ストライド数が１の場合の畳み込みバックワードの重み差分演算における２行目の計算における演算部を表す図である。この場合も、８行８列のトップ差分データ２０３、５行５列の重みデータ２０２及び１２行１２列のボトムデータ２０１を用いる。
【０１７９】
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル４１１にトップ差分データ２０３の要素データｔ００〜ｔ０７が格納される。また、レジスタファイル４２１に重みデータ２０２の要素データｗ００〜ｗ０４が格納される。
【０１８０】
ポインタ制御部１６は、レジスタファイル４１１に格納された最初の要素データｔ００にレジスタファイル４１１におけるポインタ１６６を設定する。その後、積和演算部５２０〜５２７による読み込み毎にポインタ１６６を１つずつ移動させる。また、ポインタ制御部１６は、最初にレジスタファイル４３１におけるデータの読み出し及び格納の位置として要素データｂ００の位置に先頭ポインタ１６５を設定する。その後、ポインタ制御部１６は、積和演算部５２０〜５２７の計算が終了する毎に先頭ポインタ１６５を１つずつ移動させる。
【０１８１】
演算部５１の積和演算部５２０は、計算毎にレジスタファイル４２１の先頭から１つずつ進めた位置の要素データｗ００〜ｗ０４を順次取得する。また、演算部５１の積和演算部５２０は、レジスタファイル４１１のポインタ１６６が示す位置から要素データｔ００を取得する。そして、演算部５１の積和演算部５２０は、取得した要素データｗ００〜ｗ０４と要素データｔ００とをそれぞれ乗算する。次に、演算部５１の積和演算部５２０は、レジスタファイル４３１の計算毎に１つ進む先頭ポインタ１６５が示す位置に格納されたボトム差分データ２０５の要素データｂ００〜ｂ０４の値を取得する。ここで、要素データｂ００〜ｂ１１の初期値は０である。そして、演算部５１の積和演算部５２０は、各乗算結果とレジスタファイル４３１から取得した要素データｂ００〜ｂ０４の値を合計し、計算結果を先頭ポインタ１６５が示す位置に格納する。
【０１８２】
演算部５１の積和演算部５２７は、レジスタファイル４１１のポインタ１６６が示す要素データｔ０７を取得する。また、演算部５１の積和演算部５２７は、レジスタファイル４２１の先頭から要素データｗ００〜ｗ０４を計算毎に順次取得する。そして、演算部５１の積和演算部５２７は、要素データｔ０７と要素データｗ００〜ｗ０４とをそれぞれ乗算する。次に、演算部５１の積和演算部５２７は、レジスタファイル４３１の計算毎に１つ進む先頭ポインタ１６５から８番目の位置に格納されたボトム差分データ２０５の要素データｂ０７〜ｂ１１の値を取得する。ここで、要素データｂ０７〜ｂ１１の初期値は０である。そして、演算部５１の積和演算部５２７は、各乗算結果とレジスタファイル４３１から取得した要素データｂ０７〜ｂ１１の値を合計し、計算結果を先頭ポインタ１６５から８番目の位置に格納する。これにより、積和演算部５２０〜５２７は、ボトム差分データ２０５の要素データｂ００〜ｂ１１を算出する。
【０１８３】
次に、ポインタ制御部１６は、先頭ポインタ１６５を１つ下の行の先頭に移動させる。そして、ポインタ制御部１６は、レジスタファイル４３１に格納された要素データｂ１２に先頭ポインタ１６５を設定する。その後、積和演算部５２０〜５２７の１回の計算が終了する毎にポインタを１つずつ移動させる。また、レジスタファイル４１１に格納されたトップ差分データ２０３の要素データｔ００〜ｔ０７が維持される。そして、ポインタ制御部１６は、ポインタ１６６を要素データｔ００の位置に戻す。また、レジスタファイル４２１に重みデータ２０２の次の行の要素データｗ０５〜ｗ０９が格納される。これにより、レジスタファイル４１１〜４１３は、図１６に示す２行目の計算を実行する状態となる。
【０１８４】
そして、演算部５１の積和演算部５２０〜５２７は、先頭ポインタ１６５及びポインタ１６６を用いて１行目と同様の演算を行い、ボトム差分データ２０５の要素データｂ１２〜ｂ２３を算出する。
【０１８５】
演算部５２〜５３の積和演算部５２０〜５２７も、レジスタファイル４１２〜４３２及びレジスタファイル４１３〜４３３に格納されたデータ及び先頭ポインタ１６５及びポインタ１６６を用いて演算部５１と同様の計算を行う。そして、演算部５２〜５３は、上述した計算と同様の計算を繰り返していくことでボトム差分データ２０５の要素データｂ００〜ｂ１４３の算出を完了する。
【０１８６】
さらに、図１７を参照して、ストライド数が２の場合について説明する。図１７は、ストライド数が２の場合の畳み込みバックワードのボトム差分演算における１行目の計算における演算部を表す図である。この場合も、８行８列のトップ差分データ２０３、５行５列の重みデータ２０２及び１２行１２列のボトムデータ２０１を用いる。
【０１８７】
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル４１１にトップ差分データ２０３の要素データｔ００〜ｔ０３が格納される。また、レジスタファイル４２１に重みデータ２０２の要素データｗ００〜ｗ０４が格納される。
【０１８８】
ポインタ制御部１６は、レジスタファイル４１１に格納された最初の要素データｔ００にレジスタファイル４１１におけるポインタ１６６を設定する。その後、積和演算部５２０及び５２１、５２２及び５２３、５２４及び５２５、５２６及び５２７による読み込み毎にポインタ１６６を１つずつ移動させる。また、ポインタ制御部１６は、最初にレジスタファイル４３１におけるデータの読み出し及び格納の位置として要素データｂ００の位置に先頭ポインタ１６５を設定する。その後、ポインタ制御部１６は、積和演算部５２０〜５２７の計算が終了する毎に先頭ポインタ１６５をストライド数である２つずつ移動させる。
【０１８９】
演算部５１の積和演算部５２０は、計算毎にレジスタファイル４２１の先頭から２つずつ進めた位置の要素データｗ００，ｗ０２，ｗ０４を順次取得する。また、演算部５１の積和演算部５２０は、レジスタファイル４１１のポインタ１６６が示す要素データｔ００を取得する。そして、演算部５１の積和演算部５２０は、取得した要素データｗ００，ｗ０２，ｗ０４と要素データｔ００とをそれぞれ乗算する。次に、演算部５１の積和演算部５２０は、レジスタファイル４３１の計算毎に２つ進む先頭ポインタ１６５が示す位置に格納されたボトム差分データ２０５の要素データｂ００，ｂ０２，ｂ０４の値を順次取得する。ここで、要素データｂ００〜ｂ１１の初期値は０である。そして、演算部５１の積和演算部５２０は、各乗算結果とレジスタファイル４３１から取得した要素データｂ００，ｂ０２，ｂ０４の値とを合計し、計算結果を先頭ポインタ１６５が示す位置に格納する。
【０１９０】
演算部５１の積和演算部５２１は、レジスタファイル４１１のポインタ１６６が示す要素データｔ００を取得する。また、演算部５１の積和演算部５２１は、レジスタファイル４２１の先頭次のデータから２つずつ進めた位置の要素データｗ０１，ｗ０３を順次取得する。そして、演算部５１の積和演算部５２１は、要素データｔ００と要素データｗ０１及びｗ０３とをそれぞれ乗算する。次に、演算部５１の積和演算部５２１は、レジスタファイル４３１の計算毎に２つ進む先頭ポインタ１６５の次の位置に格納されたボトム差分データ２０５の要素データｂ０１，ｂ０３の値を順次取得する。そして、演算部５１の積和演算部５２１は、各乗算結果とレジスタファイル４３１から取得した要素データｂ０１，ｂ０３の値とを合計し、計算結果を先頭ポインタ１６５の次の位置に格納する。
【０１９１】
次に、ポインタ制御部１６は、レジスタファイル４１１におけるポインタ１６６を１つ進める。これにより、ポインタ１６６は、要素データｔ０１を示す位置に移動される。
【０１９２】
演算部５１の積和演算部５２２は、計算毎にレジスタファイル４２１の先頭から２つずつ進めた位置の要素データｗ００，ｗ０２，ｗ０４を順次取得する。また、演算部５１の積和演算部５２２は、レジスタファイル４１１のポインタ１６６が示す要素データｔ０１を取得する。そして、演算部５１の積和演算部５２２は、取得した要素データｗ００，ｗ０２，ｗ０４と要素データｔ００とをそれぞれ乗算する。次に、演算部５１の積和演算部５２２は、レジスタファイル４３１の計算毎に２つ進む先頭ポインタ１６５が示す位置からストライド数である２つ分移動した位置に格納されたボトム差分データ２０５の要素データｂ０２，ｂ０４，ｂ０６の値を順次取得する。そして、演算部５１の積和演算部５２２は、各乗算結果とレジスタファイル４３１から取得した要素データｂ０２，ｂ０４，ｂ０６の値とを合計し、計算結果を先頭ポインタ１６５が示す位置に格納する。
【０１９３】
演算部５１の積和演算部５２３は、レジスタファイル４１１のポインタ１６６が示す要素データｔ０１を取得する。また、演算部５１の積和演算部５２３は、レジスタファイル４２１の先頭次のデータから２つずつ進めた位置の要素データｗ０１，ｗ０３を順次取得する。そして、演算部５１の積和演算部５２１は、要素データｔ０１と要素データｗ０１，ｗ０３とをそれぞれ乗算する。次に、演算部５１の積和演算部５２１は、レジスタファイル４３１の計算毎に２つ進む先頭ポインタ１６５の隣の位置から２つ隣の位置に格納されたボトム差分データ２０５の要素データｂ０３，ｂ０５の値を取得する。そして、演算部５１の積和演算部５２１は、各乗算結果とレジスタファイル４３１から取得した要素データｂ０３，ｂ０５との値を合計し、計算結果を先頭ポインタ１６５の隣の位置から２つ隣の位置に格納する。
【０１９４】
演算部５１の積和演算部５２４〜５２７も、ポインタ１６６及び先頭ポインタ１６５を用いて同様の演算を行い、ボトム差分データ２０５の要素データｂ０７〜ｂ１１を算出する。
【０１９５】
さらに、図１８及び図１９を参照して、本実施例に係る畳み込みバックワードのボトム差分演算の概念について説明する。図１８は、ストライド数が１の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。図１９は、ストライド数が２の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。
【０１９６】
各積和演算部５２０〜５２７には、上部に記載されたデータが入力される。そして、各積和演算部５２０〜５２７は、それぞれの下に記載された乗算を行う。そして、各積和演算部５２０〜５２７は、乗算結果を矢印で結ばれた要素データｂ００〜ｂ１１に加算していく。
【０１９７】
ストライド数が１の場合、例えば、積和演算部５２０は、ｔ００×ｗ００，ｔ００×ｗ０１，ｔ００×ｗ０２，ｔ００×ｗ０３及びｔ００×ｗ０４を順次行う。そして、積和演算部５２０は、ｔ００×ｗ００を要素データｂ００に足し込む。また、積和演算部５２０は、ｔ００×ｗ０１を要素データｂ０１に足し込む。また、積和演算部５２０は、ｔ００×ｗ０２を要素データｂ０２に足し込む。また、積和演算部５２０は、ｔ００×ｗ０３を要素データｂ０３に足し込む。また、積和演算部５２０は、ｔ００×ｗ０４を要素データｂ０４に足し込む。
【０１９８】
このように、演算を行うことで、破線枠７４０に示すように、乗算結果は、斜め方向に加算される。これにより、演算結果７４１に示すように、各要素データｂ００〜ｂ０５まで加算する乗算結果の数が増加し、その後、ｂ１１に向かって減少する。すなわち、要素データｂ００〜ｂ０５は、演算結果７４２に示すように、要素データｔ００〜ｔ０７に対して要素データｗ００〜ｗ０４を乗算した結果を１つずつずらしながら足し込んだ結果に一致する。
【０１９９】
ストライド数が２の場合は、図１９に示すように、積和演算部５２０，５２２，５２４及び５２６は、要素データｔ００〜ｔ０３をそれぞれが取得し、それに対して、要素データｗ０から１つ飛ばしの要素データｗ０２，ｗ０４を順次乗算する。また、積和演算部５２１，５２３，５２５及び５２７は、要素データｔ００〜ｔ０３をそれぞれが取得し、それに対して、要素データｗ０１から１つ飛ばしの要素データｗ０１及びｗ０３を順次乗算する。
【０２００】
すなわち、ストライド数が２の場合は、破線枠７５０に示すように、乗算結果は、１つ飛ばしの斜め方向に加算される。これにより、演算結果７５１に示すように、各要素データｂ００〜ｂ０５まで加算する乗算結果の数が１つおきに増加し、その後、ｂ１１に向かって１つおきに減少する。すなわち、要素データｂ００〜ｂ０５は、演算結果７５２に示すように、要素データｔ００〜ｔ０７に対して要素データｗ００〜０４をスライド数ずつずらして乗算した結果を１つずつずらしながら足し込んだ結果に一致する。
【０２０１】
次に、図２０を参照して、畳み込みバックワードの重み差分演算処理の詳細な流れについて説明する。図２０は、畳み込みバックワードの重み差分演算のフローチャートである。
【０２０２】
例えば、図３及び図４で示した構成の番号を用いて説明すると、第１データ制御部１２、第２データ制御部１３、演算部５０及びポインタ制御部１６は、カーネルサイズ（あるいはカーネル数）、ストライド数及びボトムデータ２０１の先頭行の指定を取得する（ステップＳ１０１）。
【０２０３】
演算部５０としてカーネルサイズ分の数の演算器が使用する演算器として割り当てられる。さらに、各演算部５０は、カーネルサイズ分の積和演算部５０１〜５０３を割当てる。また、レジスタファイル４３０は、カーネルサイズ分のレジスタファイル３０１〜３０３を演算結果格納用のレジスタファイルとして割り当てる（ステップＳ１０２）。
【０２０４】
ポインタ制御部１６は、レジスタファイル４１０の先頭ポインタ１６３及びレジスタファイル４２０のポインタを初期化する（ステップＳ１０３）。
【０２０５】
第１データ制御部１２は、指定された先頭行のボトムデータ２０１の要素データをメモリ１１から読み出しレジスタファイル４１０に格納する。また、第２データ制御部１３は、指定された先頭行のトップ差分データ２０３の要素データをメモリ１１から読み出しレジスタファイル４２０に格納する（ステップＳ１０４）。
【０２０６】
演算部５０の積和演算部５０１〜５０３は、レジスタファイル４１０の先頭ポインタ１６３から順にボトムデータ２０１の要素データを１つずつ読み込む。また、演算部５０の積和演算部５０１〜５０３は、レジスタファイル４２０のポインタが示すトップ差分データ２０３の１つの要素データを読み込む（ステップＳ１０５）。
【０２０７】
次に、演算部５０の積和演算部５０１〜５０３は、読み込んだボトムデータ２０１の要素データに読み込んだトップ差分データ２０３を乗算し、乗算結果を取得する（ステップＳ１０６）。
【０２０８】
次に、演算部５０の積和演算部５０１〜５０３は、レジスタファイル４３０の割り当てられたレジスタファイル３０１〜３０３から重み差分データ２０４の値を取得する（ステップＳ１０７）。
【０２０９】
そして、演算部５０の積和演算部５０１〜５０３は、取得した重み差分データ２０４に乗算結果を加算する（ステップＳ１０８）。
【０２１０】
そして、演算部５０の積和演算部５０１〜５０３は、加算結果を、レジスタファイル４３０の割り当てられたレジスタファイル３０１〜３０３に格納し直し更新する（ステップＳ１０９）。
【０２１１】
次に、演算部５０は、トップ差分データ２０３の１行分の計算が完了したか否かを判定する（ステップＳ１１０）。トップ差分データ２０３の１行分の計算が完了していない場合（ステップＳ１１０：否定）、ポインタ制御部１６は、レジスタファイル４１０の先頭ポインタ１６３及びレジスタファイル４２０のポインタを１つシフトさせ（ステップＳ１１１）、ステップＳ１０５へ戻る。
【０２１２】
これに対して、トップ差分データ２０３の１行分の計算が完了した場合（ステップＳ１１０：肯定）、演算部５０は、ボトムデータ２０１の指定された行に対する演算が完了したか否かを判定する（ステップＳ１１２）。
【０２１３】
ボトムデータ２０１の指定された行に対する演算が完了していない場合（ステップＳ１１２：否定）、ポインタ制御部１６は、レジスタファイル４１０の先頭ポインタ１６３をストライドだけ分シフトする（ステップＳ１１３）。
【０２１４】
さらに、ポインタ制御部１６は、レジスタファイル４２０のポインタを１つシフトする（ステップＳ１１４）。その後、処理は、ステップＳ１０４へ戻る。
【０２１５】
これに対して、ボトムデータ２０１の指定された行に対する演算が完了した場合（ステップＳ１１２：肯定）、演算部５０は、ボトムデータ２０１の全ての行について演算が終了したか否かを判定する（ステップＳ１１５）。
【０２１６】
演算を行っていない行がある場合（ステップＳ１１５：否定）、演算部５０は、行分演算の完了を第１データ制御部１２及び第２データ制御部１３に通知する。第１データ制御部１２は、ボトムデータ２０１における現在の先頭行からストライド数分先の行を先頭行として指定する。また、第２データ制御部１３は、トップ差分データ２０３における現在の先頭行から１行先の行を先頭行として指定する（ステップＳ１１６）。その後、演算部５０は、ステップＳ１０３へ戻る。
【０２１７】
これに対して、ボトムデータ２０１の全ての行について演算が終了した場合（ステップＳ１１５：肯定）、演算部５０は、畳み込みバックワードの重み差分演算処理を終了する。
【０２１８】
次に、図２１を参照して、畳み込みバックワードのボトム差分演算処理の詳細な流れについて説明する。図２１は、畳み込みバックワードのボトム差分演算のフローチャートである。
【０２１９】
例えば、図４及び図５で示した構成の番号を用いて説明すると、第１データ制御部１２、第２データ制御部１３、演算部５０及びポインタ制御部１６は、カーネルサイズ（あるいはカーネル数）、ストライド数及びボトムデータ２０１の先頭行の指定を取得する（ステップＳ２０１）。
【０２２０】
演算部５０は、トップ差分データ２０３の列数であるトップサイズにストライド数を乗算した数分の積和演算部５０１〜５０３を演算に割り当てる。また、レジスタファイル４３０は、ボトムデータ２０１の列数であるボトムサイズの数分の演算結果格納用のレジスタファイル３０１〜３０３を演算に割り当てる（ステップＳ２０２）。
【０２２１】
ポインタ制御部１６は、レジスタファイル４１０のポインタ１６６及びレジスタファイル４３０の先頭ポインタ１６５を初期化する（ステップＳ２０３）。
【０２２２】
第１データ制御部１２は、指定された先頭行のトップ差分データ２０３の要素データをメモリ１１から読み出しレジスタファイル４１０に格納する。また、第２データ制御部１３は、指定された先頭行からストライド数の行分の重みデータ２０２の要素データをメモリ１１から読み出しレジスタファイル４２０に格納する（ステップＳ２０４）。
【０２２３】
演算部５０の積和演算部５０１〜５０３は、レジスタファイル４１０のポインタ１６６が示すトップ差分データ２０３の要素データを読み込む。また、演算部５０の積和演算部５０１〜５０３は、レジスタファイル４２０の先頭から計算回数番目の重み差分データ２０４の要素データを読み込む（ステップＳ２０５）。
【０２２４】
次に、演算部５０の積和演算部５０１〜５０３は、読み込んだ重み差分データ２０４の要素データに読み込んだトップ差分データ２０３を乗算し、乗算結果を取得する（ステップＳ２０６）。
【０２２５】
次に、演算部５０の積和演算部５０１〜５０３は、レジスタファイル４３０の先頭ポインタ１６５が示す位置から自己の番号分進んだ位置のボトム差分データ２０５の要素データの値を取得する（ステップＳ２０７）。ここで、自己の番号とは、積和演算部５０１〜５０３において、積和演算部を１番としてその後１つずつ連番で数を割当てた番号を指す。
【０２２６】
そして、演算部５０の積和演算部５０１〜５０３は、取得したボトム差分データ２０５に、乗算結果を加算する（ステップＳ２０８）。
【０２２７】
そして、演算部５０の積和演算部５０１〜５０３は、加算結果を、ボトム差分データ２０５を取得したレジスタファイル３０１〜３０３に格納することで更新する（ステップＳ２０９）。
【０２２８】
そして、演算部５０は、トップサイズ分の演算が完了したか否かを判定する（ステップＳ２１０）。トップサイズ分の演算が完了していない場合（ステップＳ２１０：否定）、ポインタ制御部１６は、レジスタファイル４１０のポインタ１６６及びレジスタファイル４３０の先頭ポインタ１６５を１つシフトし（ステップＳ２１１）、ステップＳ２０５へ戻る。
【０２２９】
これに対して、トップサイズ分の演算が完了した場合（ステップＳ２１０：肯定）、演算部５０は、トップ差分データ２０３の指定された行に対する演算が完了したか否かを判定する（ステップＳ２１２）。
【０２３０】
トップ差分データ２０３の指定された行に対する演算が完了していない場合（ステップＳ２１２：否定）、ポインタ制御部１６は、レジスタファイル４１０のポインタ１６６を１つシフトする（ステップＳ２１３）。
【０２３１】
さらに、ポインタ制御部１６は、レジスタファイル４３０の先頭ポインタ１６５をストライド数分シフトする（ステップＳ２１４）。その後、処理は、ステップＳ２０４へ戻る。
【０２３２】
これに対して、トップ差分データ２０３の指定された行に対する演算が完了した場合（ステップＳ２１２：肯定）、演算部５０は、カーネル数分の演算が終了したか否かを判定する（ステップＳ２１５）。
【０２３３】
カーネル数分の演算を行っていない場合（ステップＳ２１５：否定）、演算部５０は、行分演算の完了を第１データ制御部１２及び第２データ制御部１３に通知する。第１データ制御部１２は、ボトムデータ２０１における現在の先頭行の次の行を先頭行として指定する。また、第２データ制御部１３は、トップ差分データ２０３における現在の先頭行の次の行を先頭行として指定する（ステップＳ２１６）。その後、演算部５０は、ステップＳ２０３へ戻る。
【０２３４】
これに対して、カーネル数分の演算が終了した場合（ステップＳ２１５：肯定）、演算部５０は、畳み込みバックワードのボトム差分演算処理を終了する。
【０２３５】
以上に説明したように、本実施例に係る演算処理装置は、演算に使用する行列に並んだデータの１行ずつの演算をまとめて行い、その演算結果を用いて行列に並んだデータ同士の演算を行う。この場合、各演算部は、異なる行の演算を行うため、同じデータを同時に用いることはない。さらに、各演算部に配置された積和演算部は、畳み込みバックワードの重み差分演算の場合、それぞれが異なるボトムデータを読み込み、かつ、全てが同じトップデータを読み込む。また、各演算部に配置された積和演算部は、畳み込みバックワードのボトム差分演算の場合、それぞれが異なるトップ差分データを読み込み、かつ、全てが同じ重みデータを読み込む。これにより、データの読み込み回数を抑えることができ、且つ読み込みのコンフリクトの発生を軽減することができ、効率的にバックワード演算を行うことができる。したがって、コストの増加を抑えつつ演算処理速度を向上させることができる。
【０２３６】
図２２は、複数の演算部によるボトムデータ及びトップデータの指定を説明するための図である。以下では、複数の演算部５０によるボトムデータ２０１及びトップ差分データ２０３の指定の方法を説明する。
【０２３７】
例えば、縦横各々Ｎの画素数を持つＮ×Ｎサイズを有する画像データにおいて、演算部５０は、画像データの左上から指定した行と指定したストライド数に基づいて移動した先の座標点（ｉ、ｊ）を求める。そして、演算部５０は、その座標点と指定されたカーネルサイズｍに基づいて定義される矩形領域としてボトムデータ２０１を読み込む。演算部５０は、この読み込んだボトムデータ２０１を元に畳み込み演算を実施し、１×１サイズへ調節した上でボトムデータ２０１を格納する。そのため、その演算結果であるトップ差分データ２０３のサイズ（以下トップサイズ）は、予め設定したパッド数を用いて、（Ｎ＋２＊ｐａｄ―ｍ）／ストライド数＋１のサイズに調節される。またボトムデータ２０１あるいはトップ差分データ２０３が複数ある場合には全てのデータを連続して演算できるように、そのデータ数を使用するボトムデータ２０１の枚数であるＣｉあるいは算出されるトップ差分データ２０３の枚数であるＣｏで指定することも行なう。
【０２３８】
図２３は、複数の演算部を用いた場合の畳み込み演算の全体のフローチャートである。まず、演算部５０は、図２３で指定したトップサイズ分、例えば（Ｎ＋２＊ｐａｄ―ｍ）／ストライド数＋１の分が、演算の使用に割り当てられる（ステップＳ１１）。
【０２３９】
１つの演算部５０による演算処理は実施例に示した処理と同様である。各演算部５０は、行単位のボトムデータ２０１及び共通の重みデータ２０２を読み込む（ステップＳ１２）。例えば、トップサイズが８であり、ストライド数が１の場合には、最初の演算部５０に対してはｂ００〜ｂ１１が読み込まれ、次の演算部５０に対してはｂ１２〜ｂ２３が読み込まれ、そして８番目の最後の演算部５０に対してはｂ８４〜ｂ９５が読み込まれる。このように行単位でボトムデータ２０１が、各演算部５０に読み込まれる。また、ストライド数が２以上の場合には、各演算部５０に与えるボトムデータ２０１は、ストライド数で指定された行数分を用意される。重みデータについては１行分ずつ追加し、全ての演算部５０に共通のデータとして与えられる。
【０２４０】
そして、ボトムデータ２０１及び１行分の共通の重みデータ２０２を使用して、各演算部５０は、演算処理を行う（ステップＳ１３）。その後、各演算部５０は、それぞれに対応したレジスタファイル４３０にその演算処理結果を格納する（ステップＳ１４）。
【０２４１】
その後、演算部５０は、カーネルサイズ分の演算が終了したか否かを判定する（ステップＳ１５）。カーネルサイズの演算が終了していない場合（ステップＳ１５：否定）、演算部５０は、ボトムデータ２０１の行数をスライド数分シフトする。そして、演算部５０は、シフト先のボトムデータ２０１の要素データと、それぞれに共通の重みデータ２０２とを用いて演算処理を行ない（ステップＳ１６）、ステップＳ１４へ戻る。例えば、最初の演算部５０に対してはｂ１２〜ｂ２３が追加され、次の演算部５０に対してはｂ２４〜ｂ３５が追加され、そして８番目の最後の演算部５０に対してはｂ９６〜ｂ１０７が追加される。すなわち、各演算部５０には、行単位でボトムデータ２０１が読み込まれる。演算部５０は、重みデータ２０２の次の行の要素データを読み込み、同様に演算処理を行ない、その演算処理結果を２回目以降の演算については前回の（２回目のときは最初）の演算結果に加算し格納する。例えば、カーネル数が５の場合には、演算部５０は、５回計算することで、トップ差分データ２０３の値に対する演算が完了し、その演算結果を取得できる。また、特に各演算部５０毎の演算処理となるステップＳ１１〜Ｓ１６については、畳み込みバックワードの重み差分演算の場合の詳細フローは図２０と同じであり、畳み込みバックワードのボトム差分演算の場合の詳細フローは図２１と同じである。
【０２４２】
また、ボトムデータ２０１のデータ数Ｃｉが複数ある場合、演算部５０は、指定したボトムデータ２０１のデータ数、あるいはトップ差分データ２０３の枚数の演算が完了したか否かを判定する（ステップＳ１７）。
【０２４３】
指定したボトムデータ２０１のデータ数、あるいはトップ差分データ２０３の枚数の演算が完了していない場合（ステップＳ１７：否定）、演算部５０は、次のボトムデータ２０１、あるいはトップ差分データ２０３を指定する（ステップＳ１８）。その後、処理は、ステップＳ１２へ戻る。
【０２４４】
一方、指定したボトムデータ２０１のデータ数、あるいはトップ差分データ２０３の枚数の演算が完了した場合（ステップＳ１７：肯定）、演算部５０は、演算処理を終了する。例えばＣｉが２０の場合、演算部５０は、同じ計算を２０回繰り返すことで、同様にトップ差分データ２０３の値に対する演算が完了し、その演算結果を取得できることになる。
【０２４５】
図２４は、複数の演算部を用いた畳み込みフォワード演算のプログラムの記述例を説明するための図である。畳み込みフォワード演算は、図２４に示すようにボトムデータ２０１（ｂｏｔｔｏｍ＿ｙ）とトップ差分データ２０３（ｔｏｐ＿ｘ）とを用いた演算は乗算及び加算で表現できる。畳み込みフォワード演算は、ボトムデータ２０１のデータ数Ｃｉ、トップ差分データ２０３のデータ数Ｃｏ、バッチ数ｍｂ、ストライド数Ｗ及びトップサイズを調節するためのパラメータとなるパッド数ｐａｄを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
【０２４６】
図２５は、複数の演算部を用いた畳み込みバックワードの重み差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードの重み差分演算は、図２５に示すようにボトムデータ２０１（ｂｏｔｔｏｍ＿ｙ）とトップデータ２０２（ｔｏｐ＿ｘ）とを用いた演算は乗算及び加算で表現できる。この場合、重み差分データ（ｅｗ）が算出される。畳み込みバックワードの重み差分演算は、ボトムデータ２０１のデータ数Ｃｉ、トップ差分データ２０３のデータ数Ｃｏ、バッチ数ｍｂ、ストライド数Ｗ及びトップサイズを調節するためのパラメータとなるパッド数ｐａｄを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
【０２４７】
図２６は、畳み込みバックワードのボトム差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードのボトム差分演算は、図２６に示すようにボトムデータ２０１（ｂｏｔｔｏｍ＿ｙ）とトップ差分データ２０３（ｔｏｐ＿ｘ）と用いた演算は乗算及び加算で表現できる。この場合、ボトム差分データ２０５（ｂｏｔｔｏｍ＿ｅｙ）が算出される。畳み込みバックワードのボトム差分演算は、ボトムデータ２０１のデータ数Ｃｉ、トップ差分データ２０３のデータ数Ｃｏ、バッチ数ｍｂ、ストライド数Ｗ及びトップサイズを調節するためのパラメータとなるパッド数ｐａｄを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
【０２４８】
（ハードウェア構成）
図２７は、演算処理装置のハードウェア構成図である。図２７に示すように、演算処理装置１は、メインメモリ９１、ＣＰＵ（Central  Processing  Unit）９２、Ｉ／Ｏ（Input/Output）コントローラ９３、ハードディスク９４及びＧＰＵ９５を有する。さらに、ＧＰＵ９５は、チップ９６及びメモリ９９を有する。そして、チップ９６には、演算器９７及び内蔵メモリ９８が搭載される。
【０２４９】
一例として、ＣＰＵ９２は、ニューラルネットワークを管理するソフトウェアが動作し、そのソフトウェアが使用するボトムデータ２０１や重みデータ２０２がメインメモリ９１に格納される。そして、ニューラルネットワークを管理するソフトウェアが演算をＧＰＵ９５に依頼する。その際、ＧＰＵ９５上の資源を用いて演算が実行できるように、メモリ９９に、ボトムデータ２０１及び重みデータ２０２が移動される。
【０２５０】
演算器９７は、演算部５０の機能を実現する。また、メモリ９９が、メモリ１１の機能を実現する。そして、内蔵メモリ９８は、レジスタファイル４１０，４２０及び４３０の機能を実現する。この場合、演算器９７は、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現する。例えば、メモリ９９に演算部５０、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、演算器９７は、メモリ９９から各種プログラムを読み出し実行することで、演算部５０、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現することができる。このように、上記実施例で説明した各機能はＧＰＵ９５によって実現することができる。
【０２５１】
また、他の例として、ＣＰＵ９２上で動作するニューラルネットワークを管理するソフトウェアが、演算をＣＰＵ９２の他のコアに依頼してもよい。その場合、ＣＰＵ９２が、演算部５０の機能を実現する。また、ハードディスク９４が、メモリ１１の機能を実現する。そして、メインメモリ９１が、レジスタファイル４１０〜４３０の機能を実現する。ハードディスク９４は、Ｉ／Ｏコントローラ９３を介してＣＰＵ９２とデータの送受信を行う。この場合、ＣＰＵ９２は、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現する。例えば、ハードディスク９４に、演算部５０、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、ＣＰＵ９２は、ハードディスク９４から各種プログラムを読み出し実行することで、演算部５０、第１データ制御部１２、第２データ制御部１３及びポインタ制御部１６の機能を実現することができる。このように、上記実施例で説明した各機能を、演算処理装置１が有するＧＰＵ９５以外のＣＰＵ９２を用いて実現することもできる。
【符号の説明】
【０２５２】
１  演算処理装置
１１  メモリ  
１２  第１データ制御部
１３  第２データ制御部
１６  ポインタ制御部
５０〜５３  演算部
２０１  ボトムデータ
２０２  重みデータ
２０３  トップ差分データ
２０４  重み差分データ
２０５  ボトム差分データ
２０６  出力データ
２０７  期待値
２０９  演算結果
３０１〜３０３，３１０〜３１４，３２０〜３３１  レジスタファイル
４１０〜４１３，４２０〜４２３，４３０〜４３３  レジスタファイル
５１０〜５１４，５２０〜５２７  積和演算部
【図１】
2018106559.tif 000003
【図２】
2018106559.tif 000004
【図３】
2018106559.tif 000005
【図４】
2018106559.tif 000006
【図５】
2018106559.tif 000007
【図６】
2018106559.tif 000008
【図７Ａ】
2018106559.tif 000009
【図７Ｂ】
2018106559.tif 000010
【図８Ａ】
2018106559.tif 000011
【図８Ｂ】
2018106559.tif 000012
【図９】
2018106559.tif 000013
【図１０】
2018106559.tif 000014
【図１１】
2018106559.tif 000015
【図１２】
2018106559.tif 000016
【図１３Ａ】
2018106559.tif 000017
【図１３Ｂ】
2018106559.tif 000018
【図１３Ｃ】
2018106559.tif 000019
【図１４Ａ】
2018106559.tif 000020
【図１４Ｂ】
2018106559.tif 000021
【図１５】
2018106559.tif 000022
【図１６】
2018106559.tif 000023
【図１７】
2018106559.tif 000024
【図１８】
2018106559.tif 000025
【図１９】
2018106559.tif 000026
【図２０】
2018106559.tif 000027
【図２１】
2018106559.tif 000028
【図２２】
2018106559.tif 000029
【図２３】
2018106559.tif 000030
【図２４】
2018106559.tif 000031
【図２５】
2018106559.tif 000032
【図２６】
2018106559.tif 000033
【図２７】
2018106559.tif 000034