以下に、本願の開示する演算処理装置及び演算処理装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理装置の制御方法が限定されるものではない。
図1は、深層学習の全体的な流れを説明するための図である。ここで、本実施例では、画像認識のための深層学習について説明する。以下では、畳み込み演算を例に説明するが、ニューラルネットワークの各層で行われる演算は畳み込み演算以外の演算もある。
図1に示すように、演算処理装置1は、入力データ10の入力を受ける。そして、演算処理装置1は、複数の演算処理層を有する。各演算処理層では、それぞれ異なる特徴点の抽出などの演算処理を行う。演算処理装置1は、取得した入力データ10に対して第1層である演算処理層101で重みデータを用いて畳み込み演算を実行する。ここで、重みデータは、フィルタにあたる。次に、演算処理装置1は、演算処理層101からの特徴量でもある出力データ20に対して第2層である演算処理層102で重みデータを用いて畳み込み演算を行う。演算処理装置1は、このように各層での演算処理を順次行っていき、第n層である演算処理層103での重みデータを用いた畳み込み演算の演算結果を特徴量でもある出力データ20として出力する。このようにして、例えば、入力データ10を入力画像とすれば、各層での出力データ20は、画像認識のための特徴量として取得でき、各層で取得した特徴量を用いて繰り返しパラメータ更新する深層学習をさせることで、画像認識の精度は向上し、演算処理装置1は、画像認識を行うことができる。また、例えば、音声認識の場合には、入力データ10は、音声データ、テキストマイニングの場合には入力データ10は単語となる。ここで説明した、演算処理装置1による矢印P1へ向かう方向の畳み込み演算による演算処理は、「畳み込みフォワード演算」と呼ばれる場合がある。
さらに、演算処理装置1は、各層における特徴点の抽出の精度を上げるために、期待値の差分を用いて重みデータの変更を行う。例えば、演算処理装置1は、予め決められた期待値を有し、第n層である演算処理層103からの出力データ20と期待値とを比較する。そして、演算処理装置1は、出力データ20と期待値との差分を求め、その求めた差分及びn−1層からの入力データ10を用いて重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた重みデータの期待値との差分を用いて重みデータを修正する。そして、演算処理装置1は、修正した重みデータ及び出力データ20と期待値との差分を用いて第n−1層における重みデータを修正するためのデータであるトップ差分データを求める。次に、演算処理装置1は、n−2層からの入力データ10に対して、求めた第n−1層の出力データ20と第n−1層における出力の期待値との差分を用いて第n−1層の重みデータを修正する。
ここで、矢印P1方向を各層の並び方向とすると、演算処理装置1は、特定の演算処理層の1つ前の演算処理層において特定の演算処理層におけるトップ差分データを算出する。そして、演算処理装置1は、算出した特定の演算処理層におけるトップ差分データと1つ前の演算処理装置1からの出力データ20とを用いて、特定の演算処理層における重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた特定の演算処理層における重みデータの期待値との差分を用いて重みデータを修正する。その後、演算処理装置1は、修正した特定の演算処理層における重みデータと特定の演算処理層における出力データ20と期待値との差分とを用いて、特定の演算処理層の1つ前の演算処理層におけるトップ差分データを算出する。
演算処理装置1は、各演算処理層における重みデータの修正及び1つ前の演算処理層におけるトップ差分データの算出を順次繰り返す。これにより、演算処理装置1は、演算処理層101〜103の全ての層の重みデータを演算処理層103の出力データ20の期待値に合わせて修正することができる。ここで説明した、演算処理装置1による矢印P2へ向かう方向の各演算処理層における重みデータを修正するための演算処理は、「畳み込みバックワード演算」と呼ばれる場合がある。
以下では、特定の演算処理層における畳み込みフォワード演算に用いる入力データを、「ボトムデータ」という。ボトムデータは、特定の演算処理層の1つ前の演算処理層からの出力データにあたる。また、特定の演算処理層における重みデータの期待値との差分のデータを、「重み差分データ」という。また、特定の演算処理装置における畳み込みバックワード演算の演算結果のデータを「ボトム差分データ」という。さらに、特定の演算処理層において畳み込みバックワード演算において重みデータの修正に用いられる元データを、「トップ差分データ」という。ここで、特定の演算処理層における畳み込みバックワード演算の算出結果は、特定の演算処理層の1つ前の演算処理層の畳み込みバックワード演算の元データとして用いられる。すなわち、特定の演算処理層において算出されたボトム差分データは、特定の演算処理層の1つ前の演算処理層のトップ差分データにあたる。
また、畳み込みバックワード演算において、トップ差分データとボトムデータとを用いて重み差分データを求める演算を、「畳み込みバックワードの重み差分演算」という。さらに、修正された重みデータとトップ差分データとを用いてボトム差分データを算出する演算を、「畳み込みバックワードのボトム差分演算」という。
さらに、本実施例では、ボトムデータ及び重みデータを正方形に行列として並んだ要素データを有する場合で説明する。そこで、以下では、重みデータの行数及び列数を「カーネル数」あるいはカーネル数に応じた単位として「カーネルサイズ」という。ただし、ボトムデータ及び重みデータは、それぞれ長方形でもよい。また、畳み込みフォワード演算における重みデータの1回の移動量、並びに、畳み込みバックワード演算におけるトップ差分データの1回の移動量及び重みデータの1回の移動量を「ストライド数」という場合がある。また、行方向及び列方向いずれにも、ストライド数分の一回の移動が行われる。
図2は、畳み込みフォワード演算及びバックワード演算を説明するための図である。図2では、入力データ10を用いて演算処理を始める第1層から出力データ206と期待値207からトップ差分データ203を生成する第n層までを記載した。ここでは、演算処理層101を第1層とし、演算処理層104を第n−1層とし、演算処理層103を第n層として、第n層まで各演算処理層101〜104における演算を例に記載した。また、図2中の円で記載した処理は演算処理を表す。演算処理F1は、畳み込みフォワード演算を表す。演算処理F2は、畳み込みバックワードの重み差分演算を表す。また、演算処理F3は、畳み込みバックワードのボトム差分演算を表す。
演算処理装置1は、演算処理層101において入力データ10及び第1層での重みデータ202に対して演算処理F1で表される畳み込みフォワードを行い、演算結果209を算出する。その後は、図示しないが、同様に次の第2層において、前の層の演算結果209及び第2層での重みデータ202に対して同様に演算処理F1で表される畳み込みフォワード演算を行う。これらを繰り返し、最後の第n層である演算処理層103は、同様に演算処理層104の演算結果209から取得したボトムデータ201及び第n層での重みデータ202に対して演算処理F1で表される畳み込みフォワード演算を行う。さらに、演算処理層103は、出力データ206と期待値207とを比較して、トップ差分データ203を算出する。ここで、入力データ10は、第2層〜第n層におけるボトムデータ201にあたるため、以下では、第1層のボトムデータ201として扱う。また、第n層の出力データ20は、第1層〜第n−1層における演算結果209にあたる。
さらに続けて、バックワード演算を説明すると、演算処理装置1は、演算処理層103において、トップ差分データ203及びボトムデータ201に対して演算処理F2で表される畳み込みバックワードの重み差分演算を行い、重み差分データ204を算出する。さらに、演算処理装置1は、重み差分データ204を用いて重みデータ202を更新する。ここで、図2における破線の矢印が重みデータ202の更新の処理を表す。具体的には、演算処理装置1は、重み差分データ204に学習率を乗算して、新たな重みデータ202を算出する。
また、演算処理装置1は、フォワード演算で使用した重みデータ202及びトップ差分データ203に対して演算処理F3で表される畳み込みバックワードのボトム差分演算を行い、ボトム差分データ205を算出する。
ここで、図2では、最後の層である演算処理層103を例に図示したが、他の層においても同様の演算が行われる。ただし、他の層では、演算処理装置1は、トップ差分データ203として1つ後の層で算出されたボトム差分データ205を用いる。
次に、図3を参照して、演算処理装置1の詳細について説明する。図3は、演算処理装置のブロック図である。図3に示すように、演算処理装置1は、記憶装置としてのメモリ11、第1データ制御部12、第2データ制御部13、レジスタファイル(RF:Register File)411〜413,421〜423及び431〜433を有する。また、演算処理装置1は、演算部51〜53及びポインタ制御部16を有する。
ここで、レジスタファイル411〜413は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル411〜413を区別しない場合、「レジスタファイル410」という。また、レジスタファイル421〜423は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル421〜423を区別しない場合、「レジスタファイル420」という。また、レジスタファイル431〜433は、いずれも同じ機能を有する。そこで、以下では、レジスタファイル431〜433を区別しない場合、「レジスタファイル430」という。また。演算部51〜53は、いずれも同じ機能を有する。そこで、以下では、演算部51〜53を区別しない場合、「演算部50」という。
メモリ11は、計算に用いる各種データを格納する記憶部である。例えば、メモリ11は、ボトムデータ201及び重みデータ202を格納する。さらに、メモリ11は、後述する演算部51〜53により算出されたトップ差分データ203及び重み差分データ204も格納する。
レジスタファイル410,420及び430は、演算時に演算に用いるデータが一時的に格納される記憶部である。レジスタファイル410,420及び430は、本実施例では、各演算部50にそれぞれ1つずつの3つが割り当てられる。
レジスタファイル410は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる一方のデータを格納する。また、レジスタファイル420は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる他方のデータを格納する。さらに、レジスタファイル430は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算における演算結果が格納される。
第1データ制御部12は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ11からデータを読み出し、各演算部50に対応するレジスタファイル410それぞれに格納する。
第1データ制御部12は、畳み込みフォワード演算の場合、演算に用いるボトムデータ201の要素データをメモリ11から読み込み、各演算部50に対応するレジスタファイル410それぞれに格納する。
畳み込みバックワードの重み差分演算の場合、第1データ制御部12は、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、指定された先頭位置からボトムデータ201の要素データを1行ずつメモリ11から読み込み、各演算部50に対応するレジスタファイル410に格納する。
ここで、畳み込みバックワード演算を行う場合、トップ差分データ203は、その1行1列の位置をボトムデータ201の1行1列の位置に合わせた位置から行方向にストライド数ずつ移動される。以下では、1行1列を一致させた位置を初期位置という。そして、トップ差分データ203は、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数まで、ボトムデータ201の初期位置から行方向にストライド数ずつ移動される。以下では、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数を、「最大移動数」という。
第1データ制御部12は、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の数分まで繰り返す。ただし、レジスタファイル410の個数が最大移動数分以上ある場合、第1データ制御部12は、最大移動数分行うと、要素データの読込及びレジスタファイル410への格納を終了する。
次に、レジスタファイル410に格納した要素データを用いた演算が完了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置をストライド数分列方向に移動させ、ボトムデータ201の要素データの1行ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。ボトムデータ201とトップ差分データ203とが正方形である場合、列方向にストライド数分ずつ初期位置からトップ差分データ203を移動させると、最大移動数の回数の移動を行うと、トップ差分データ203は、ボトムデータ201からはみ出す。そこで、第1データ制御部12は、最大移動数の回数、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納を繰り返す。
第1データ制御部12は、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納が、最大移動数回終了していない場合、同様の処理を最大移動数の回数に達するまで繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、第1データ制御部12は、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、トップ差分データ203の要素データを1行ずつ読み込み、各演算部50に対応するそれぞれのレジスタファイル410に格納する。
第1データ制御部12は、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の個数分繰り返す。ただし、レジスタファイル410の個数がトップ差分データ203の行数分以上ある場合、第1データ制御部12は、行数分行うと、要素データの読込及びレジスタファイル410への格納を終了する。
次に、レジスタファイル410に格納した要素データを用いた演算が終了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置を1行下の行に移動させ、トップ差分データ203の要素データを1行ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。第1データ制御部12は、重みデータ202の行数、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納を繰り返す。
第1データ制御部12は、トップ差分データ203の要素データの1行ずつの読み込み及びレジスタファイル410への格納が、最大移動数回終了していない場合、同様の処理を最大移動回数に達するまで繰り返す。
第2データ制御部13は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ11からデータを読み出し、各演算部50に対応するレジスタファイル420に格納する。
第2データ制御部13は、畳み込みフォワード演算の場合、演算に用いる重みデータ202の要素データを、配置されたレジスタファイル420の数分だけメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。
また、畳み込みバックワードの重み差分演算の場合、第2データ制御部13は、要素データの読み込みの先頭位置としてトップ差分データ203の先頭の指定を受ける。そして、第2データ制御部13は、指定された先頭位置から1行分のトップ差分データ203の要素データを、配置されたレジスタファイル420の数分だけメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。すなわち、第2データ制御部13は、各演算部50に対応するレジスタファイル420の全てに同じ要素データを格納する。
レジスタファイル420に格納した要素データを用いた演算が終了した後、第2データ制御部13は、行分演算の終了の通知を演算部50から受ける。そして、第2データ制御部13は、トップ差分データ203における読み込みの先頭位置を1行下の行の先頭に移動する。そして、第2データ制御部13は、先頭位置から1行分のトップ差分データ203の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込み、レジスタファイル420に格納する。第2データ制御部13は、先頭位置からの1行分の要素データの読み込み及びレジスタファイル420への格納を繰り返す。
第2データ制御部13は、最大移動数の回数、要素データの読み込み及びレジスタファイル420への格納を行った時点で、演算処理が終了していない場合、トップ差分データ203における読み込みの先頭位置をトップ差分データ203の先頭に移動する。そして、第2データ制御部13は、演算処理が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、第2データ制御部13は、要素データの読み込みの先頭位置として重みデータ202の先頭の指定を受ける。そして、第2データ制御部13は、指定された先頭位置から1行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。すなわち、第2データ制御部13は、各演算部50に対応するレジスタファイル420の全てに同じ要素データを格納する。
レジスタファイル420に格納した要素データを用いた演算が終了した後、第2データ制御部13は、行分演算の終了の通知を演算部50から受ける。そして、第2データ制御部13は、重みデータ202における読み込みの先頭位置を1行下の行の先頭に移動する。そして、第2データ制御部13は、先頭位置から1行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込み、レジスタファイル420に格納する。第2データ制御部13は、先頭位置からの1行分の要素データの読み込み及びレジスタファイル420への格納を繰り返す。
第2データ制御部13は、最大移動数の回数、要素データの読み込み及びレジスタファイル420への格納を行った時点で、演算処理が終了していない場合、重みデータ202における読み込みの先頭位置を重みデータ202の先頭に移動する。そして、第2データ制御部13は、演算処理が終了するまで、同様の処理を繰り返す。
演算部50は、レジスタファイル410及び420に格納された要素データを用いて、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算を実行し、演算結果をレジスタファイル430に格納する。図4は、演算部の詳細を表すブロック図である。
図4に示すように、演算部50は、並列に配置されたFMAの演算を行う積和演算部501〜503を有する。各積和演算部501〜503は、異なる計算経路を形成する。演算部50は、行う演算に合わせて使用する積和演算部501〜503の数を変更することができる。また、レジスタファイル430は、積和演算部501〜503に対応するレジスタファイル301〜303を有する。以下に、演算部50による畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算の詳細を説明する。
畳み込みバックワードの重み差分演算の場合、演算部50は、算出する重みデータ202のカーネル数の積和演算部501〜503を使用して以下の演算を繰り返す。積和演算部503は、重みデータ202のカーネル数個目の積和演算部である。この場合、レジスタファイル410には、ボトムデータ201の1行分のデータが行の先頭から順に格納される。また、レジスタファイル420には、トップ差分データ203の1行分のデータが行の先頭から順に格納される。
演算部50は、レジスタファイル410に格納されたボトムデータ201における先頭ポインタの位置の指定をポインタ制御部16から受ける。より詳しくは、演算部50は、最初にレジスタファイル410に格納されたボトムデータ201の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から受ける。その後、演算部50は、1回の積和演算を計算する毎に、レジスタファイル410に格納されたボトムデータ201の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から順次受ける。演算部50は、行の最後の要素データからカーネル数前の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部16から受ける。
積和演算部501は、レジスタファイル410におけるポインタ制御部16により指定された先頭ポインタの位置のボトムデータ201の要素データを読み込む。続いて、積和演算部502〜503は、順次先頭ポインタから1つずつ進めた位置のボトムデータ201の要素データを読み込む。具体的には、また、積和演算部502は、先頭ポインタの位置から1つ進めた位置のボトムデータ201の要素データを読み込む。また、積和演算部503は、先頭ポインタの位置からカーネル数分進めた位置のボトムデータ201の要素データを読み込む。
また、演算部50は、レジスタファイル420に格納されたトップ差分データ203における先頭ポインタの位置の指定をポインタ制御部16から受ける。より詳しくは、演算部50は、最初にレジスタファイル420に格納されたトップ差分データ203の行の先頭の要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から受ける。その後、演算部50は、1回の積和演算を計算する毎に、レジスタファイル420に格納されたトップ差分データ203の行のストライド数進んだ要素データを指定する先頭ポインタの位置の入力をポインタ制御部16から順次受ける。演算部50は、行の最後の要素データを超えない最も後ろの位置に先頭ポインタが達するまで、更新された先頭ポインタの位置の入力をポインタ制御部16から受ける。
積和演算部501〜503は、レジスタファイル420におけるポインタ制御部16により指定された先頭ポインタの位置のトップ差分データ203の要素データを読み込む。すなわち、積和演算部501〜503は、同じトップ差分データ203の要素データを読み込む。
そして、積和演算部501〜503は、読み込んだボトムデータ201の要素データとトップ差分データ203の要素データとを乗算する。次に、積和演算部501〜503は、対応するレジスタファイル311〜313に格納されたデータを読み出す。そして、積和演算部501〜503は、読み出したデータと乗算結果を加算し、対応するレジスタファイル311〜313に格納する。ここで、レジスタファイル311〜313は、初期値として0が格納される。積和演算部501は、先頭ポインタが最後の位置に達するまで計算を繰り返す。
各レジスタファイル311〜313に格納された値が、重み差分データ204の1行のそれぞれの値の算出の中間値にあたる。
この計算により、演算部50は、ボトムデータ201の1行に対してトップ差分データ203を先頭に重ね、その後スライド数分ずつずらしながら重なった各要素データの積を合計する積和演算を行い、各積和演算の結果の合計を求める行分演算が行える。行分演算が完了すると、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に送信する。その後、演算部50は、レジスタファイル410及び420に新たに格納された要素データを用いて重み差分積和演算を繰り返す。ここで、演算部50は、畳み込みバックワードの重み差分演算を最大移動数分行う間、各行の要素データにおいて先頭からの位置が同じ要素データを用いた重み差分積和演算の結果を、レジスタファイル430の同じ位置の値に加算していく。この計算を、畳み込みバックワードの重み差分演算を最大移動数の回数繰り返すことで、レジスタファイル311〜313に格納された中間値に順次値が加算され、最終的に、重み差分データ204の1行分の値が算出される。
畳み込みバックワードの重み差分演算を最大移動数分行った場合、演算部50は、演算結果をメモリ11が有する重み差分データ204に格納する。その後、全ての重み差分データ204の算出が終わっていなければ、演算部50は、新たな重み差分データ204の要素データの算出として、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、演算部50は、トップ差分データ203の列数の積和演算部501〜503を使用して以下の演算を繰り返す。積和演算部503は、トップ差分データ203の列数個目の積和演算部である。また、演算部50は、レジスタファイル430の中の算出するボトム差分データ205の行数のレジスタファイル301〜303を用いる。
レジスタファイル410には、トップ差分データ203の1行分のデータが行の先頭から順に格納される。また、レジスタファイル420には、重みデータ202の1行分のデータが行の先頭から順に格納される。
演算部50は、レジスタファイル420に格納された重みデータ202の行の先頭の要素データから順に計算毎にストライド数ずつ進んだ要素データを示す先頭ポインタの指定をポインタ制御部16から受ける。また、演算部50は、レジスタファイル431に格納されたボトム差分データ205の行の先頭から順に計算毎にストライド数ずつ進んだ要素データを示すポインタの指定をポインタ制御部16から受ける。
積和演算部501〜503は、レジスタファイル410に格納されたトップ差分データ203のポインタが示す位置から順に要素データを読み込む。すなわち、積和演算部501〜503は、トップ差分データ203の1行分のそれぞれ異なる値を格納する。
また、積和演算部501〜503のうち先頭及び先頭からストライド数番目ずつの積和演算部は、レジスタファイル420に格納された重みデータ202の行の先頭から計算毎にストライド数ずつ進めた位置の要素データの読み込みを繰り返す。また、積和演算部501〜503のうち先頭のストライド数内の所定番目及びそこからストライド数番目ずつの積和演算部は、重みデータ202の1行のうちの先頭ポインタの位置から計算毎にストライド数ずつ進めた要素データの読み込みを計算毎に繰り返す。このように、積和演算部501〜503は、先頭からストライド数番目の1つ手前の積和演算部が、要素データを読み込むまで1つずつずらした要素データの読み込みを行う。
そして、積和演算部501〜503は、読み込んだトップ差分データ203の要素データ及び重みデータ202を乗算する。そして、積和演算部501〜503は、レジスタファイル430が有するレジスタファイル301〜303に設定された先頭ポインタから計算毎にストライド数ずつ進めたレジスタフィル301〜303からデータを取得する。言い換えれば、積和演算部501〜503は、自己に対応するレジスタファイル301〜303のうち計算回数から1を減算した数にストライド数を乗算した数番目のレジスタファイル301〜303の値を取得し、乗算結果を加算して、値の取得元に格納する。ただし、格納するレジスタファイル301〜303を表す番号が配置されたレジスタファイル301〜303の数を超えた場合、すなわち、ボトム差分データ205の列数を超えた場合、積和演算部501〜503は、超えた分の数番目のレジスタファイル301〜303に対して値の読み込み及び格納を行う。
例えば、積和演算部501は、1番目のレジスタファイル301に対応する。そこで、ストライド数1であれば、積和演算部501は、1回目の計算では、レジスタファイル301の値を取得して乗算結果を加算した値を格納し直す。2回目の計算では、積和演算部501は、レジスタファイル302の値を取得し乗算結果を加算した値を格納し直す。また、ストライド数が2であれば、1回目の計算は同じであるが、2回目の計算では、積和演算部501は、3番目のレジスタファイル301〜302の値を取得し乗算結果を加算した値を格納し直す。
積和演算部501〜503は、レジスタファイル420に格納されたトップ差分データ203の1行分の要素データ全てについて重み差分積和演算を行うまで同様の処理を繰り返し行分演算を行う。
この行分演算を重みデータ202の行数分行った場合、演算部50は、演算結果をメモリ11が有するボトム差分データ205に格納する。その後、全てのボトム差分データ205の算出が終わっていなければ、演算部50は、新たなボトム差分データ205の要素データの算出として、同様の処理を繰り返す。
さらに、図1の最終層の第n層である演算処理層103の場合、演算部50は、出力データをモニタなどの出力装置(不図示)へ出力しユーザに演算結果を提供する。例えば、画像認識の場合、演算部50は、認識結果を出力装置へ出力する。
ポインタ制御部16、畳み込みバックワードの重み差分演算の場合、最初にレジスタファイル410における先頭ポインタを、レジスタファイル410に格納されたボトムデータ201の先頭に設定する。また、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420に格納されたトップ差分データの先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル410における先頭ポインタをトップ差分データ203の行においてストライド数分移動した位置に設定する。また、ポインタ制御部16は、レジスタファイル420におけるポインタを1つ移動した位置に設定する。そして、レジスタファイル410における先頭ポインタの移動をボトムデータ201の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル410の先頭に戻す。すなわち、レジスタファイル410における先頭ポインタは、ボトムデータ201の次の行の先頭に設定される。また、ポインタ制御部16は、レジスタファイル420におけるポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420におけるポインタは、トップ差分データ203の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードの重み差分演算が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420に格納された重みデータ202の行の先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル420における先頭ポインタを重みデータ202の行上でストライド数分移動した位置に設定する。そして、レジスタファイル420における先頭ポインタの移動を重みデータ202の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420における先頭ポインタは、重みデータ202の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードのボトム差分演算が終了するまで、同様の処理を繰り返す。
さらに、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算について詳細に説明する。
まず、図5を参照して、畳み込みバックワードの重み差分演算を実行する場合について説明する。図5は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図5では、演算処理装置1は、12行12列に要素データが並んだボトムデータ201及び8行8列に要素データが並んだトップ差分データ203を用いる。ボトムデータ201は、要素データb00〜b143を有する。また、トップ差分データ203は、ボトムデータ201及び5行5列の重みデータ202を用いて、ストライド数が1の場合に求められたものとし、要素データt00〜t63を有する。さらに、重み差分データ204は、5行5列となり、その各要素データをw00〜w24と表す。
さらに、本実施例では、重み差分データ204の行数の演算部50が用いられる。これにより、演算部50は、行方向への移動を行うことで、全てのボトムデータ201に対する畳み込みバックワード重み差分演算を行うことができる。例えば、図5では、5個の演算部51〜53が用いられる。また、本実施例では、各演算部50は、5つの積和演算部511〜514を有する。積和演算部511〜514は、図4における積和演算部501〜503にあたる。さらに、レジスタファイル431〜433は、それぞれ内部に5つのレジスタファイル310〜314を有する。レジスタファイル310〜314は、図4におけるレジスタファイル301〜303にあたる。
第1データ制御部12は、畳み込みバックワードの重み差分演算で用いるボトムデータ201及びトップ差分データ203のサイズを予め記憶する。例えば、第1データ制御部12は、表示装置及び入力装置を用いて設定された設定値により、ボトムデータ201及びトップ差分データ203のサイズ(あるいはカーネル数)を取得して記憶する。
第1データ制御部12は、ボトムデータ201における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データb00〜b11のデータを読み込む。そして、第1データ制御部12は、要素データb00〜b11をボトムデータ格納用のレジスタファイル411に格納する。
また、第1データ制御部12は、ボトムデータ201における次の1行の要素データをメモリ11から読み込む。そして、第1データ制御部12は、ボトムデータ格納用のレジスタファイル412に読み込んだ要素データを格納する。例えば、第1データ制御部12は、要素データb12〜b23をボトムデータ格納用のレジスタファイル412に格納する。
このように、第1データ制御部12は、重み差分データ204の行数、1行毎の要素データのメモリ11から読み込み及び異なるボトムデータ格納用のレジスタファイル411〜413(以降、これを単にレジスタファイル411,412,413とする。)への格納を繰り返す。例えば、第1データ制御部12は、要素データb48〜b59をレジスタファイル413に格納する。
また、第2データ制御部13は、トップ差分データ203における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第2データ制御部13は、トップ差分データ203の要素データt00〜t07をメモリ11から読み込む。そして、第2データ制御部13は、レジスタファイル421〜423に要素データt00〜t07を格納する。
ここで、演算部51を例に演算部50による計算を説明する。積和演算部510〜514は、レジスタファイル411に格納されたボトムデータ201の1行のうちの先頭ポインタが示す要素データから順にそれぞれ異なる5つの要素データb00〜b04を読み込む。ここで、読み込む要素データの数は、重み差分データ204の数である。さらに、積和演算部510〜514は、レジスタファイル421に格納されたトップ差分データ203の1行のうちの先頭ポインタが示す要素データt00を読み込む。そして、積和演算部510〜514は、ボトムデータ201の要素データとトップ差分データ203の要素データ203とを乗算する。さらに、積和演算部510〜514は、レジスタファイル430の中の対応するレジスタファイル310〜314に格納された値にそれぞれ乗算結果を加算する。
次に、レジスタファイル411における先頭ポインタが1つ移動される。また、レジスタファイル412における先頭ポインタが1つ移動される。そして、積和演算部510〜514は、それぞれレジスタファイル411に格納されたボトムデータ201の1行のうちの移動された先頭ポインタが示す要素データから5つの要素データb01〜b05を読み込む。さらに、積和演算部510〜514は、レジスタファイル421に格納されたトップ差分データ203の1行のうちの更新された先頭ポインタが示す要素データt01を読み込む。そして、積和演算部510〜514は、ボトムデータ201の要素データとトップ差分データの要素データとを乗算する。さらに、積和演算部510〜514は、レジスタファイル431の中の対応するレジスタファイル310〜314に格納された値にそれぞれ乗算結果を加算する。
このように、積和演算部510〜514は、計算毎にレジスタファイル411において1つずつ移動される先頭ポインタの位置から5つの要素データをそれぞれ読み込むことを繰り返す。さらに、積和演算部510〜514は、計算毎にレジスタファイル412において1つずつ移動される先頭ポインタが示す要素データを読み込むことを繰り返す。そして、積和演算部510〜514は、読み込んだ要素データを乗算し、乗算結果を対応するレジスタファイル310〜314に加算していくことを繰り返す。
これにより、積和演算部510は、b00×t00+b01×t01+・・・b07×t07を算出する。同様に、積和演算部511は、b01×t00+b02×t01+・・・b08×t07を算出する。積和演算部512は、b02×t00+b03×t01+・・・b09×t07を算出する。同様に、積和演算部513は、b03×t00+b04×t01+・・・b10×t07を算出する。そして、積和演算部514は、b04×t00+b05×t01+・・・b011×t07を算出する。レジスタファイル310〜314には、重み差分データ204の要素データw00〜w05の計算途中の中間値が格納される。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果であるw06〜09,・・・,w20〜w24の中間値をそれぞれ演算結果格納用のレジスタファイル432〜433に格納する。
次に、第1データ制御部12により、レジスタファイル411には、ストライド数分先の行の要素データb12〜b23が格納され、レジスタファイル412には、ストライド数分先の行の要素データb24〜b35が格納され、レジスタファイル413には、要素データb36〜b47が格納される。また、第2データ制御部13により、レジスタファイル421〜423には、要素データt08〜t15が格納される。
演算部51は、1回目と同様に、レジスタファイル411に格納された要素データb12〜b23とレジスタファイル421に格納された要素データt08〜t15とを用いて畳み込みバックワードの重み差分演算を行う。積和演算部510〜514は、対応するレジスタファイル310〜314に格納された値に算出結果を足し込んでいくことで、重み差分データ204の要素データw00〜w05の中間値を更新する。演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果を足し込んでいくことで、演算結果としてレジスタファイル432〜433に格納された重み差分データ204の要素データw06〜09,・・・,w20〜w24の中間値を更新する。
このように、第1データ制御部12は、ボトムデータ201の先頭の行から順にストライド数ずつ先の行の要素データをレジスタファイル410に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル420に格納する。同様に、第1データ制御部12及び第2データ制御部13は、1行ずつずらした行を先頭にしてレジスタファイル411〜413及び421〜423に各要素データを格納する。そして、演算部51〜53は、レジスタファイル411〜413及び421〜423に格納された要素データを用いて重み差分演算を実行する。これにより、レジスタファイル431〜433それぞれのレジスタファイル311〜313に重み差分データ204の要素データw00〜w24が格納される。各演算部51〜54は、算出したレジスタファイル431〜433それぞれのレジスタファイル311〜313の値を、メモリ11に重み差分データ204の要素データw00〜w24として格納する。
ここで、図6を参照して、図5における畳み込みバックワードの重み差分演算時のレジスタファイル411からの要素データの読み出しについて詳細に説明する。図6は、畳み込みバックワードの重み差分演算時の要素データの読み出しを説明するための図である。状態461〜468はそれぞれ、演算部51による、ボトムデータ201の最初の1列を読み込んだ際の1〜8回目の計算時の状態を表す。ここでは、一例として、レジスタファイル411が、配列450〜454という5列の配列を有する。
積和演算部510〜514がレジスタファイル411から所望の要素データを読み出すためには、実際には、図6に示すクロスバスイッチ470が配置される。そして、図6における状態461〜468は、要素データb00〜b11がレジスタファイル411に格納された場合の1〜8回目の計算時のそれぞれの状態を表す。
各状態461〜468では、ポインタ制御部16は、太枠で囲んだ要素データの先頭に先頭ポインタを配置する。そして、各状態461〜468において太枠で囲んだ要素データがその計算において読み出される要素データとなる。
状態461で示される1回目の計算では、ポインタ制御部16は、要素データb00に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb00を配列450から取得する。積和演算部511は、先頭ポインタから2番目の要素データb01を配列451から取得する。積和演算部512は、先頭ポインタから3番目の要素データb02を配列452から取得する。積和演算部513は、先頭ポインタから4番目の要素データb03を配列453から取得する。積和演算部514は、先頭ポインタから5番目の要素データb04を配列454から取得する。
状態462で示される2回目の計算では、ポインタ制御部16は、先頭ポインタを1つ進め要素データb01に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb01を配列451から取得する。積和演算部511は、先頭ポインタから2番目の要素データb02を配列452から取得する。積和演算部512は、先頭ポインタから3番目の要素データb03を配列453から取得する。積和演算部513は、先頭ポインタから4番目の要素データb04を配列454から取得する。積和演算部514は、先頭ポインタから5番目の要素データb05を配列450から取得する。
状態463で示される3回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb02に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb02を配列452から取得する。積和演算部511は、先頭ポインタから2番目の要素データb03を配列453から取得する。積和演算部512は、先頭ポインタから3番目の要素データb04を配列454から取得する。積和演算部513は、先頭ポインタから4番目の要素データb05を配列450から取得する。積和演算部514は、先頭ポインタから5番目の要素データb06を配列451から取得する。
状態464で示される4回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb03に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb03を配列453から取得する。積和演算部511は、先頭ポインタから2番目の要素データb04を配列454から取得する。積和演算部512は、先頭ポインタから3番目の要素データb05を配列450から取得する。積和演算部513は、先頭ポインタから4番目の要素データb06を配列451から取得する。積和演算部514は、先頭ポインタから5番目の要素データb07を配列452から取得する。
状態465で示される5回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb04に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb04を配列454から取得する。積和演算部511は、先頭ポインタから2番目の要素データb05を配列450から取得する。積和演算部512は、先頭ポインタから3番目の要素データb06を配列451から取得する。積和演算部513は、先頭ポインタから4番目の要素データb07を配列452から取得する。積和演算部514は、先頭ポインタから5番目の要素データb08を配列453から取得する。
状態466で示される6回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb05に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb05を配列450から取得する。積和演算部511は、先頭ポインタから2番目の要素データb06を配列451から取得する。積和演算部512は、先頭ポインタから3番目の要素データb07を配列452から取得する。積和演算部513は、先頭ポインタから4番目の要素データb08を配列453から取得する。積和演算部514は、先頭ポインタから5番目の要素データb09を配列454から取得する。
状態467で示される7回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb06に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb06を配列451から取得する。積和演算部511は、先頭ポインタから2番目の要素データb07を配列452から取得する。積和演算部512は、先頭ポインタから3番目の要素データb08を配列453から取得する。積和演算部513は、先頭ポインタから4番目の要素データb09を配列454から取得する。積和演算部514は、先頭ポインタから5番目の要素データb10を配列450から取得する。
状態468で示される8回目の計算では、ポインタ制御部16は、先頭ポインタをさらに1つ進め要素データb07に先頭ポインタを配置する。積和演算部510は、先頭ポインタが示す要素データb07を配列452から取得する。積和演算部511は、先頭ポインタから2番目の要素データb08を配列453から取得する。積和演算部512は、先頭ポインタから3番目の要素データb09を配列454から取得する。積和演算部513は、先頭ポインタから4番目の要素データb10を配列450から取得する。積和演算部514は、先頭ポインタから5番目の要素データb11を配列451から取得する。
このように、5つの配列450〜454を用いることで、積和演算部510〜514は、異なる配列450〜454から要素データを読み出すため、コンフリクトを起さず要素データを読み出すことができる。そして、積和演算部510〜514は、状態461〜468で読み込んだ要素データを用いて積和演算を行うことで、1行分の積和演算を実行する。
ここで、図7A、7B、8A及び8Bを参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図7A及び7Bは、畳み込みバックワードの重み差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図8A及び8Bは、畳み込みバックワードの重み差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、演算部51〜53が5つ存在し、それぞれが5つの積和演算部510〜514を有する場合で説明する。演算部53は、5番目の演算部とする。また、レジスタファイル411〜413は、演算部51〜53に対応して5つ存在する場合で説明する。レジスタファイル413は、5番目のレジスタファイルとする。この場合も、12行12列のボトムデータ201及び5行5列の重みデータ202を用いて畳み込みフォワード演算を行い算出したトップ差分データ203を使用する。
ストライド数が1の場合、最初に、図7Aの状態471に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb48〜b59が格納される。さらに、レジスタファイル421〜423には、要素データt00〜t07が格納される。
演算部51の積和演算部510は、計算毎に要素データb00〜b07をレジスタファイル411から順次読み込む。また、演算部51の積和演算部511は、計算毎に要素データb01〜b08をレジスタファイル411から順次読み込む。また、演算部51の積和演算部514は、計算毎に要素データb04〜b11をレジスタファイル411から順次読み込む。演算部52〜53のそれぞれの各積和演算部510〜514も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部510〜514は、それぞれ対応するレジスタファイル421〜423から要素データt00〜t07を計算毎に順次読み込む。そして、演算部51〜53の各積和演算部510〜514は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
次に、状態471の演算が終了すると、状態472に示すように、レジスタファイル411〜413には、状態471で格納されていた要素データの次の1行分の要素データが格納される。また、状態472に示すように、レジスタファイル421〜423には、状態471で格納されていた要素データの次の1行分の要素データが格納される。そして、演算部51〜53の各積和演算部510〜514は、状態471と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態471の計算結果に加算していく。
このように、演算が終了する毎に、前の状態で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部510〜514は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
トップ差分データ203は、8行8列であり、トップ差分データ203の1行を用いた演算を8行分行うことで1つの重み差分データ204を算出することができる。そこで、8回の演算をおこなうことで、演算部51〜53は、重み差分データ204の全ての要素を算出できる。そこで、状態474は、8回目の計算時の状態を表す。
ここで、算出される重み差分データ204の各要素データを、ボトムデータ201やトップ差分データ203と同様に、1行1列目から順にw00〜w24とする。演算部51の積和演算部510は、状態471〜474までの8回の演算結果を順次加算していくことで、初期位置にトップ差分データ203を配置した状態の重み差分データ204の要素データw00を算出する。また、演算部51の積和演算部511は、初期位置からトップ差分データ203を1列ずらした位置に配置した状態の重み差分データ204の要素データw01を算出する。また、演算部51の積和演算部512は、トップ差分データ203を初期位置から2列ずらした位置に配置した状態の重み差分データ204の要素データw02を算出する。また、演算部51の積和演算部513は、トップ差分データ203を初期位置から3列ずらした位置に配置した状態の重み差分データ204の要素データw03を算出する。また、演算部51の積和演算部514は、トップ差分データ203を初期位置から4列ずらした位置に配置した状態の重み差分データ204の要素データw04を算出する。トップ差分データ203を初期位置から4列ずらした位置は、言い換えれば、トップ差分データ203の8列目とボトムデータ201の12列目とが一致する位置である。以上のことから、演算部51は、初期位置からトップ差分データ203を行方向に移動させることで算出される重み差分データ204の要素データw00〜w04を算出する。
同様に、演算部52は、初期位置から1列下げた位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw05〜w09を算出する。そして、演算部53は、初期位置から4列下げた位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw20〜w24を算出する。初期位置から4列下げた位置は、言い換えれば、トップ差分データ203の8行目とボトムデータ201の12行目とが一致する位置である。
このように、図7A及び7Bに記載した状態471〜474における演算が終了した時点で、演算部51〜53は、重み差分データ204の全ての要素データw00〜w24を算出し終え、畳み込みバックワードの重み差分演算が完了する。
また、ストライド数が2の場合、ボトムデータ201が12行12列であり、重みデータ202が5行5列でカーネルが5であるとすると、トップ差分データ203は、4行4列となる。
この場合、最初に、図8Aの状態481に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb48〜b59が格納される。さらに、レジスタファイル421〜423には、要素データt00〜t03が格納される。
演算部51の積和演算部510は、スライド数が2であるので、計算毎に先頭ポインタが示す要素データb00から1つ飛びでb02、b04及びb06をレジスタファイル411から順次読み込む。また、演算部51の積和演算部511は、計算毎に先頭ポインタの次の要素データb01から1つ飛びでb03、b05、b07をレジスタファイル411から順次読み込む。また、演算部51の積和演算部514は、計算毎に先頭ポインタから4つ先の要素データb04、b06、b08、b10をレジスタファイル411から順次読み込む。演算部52〜53のそれぞれの各積和演算部510〜514も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部510〜514は、それぞれ対応するレジスタファイル421〜423から1行分の要素データt00〜t03を計算毎に順次読み込む。そして、演算部51〜53の各積和演算部510〜514は、読み込んだ要素データ同士を乗算し、乗算結果を順次加算していく。
次に、状態481の演算が終了すると、状態482に示すように、レジスタファイル411〜413には、状態481で格納した行の2ストライド先の1行分の要素データが格納される。また、状態482に示すように、レジスタファイル421〜423には、状態481で格納されていた行の2ストライド先の1行分の要素データが格納される。そして、演算部51〜53の各積和演算部510〜514は、状態481と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を状態481の計算結果に加算していく。
このように、演算が終了する毎に、前の状態で格納されていた行の2ストライド先の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部501〜503は、要素データを順次読み込み、読み込んだ要素データ同士を乗算し、乗算結果を一つ前の計算結果に加算していく。
トップ差分データ203は、8行8列であり、ストライド数が2の場合、トップ差分データ203の1行を用いた演算を4行分行うことで1つの重み差分データ204を算出することができる。そこで、4回の演算をおこなうことで、演算部51〜53は、重み差分データ204の全ての要素を算出できる。
ここで、算出される重み差分データ204の各要素データを、ボトムデータ201やトップ差分データ203と同様に、1行1列目から順にw00〜w24とする。演算部51の積和演算部510は、状態481〜484までの4回の演算結果を順次加算していくことで、初期位置にトップ差分データ203を配置した状態の重み差分データ204の要素データw00を算出する。また、演算部51の積和演算部511は、初期位置からトップ差分データ203を1つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw01を算出する。また、演算部51の積和演算部512は、トップ差分データ203を初期位置から2つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw02を算出する。また、演算部51の積和演算部513は、トップ差分データ203を初期位置から3つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw03を算出する。また、演算部51の積和演算部514は、トップ差分データ203を初期位置から4つ分のストライド数ずらした位置に配置した状態の重み差分データ204の要素データw04を算出する。以上のことから、演算部51は、初期位置からトップ差分データ203を行方向に移動させることで算出される重み差分データ204の要素データw00〜w04を算出する。
同様に、演算部52は、初期位置から1つ分のストライド数ずらした位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw05〜w09を算出する。そして、演算部53は、初期位置から4つ分のストライド数ずらした位置からトップ差分データ203を列方向に移動させることで算出される重み差分データ204の要素データw20〜w24を算出する。ここで、トップ差分データ203が4行4列で、ストライド数が2の場合、12行12列のボトムデータ201の12行目及び12列目は計算に使用されない。
このように、図8A及び8Bに記載した状態481〜484における演算が終了した時点で、演算部51〜53は、重み差分データ204の全ての要素データw00〜w24を算出し終え、畳み込みバックワードの重み差分演算が完了する。
次に、図9及び10を参照して、演算部51における畳み込みバックワードの重み差分積和演算の詳細についてさらに説明する。図9は、畳み込みバックワードの重み差分演算の1回目の計算における演算部を表す図である。図10は、畳み込みバックワードの重み差分演算の2回目の計算における演算部を表す図である。
まず、畳み込みバックワードの重み差分積和演算を開始する場合、レジスタファイル411に要素データb00〜b11が格納される。また、レジスタファイル421にトップ差分データ203の要素データt00〜t07が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データb00にレジスタファイル411における先頭ポインタ163を設定する。その後、積和演算部510〜514の1回の計算が終了する毎に先頭ポインタ163を1つずつ移動させる。
演算部51の積和演算部510は、レジスタファイル411の先頭ポインタ163の位置の要素データを順次取得することで、点線631で囲われた部分の要素データb00〜b07を計算毎に順次取得する。また、演算部51の積和演算部510は、レジスタファイル421の先頭から要素データt00〜t07を計算毎に順次取得する。そして、演算部51の積和演算部510は、取得した要素データb00〜b07と要素データt00〜t07とをそれぞれ乗算する。次に、演算部51の積和演算部510は、レジスタファイル310に格納された重み差分データ204の要素データw00の値を取得する。ここで、要素データw00の初期値は0である。そして、演算部51の積和演算部510は、各乗算結果とレジスタファイル310に格納された要素データw00の値を合計し、計算結果をレジスタファイル310に格納する。
演算部51の積和演算部514は、レジスタファイル411の先頭ポインタ163から4つ先の要素データを順次取得することで、点線632で囲われた部分の要素データb04〜b11を計算毎に順次取得する。また、演算部51の積和演算部514は、レジスタファイル421の先頭から要素データt00〜t07を計算毎に順次取得する。そして、演算部51の積和演算部514は、取得した要素データb04〜b11と要素データt00〜t07とをそれぞれ乗算する。次に、演算部51の積和演算部514は、レジスタファイル314に格納された重み差分データ204の要素データw04の値を取得する。ここで、要素データw04の初期値は0である。そして、演算部51の積和演算部514は、各乗算結果とレジスタファイル314に格納された要素データw04の値を合計し、計算結果をレジスタファイル314に格納する。
次に、ポインタ制御部16は、先頭ポインタ163を1つ下の行の先頭に移動させ図10の状態とする。そして、ポインタ制御部16は、レジスタファイル411に格納された要素データb12にレジスタファイル411における先頭ポインタ163を設定する。その後、積和演算部510〜514の1回の計算が終了する毎にポインタを1つずつ移動させる。
演算部51の積和演算部510は、レジスタファイル411の先頭ポインタ163の位置の要素データを順次取得することで、点線633で囲われた部分の要素データb12〜b19を計算毎に順次取得する。また、演算部51の積和演算部510は、レジスタファイル421の先頭から要素データt08〜t15を計算毎に順次取得する。そして、演算部51の積和演算部510は、取得した要素データb12〜b19と要素データt08〜t15とをそれぞれ乗算する。次に、演算部51の積和演算部510は、レジスタファイル310に格納された重み差分データ204の要素データw00の値を取得する。ここで、2回目の計算の前に、要素データw00には、1回目の計算結果が格納されている。そして、演算部51の積和演算部510は、各乗算結果とレジスタファイル310に格納された要素データw00の値を合計し、計算結果をレジスタファイル310に格納する。
演算部51の積和演算部514は、レジスタファイル411の先頭ポインタ163から4つ先の要素データを順次取得することで、点線634で囲われた部分の要素データb16〜b23を計算毎に順次取得する。また、演算部51の積和演算部514は、レジスタファイル421の先頭から要素データt08〜t15を計算毎に順次取得する。そして、演算部51の積和演算部514は、取得した要素データb16〜b23と要素データt08〜t15とをそれぞれ乗算する。次に、演算部51の積和演算部514は、レジスタファイル314に格納された重み差分データ204の要素データw04の値を取得する。ここで、2回目の計算の前に、要素データw04には、1回目の計算結果が格納されている。そして、演算部51の積和演算部514は、各乗算結果とレジスタファイル314に格納された要素データw04の値を合計し、計算結果をレジスタファイル314に格納する。
その後、ポインタ制御部16は、先頭ポインタ163のストライド数分の移動を6回繰り返し畳み込みバックワードの重み差分積和演算における重み差分データ204の要素データw01〜w04の算出を終了する。
次に、図11を参照して、畳み込みバックワードのボトム差分演算を実行する場合について説明する。図11は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図11では、演算処理装置1は、8行8列に要素データが並んだトップ差分データ203及び5行5列に要素データが並んだ重みデータ202を用いる。重みデータ202は、要素データw00〜w24を有する。また、トップ差分データ203は、12行12列のボトムデータ201及び重みデータ202を用いて、ストライド数が1の場合に求められたものであり、要素データt00〜t63を有する。
さらに、本実施例では、トップ差分データ203の行数の演算部51〜53が用いられる。これにより、演算部51〜53は、トップ差分データ格納用のレジスタファイル411〜413のデータの入れ替えを行わずに、全てのボトムデータ201に対する畳み込みバックワードのボトム差分演算を行うことができる。例えば、図11では、7個の演算部51〜53が用いられる。ここでは、演算部53が7番目の演算部とする。さらに、演算部51〜53は、図4における積和演算部501〜503としてそれぞれ8個の積和演算部520〜527を有する。また、レジスタファイル431〜433は、図4におけるレジスタファイル301〜303としてそれぞれ算出するボトム差分データ205の行数と同数の12個のレジスタファイル320〜331を有する。また、ここでは、積和演算部520〜527には、順番に0〜8の番号が振られており、さらに、レジスタファイル320〜331には、順番に0〜11の番号が振られているものとして説明する。
第1データ制御部12は、畳み込みバックワードの重み差分演算で用いるトップ差分データ203、重みデータ202及びボトムデータ201のサイズを予め記憶する。例えば、第1データ制御部12は、予め表示装置及び入力装置を用いて設定された設定値の入力により、トップ差分データ203、重みデータ202及びボトムデータ201のサイズ及び重みデータ202のサイズ(あるいはカーネル数)を取得して記憶する。
第1データ制御部12は、トップ差分データ203における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt00〜t07のデータを読み込む。そして、第1データ制御部12は、要素データt00〜t07をレジスタファイル411に格納する。
また、第1データ制御部12は、トップ差分データ203における次の1行の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt08〜t15のデータを読み込む。そして、第1データ制御部12は、要素データt08〜t15をレジスタファイル412に格納する。
第1データ制御部12は、トップ差分データ203の行数、1行毎の要素データのメモリ11から読み込み及び異なるレジスタファイル411〜413への格納を繰り返す。例えば、第1データ制御部12は、要素データt56〜t63をレジスタファイル413に格納する。
また、第2データ制御部13は、重みデータ202における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第2データ制御部13は、要素データw00〜w04をメモリ11から読み込む。そして、第2データ制御部13は、レジスタファイル421〜423に要素データw00〜w04を格納する。
演算部51は、レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw00〜w04とを用いてボトム差分積和演算を行い、ボトム差分データ205の要素データb00〜b11の仮の値を算出する。そして、演算部51は、演算結果用のレジスタファイル431にボトム差分データ205の要素データb01〜b11の値を格納する。
ここで、演算部51の積和演算部520〜527による積和演算の詳細について説明する。
積和演算部520〜527は、レジスタファイル411に格納された要素データt00〜t07の先頭から順にそれぞれ要素データt00〜t07を取得する。また、積和演算部520〜527は、レジスタファイル421の先頭の要素データw00を取得する。そして、積和演算部520〜527は、取得した要素データt00〜t07と要素データw00とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号を有するレジスタファイル320〜327からそれぞれ要素データb00〜b07を取得する。ここで、レジスタファイル320〜331には、初期値として0が格納される。そして、積和演算部520〜527は、それぞれが有する要素データt00〜t07と要素データw00との乗算結果をそれぞれが取得した要素データb00〜b07に加算し、加算結果を要素データb00〜b07の取得元のレジスタファイル320〜327に格納する。
次に、積和演算部520〜527は、それぞれが取得した要素データt00〜t07を保持する。また、積和演算部520〜527は、レジスタファイル421の先頭の次の要素データw01を取得する。そして、積和演算部520〜527は、保持する要素データt00〜t07と要素データw01とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号の次の番号を有するレジスタファイル321〜328からそれぞれ要素データb01〜b08を取得する。そして、積和演算部520〜527は、それぞれが有する要素データt00〜t07と要素データw01との乗算結果をそれぞれが取得した要素データb01〜b08に加算し、加算結果を要素データb01〜b08の取得元のレジスタファイル321〜328に格納する。
このように、積和演算部520〜527は、k回目(k=1〜5)の計算の場合、レジスタファイル421の先頭からk個ずらした位置の要素データw(00+k−1)を取得する。そして、積和演算部520〜527は、保持する要素データt00〜t07と取得した要素データw(00+k)とを乗算する。さらに、積和演算部520〜527は、自己と同じ番号のからk個ずつずらした番号を有するレジスタファイル(320+k−1)〜(327+k−1)からそれぞれ要素データb(00+k−1)〜b(07+k−1)を取得する。そして、積和演算部520〜527は、乗算結果をそれぞれが取得した要素データb(00+k−1)〜b(07+k−1)に加算し、加算結果を要素データb(00+k−1)〜b(07+k−1)の取得元のレジスタファイル(320+k−1)〜(327+k−1)に格納する。これにより、積和演算部520〜527は、ボトム差分データ205の要素データb01〜b11の算出を完了する。
演算部52〜53の積和演算部520〜527も、それぞれレジスタファイル412〜413及び432〜433に格納された要素データを用いて、演算部51と同様のボトム差分積和演算を行う。そして、演算部52〜53は、演算結果である要素データb12〜b23,b24〜b35,・・・,b84〜b95の仮の値をそれぞれレジスタファイル432〜433に格納する。
次に、レジスタファイル411〜413は、保持するデータを維持する。また、第2データ制御部13により、レジスタファイル421〜423には、要素データw05〜w09が格納される。
演算部51は、レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw05〜w09とを用いて、前回と同様にボトム差分積和演算を行う。演算部51は、レジスタファイル431のポインタが示す位置にボトム差分データ205の値を足しこんでいくことで、ボトム差分データ205の要素データb12〜b23の値をレジスタファイル431に格納する。そして、演算部51は、レジスタファイル431に格納されたボトム差分データ205の要素データb12〜b23の値をメモリ11に書き込む。
演算部51は、同様に、順次レジスタファイル411に格納された要素データt00〜t07とレジスタファイル421に格納された要素データw10〜w24とを用いて、ボトム差分積和演算を行う。演算部51は、レジスタファイル431のポインタが示す位置にボトム差分データ205の値を足しこんでいくことで、ボトム差分データ205の要素データb24〜b35,b36〜47,b48〜b59の値を算出し、算出結果をメモリ11に書き込んでいく。ここで、演算部51は、メモリ11に書きこんだ演算結果は、レジスタファイル431から削除していく。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果をレジスタファイル432〜433の値に足しこんでいく。そして、レジスタファイル420に重みデータ202の最後の行の要素データw20〜w24が格納された状態で演算を行った時点で、演算部51〜53は、ボトム差分積和演算を終了し、各ボトム差分データ205の値を確定する。そして、演算部51〜53は、確定したボトム差分データ205の値をメモリ11に書き込む。
このように、第1データ制御部12は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル411〜413に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に演算毎に1行ずつずらしながら要素データをレジスタファイル421〜423に格納する。そして、演算部51〜53は、カーネル数の演算を行うと演算を終了する。
ここで、図12を参照して、図11における畳み込みバックワードのボトム差分演算時のレジスタファイル413への要素データの読み出し及び格納について詳細に説明する。図12は、畳み込みバックワードのボトム差分演算時の要素データの読み出し及び格納を説明するための図である。状態701〜705はそれぞれ、演算部51による、ボトムデータ201の最初の1列を読み込んだ際の1〜5回目の計算時の状態を表す。ここでは、一例として、レジスタファイル431が、配列710〜717という7列の配列を有する。
積和演算部520〜527がレジスタファイル431に対する所望の要素データの読み出し及び書き込みを行うためには、実際には、図12に示すクロスバスイッチ70が配置される。そして、図12における状態701〜705は、要素データb00〜b11がレジスタファイル431に格納された場合の1〜5回目の計算時のそれぞれの状態を表す。
各状態701〜705では、ポインタ制御部16は、太枠で囲んだ要素データの先頭に先頭ポインタを配置163する。そして、各状態701〜705において太枠で囲んだ要素データがその計算において読み出される要素データとなる。畳み込みバックワードのボトム差分演算では、積和演算部520〜527は、ボトム差分データ205の要素データb00〜b11をレジスタファイル431から読み出す。そして、積和演算部520〜527は、重みデータ202とトップ差分データ203との乗算結果を読み出した要素データb00〜b11に加算してレジスタファイル431の読み出し元の位置に再度格納する。以下に、各状態701〜705の詳細を説明する。
状態701で示される1回目の計算では、ポインタ制御部16は、要素データb00に先頭ポインタを配置する。積和演算部520は、先頭ポインタが示す要素データb00を配列710から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb00を格納する。積和演算部521は、先頭ポインタから2番目の要素データb01を配列711から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb01を格納する。積和演算部522は、先頭ポインタから3番目の要素データb02を配列712から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb02を格納する。積和演算部523は、先頭ポインタから4番目の要素データb03を配列713から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb03を格納する。積和演算部524は、先頭ポインタから5番目の要素データb04を配列714から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb04を格納する。積和演算部525は、先頭ポインタから6番目の要素データb05を配列715から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb05を格納する。積和演算部526は、先頭ポインタから7番目の要素データb06を配列716から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb06を格納する。積和演算部527は、先頭ポインタから6番目の要素データb07を配列717から取得し、乗算結果を加算して更新し、先頭ポインタが示す位置に更新した要素データb07を格納する。
状態702〜705では、ポインタ制御部16は、先頭ポインタを1つずつ進めていく。積和演算部520は、破線矢印で示すように先頭ポインタが示す位置のデータに対して読み出し及び格納を行う。積和演算部521は、破線矢印で示すように先頭ポインタから2番目のデータに対して読み出し及び格納を行う。積和演算部522は、破線矢印で示すように先頭ポインタから3番目のデータに対して読み出し及び格納を行う。積和演算部523は、破線矢印で示すように先頭ポインタから4番目のデータに対して読み出し及び格納を行う。積和演算部524は、破線矢印で示すように先頭ポインタから5番目のデータに対して読み出し及び格納を行う。積和演算部525は、破線矢印で示すように先頭ポインタから6番目のデータに対して読み出し及び格納を行う。積和演算部526は、破線矢印で示すように先頭ポインタから7番目のデータに対して読み出し及び格納を行う。積和演算部527は、破線矢印で示すように先頭ポインタから8番目のデータに対して読み出し及び格納を行う。
このように、7つの配列710〜717を用いることで、積和演算部520〜527は、異なる配列710〜717から要素データを読み出すため、データの読み出し及び書き込み時にコンフリクトの発生を回避する。
次に、図13A〜13C、14A及び14Bを参照して、レジスタファイル411〜413、421〜423及び431〜433に格納される要素データの遷移について説明する。図13A〜13Cは、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図14A及び14Bは、畳み込みバックワードのボトム差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、トップ差分データ203が8行8列で、カーネルサイズが5の場合を例に説明する。
ストライド数が1の場合、積和演算部520〜527は、トップサイズである8とストライド数である1とを乗算した8個が演算に用いられる。そして、最初に、図13Aの状態721に示すように、レジスタファイル411には、要素データt00〜t07が格納される。また、レジスタファイル412には、要素データt08〜t15が格納される。また、レジスタファイル413には、要素データt56〜t63が格納される。また、レジスタファイル421〜423には、要素データw00〜w04が格納される。
演算部51の積和演算部520〜527は、先頭から順に要素データt00〜t07をレジスタファイル411からそれぞれ読み込む。演算部52〜53のそれぞれの各積和演算部520〜527も同様に対応するレジスタファイル412〜413から要素データを読み込む。さらに、演算部51〜53の各積和演算部520〜527は、それぞれ対応するレジスタファイル421〜423から要素データw00〜w04を先頭から順に計算毎に読み込む。そして、演算部51〜53の各積和演算部520〜526は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜527は、乗算結果を番号が1つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。これは、各積和演算部520〜527が、自己と同じ番号から終了した計算回数だけ多い番号を有するレジスタファイル320〜331が保持する値に乗算結果を足し込む処理である。これにより、演算部51は、ボトム差分データ205の要素データb00〜b11を算出し、演算部52〜53は、ボトム差分データ205の要素データb12〜b23,・・・,b84〜b95の仮の値を算出する。
次に、状態721の演算が終了すると、次の計算状態である状態722に移行する。この場合、レジスタファイル411〜413は、状態721と同様の状態である。また、レジスタファイル421〜423には、状態721で格納されていた要素データの次の1行分の要素データw05〜w09が格納される。そして、演算部51〜53の各積和演算部520〜527は、状態721と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜526は、乗算結果を番号が1つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。これにより、演算部51〜53は、ボトム差分データ205の要素データb12〜b23,b24〜b35,・・・,b96〜b107の仮の値を算出する。そして、演算部51〜53は、計算結果を隣の演算部52〜53が状態721の計算で算出したボトム差分データ205の要素データb12〜b23,b24〜b35,・・・,b84〜b95の仮の値に加算する。ただし、演算部53は、隣の演算部が無いので加算する計算結果として0を用いる。
このように、演算が終了する毎に、図13A〜13Cに記載した前の状態721〜724で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。そして、演算部51〜53の各積和演算部521〜527は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ205の仮の値を算出する。そして、演算部51〜53は、算出した仮の値を隣の演算部52〜53が1つ前の状態721〜724で算出したボトム差分データ205の仮の値に加算しレジスタファイル431〜433に格納する。
このような演算を、演算部51〜53は、カーネル数だけ繰り返す。そして、演算部51は、状態721〜725において、ボトム差分データ205の要素データb00〜b11,b12〜b23,・・・,b48〜b59を算出する。また、演算部52〜53は、状態725におけるボトム差分データ205の要素データb60〜b71,・・・,b132〜b143をそれぞれの値として確定する。
このように、演算部51〜53は、状態721〜724における演算が終了した時点で、ボトム差分データ205の全ての要素データb00〜b143を算出し終え、畳み込みバックワードの重み差分演算が完了する。
ストライド数が2の場合、積和演算部520〜535は、トップサイズである8とストライド数である2とを乗算した16個が演算に用いられる。最初に、図14Aの状態731に示すように、レジスタファイル411には、要素データt00〜t07が格納される。また、レジスタファイル412には、要素データt08〜t15が格納される。また、レジスタファイル413には、要素データt56〜t63が格納される。また、レジスタファイル421〜423には、ストライド数の行数分の要素データw00〜w09が格納される。
演算部51の積和演算部520,522,・・・,534は、レジスタファイル411の先頭から順番に異なる要素データt00〜t07をそれぞれ読み込む。また、演算部51の積和演算部521,523,・・・,535も同様に、レジスタファイル411の先頭から順番に異なる要素データt00〜t07をそれぞれ読み込む。次に、演算部51の積和演算部520,522,・・・,534は、計算毎に要素データw00、w02及びw04をレジスタファイル421から順次読み込む。また、演算部51の積和演算部521,523,・・・,535は、計算毎に要素データw01及びw03をレジスタファイル421から順次読み込む。そして、演算部51の積和演算部520〜535は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜535は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。これは、各積和演算部520〜534が、終了した計算回数に2を乗算した数だけ自己と同じ番号より多い番号を有するレジスタファイル320〜335が保持する値に乗算結果を足し込む処理である。
次に、演算部51の積和演算部520〜535は、トップ差分データ203の値を保持する。また、演算部51の積和演算部520,522,・・・,534は、計算毎に次の行の要素データw05、w07及びw09をレジスタファイル421から順次読み込む。また、演算部51の積和演算部521,523,・・・,535は、計算毎に次の行の要素データw06及びw08をレジスタファイル421から順次読み込む。そして、演算部51の積和演算部520〜534は、読み込んだ要素データ同士を乗算する。そして、各積和演算部520〜534は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。
次に、状態731の演算が終了すると、次の計算状態である状態732に移行する。この場合、レジスタファイル411〜413は、状態731と同様の状態である。また、レジスタファイル421〜423には、状態731で格納されていた要素データの次の2行分の要素データw10〜w19が格納される。そして、演算部51〜53の各積和演算部520〜535は、状態731と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜535は、乗算結果を番号が2つ大きい積和演算部521〜527が前回の計算で算出した計算結果に加算する。
次に、状態732の演算が終了すると、次の計算状態である図14Bの状態733に移行する。この場合、レジスタファイル411〜413は、状態732と同様の状態である。また、レジスタファイル421〜423には、状態732で格納されていた要素データの次の2行分の要素データw20〜w29が格納される。そして、演算部51〜53の各積和演算部520〜534は、状態731と同様に要素データを順次読み込み、読み込んだ要素データ同士を乗算する。そして、積和演算部520〜534は、乗算結果を番号が2つ大きい積和演算部521〜535が前回の計算で算出した計算結果に加算する。
このように、演算が終了する毎に、前の状態731〜732で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413に格納される。また、演算が終了する毎に、前の状態721〜724で格納されていた要素データの次のストライド数の行分の要素データが421〜423に格納される。そして、演算部51〜53の各積和演算部521〜535は、要素データを順次読み込み、読み込んだ要素データを用いて積和演算を行いボトム差分データ205の仮の値を算出する。そして、演算部51〜53は、算出した仮の値を番号が2つ大きい演算部52〜53が1つ前の状態731〜732で算出したボトム差分データ205の仮の値に加算しレジスタファイル431〜433に格納する。
このような演算を、演算部51〜53は、カーネル数だけ繰り返してボトム差分データ205を算出することで、畳み込みバックワードの重み差分演算を完了する。
ここで、図15及び16を参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図15は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の1行目の計算時の演算部を表す図である。また、図16は、ストライド数が1の場合の畳み込みバックワードの重み差分演算における2行目の計算における演算部を表す図である。この場合も、8行8列のトップ差分データ203、5行5列の重みデータ202及び12行12列のボトムデータ201を用いる。
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル411にトップ差分データ203の要素データt00〜t07が格納される。また、レジスタファイル421に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データt00にレジスタファイル411におけるポインタ166を設定する。その後、積和演算部520〜527による読み込み毎にポインタ166を1つずつ移動させる。また、ポインタ制御部16は、最初にレジスタファイル431におけるデータの読み出し及び格納の位置として要素データb00の位置に先頭ポインタ165を設定する。その後、ポインタ制御部16は、積和演算部520〜527の計算が終了する毎に先頭ポインタ165を1つずつ移動させる。
演算部51の積和演算部520は、計算毎にレジスタファイル421の先頭から1つずつ進めた位置の要素データw00〜w04を順次取得する。また、演算部51の積和演算部520は、レジスタファイル411のポインタ166が示す位置から要素データt00を取得する。そして、演算部51の積和演算部520は、取得した要素データw00〜w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部520は、レジスタファイル431の計算毎に1つ進む先頭ポインタ165が示す位置に格納されたボトム差分データ205の要素データb00〜b04の値を取得する。ここで、要素データb00〜b11の初期値は0である。そして、演算部51の積和演算部520は、各乗算結果とレジスタファイル431から取得した要素データb00〜b04の値を合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部527は、レジスタファイル411のポインタ166が示す要素データt07を取得する。また、演算部51の積和演算部527は、レジスタファイル421の先頭から要素データw00〜w04を計算毎に順次取得する。そして、演算部51の積和演算部527は、要素データt07と要素データw00〜w04とをそれぞれ乗算する。次に、演算部51の積和演算部527は、レジスタファイル431の計算毎に1つ進む先頭ポインタ165から8番目の位置に格納されたボトム差分データ205の要素データb07〜b11の値を取得する。ここで、要素データb07〜b11の初期値は0である。そして、演算部51の積和演算部527は、各乗算結果とレジスタファイル431から取得した要素データb07〜b11の値を合計し、計算結果を先頭ポインタ165から8番目の位置に格納する。これにより、積和演算部520〜527は、ボトム差分データ205の要素データb00〜b11を算出する。
次に、ポインタ制御部16は、先頭ポインタ165を1つ下の行の先頭に移動させる。そして、ポインタ制御部16は、レジスタファイル431に格納された要素データb12に先頭ポインタ165を設定する。その後、積和演算部520〜527の1回の計算が終了する毎にポインタを1つずつ移動させる。また、レジスタファイル411に格納されたトップ差分データ203の要素データt00〜t07が維持される。そして、ポインタ制御部16は、ポインタ166を要素データt00の位置に戻す。また、レジスタファイル421に重みデータ202の次の行の要素データw05〜w09が格納される。これにより、レジスタファイル411〜413は、図16に示す2行目の計算を実行する状態となる。
そして、演算部51の積和演算部520〜527は、先頭ポインタ165及びポインタ166を用いて1行目と同様の演算を行い、ボトム差分データ205の要素データb12〜b23を算出する。
演算部52〜53の積和演算部520〜527も、レジスタファイル412〜432及びレジスタファイル413〜433に格納されたデータ及び先頭ポインタ165及びポインタ166を用いて演算部51と同様の計算を行う。そして、演算部52〜53は、上述した計算と同様の計算を繰り返していくことでボトム差分データ205の要素データb00〜b143の算出を完了する。
さらに、図17を参照して、ストライド数が2の場合について説明する。図17は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算における1行目の計算における演算部を表す図である。この場合も、8行8列のトップ差分データ203、5行5列の重みデータ202及び12行12列のボトムデータ201を用いる。
まず、畳み込みバックワードのボトム差分積和演算を開始する場合、レジスタファイル411にトップ差分データ203の要素データt00〜t03が格納される。また、レジスタファイル421に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データt00にレジスタファイル411におけるポインタ166を設定する。その後、積和演算部520及び521、522及び523、524及び525、526及び527による読み込み毎にポインタ166を1つずつ移動させる。また、ポインタ制御部16は、最初にレジスタファイル431におけるデータの読み出し及び格納の位置として要素データb00の位置に先頭ポインタ165を設定する。その後、ポインタ制御部16は、積和演算部520〜527の計算が終了する毎に先頭ポインタ165をストライド数である2つずつ移動させる。
演算部51の積和演算部520は、計算毎にレジスタファイル421の先頭から2つずつ進めた位置の要素データw00,w02,w04を順次取得する。また、演算部51の積和演算部520は、レジスタファイル411のポインタ166が示す要素データt00を取得する。そして、演算部51の積和演算部520は、取得した要素データw00,w02,w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部520は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165が示す位置に格納されたボトム差分データ205の要素データb00,b02,b04の値を順次取得する。ここで、要素データb00〜b11の初期値は0である。そして、演算部51の積和演算部520は、各乗算結果とレジスタファイル431から取得した要素データb00,b02,b04の値とを合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部521は、レジスタファイル411のポインタ166が示す要素データt00を取得する。また、演算部51の積和演算部521は、レジスタファイル421の先頭次のデータから2つずつ進めた位置の要素データw01,w03を順次取得する。そして、演算部51の積和演算部521は、要素データt00と要素データw01及びw03とをそれぞれ乗算する。次に、演算部51の積和演算部521は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165の次の位置に格納されたボトム差分データ205の要素データb01,b03の値を順次取得する。そして、演算部51の積和演算部521は、各乗算結果とレジスタファイル431から取得した要素データb01,b03の値とを合計し、計算結果を先頭ポインタ165の次の位置に格納する。
次に、ポインタ制御部16は、レジスタファイル411におけるポインタ166を1つ進める。これにより、ポインタ166は、要素データt01を示す位置に移動される。
演算部51の積和演算部522は、計算毎にレジスタファイル421の先頭から2つずつ進めた位置の要素データw00,w02,w04を順次取得する。また、演算部51の積和演算部522は、レジスタファイル411のポインタ166が示す要素データt01を取得する。そして、演算部51の積和演算部522は、取得した要素データw00,w02,w04と要素データt00とをそれぞれ乗算する。次に、演算部51の積和演算部522は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165が示す位置からストライド数である2つ分移動した位置に格納されたボトム差分データ205の要素データb02,b04,b06の値を順次取得する。そして、演算部51の積和演算部522は、各乗算結果とレジスタファイル431から取得した要素データb02,b04,b06の値とを合計し、計算結果を先頭ポインタ165が示す位置に格納する。
演算部51の積和演算部523は、レジスタファイル411のポインタ166が示す要素データt01を取得する。また、演算部51の積和演算部523は、レジスタファイル421の先頭次のデータから2つずつ進めた位置の要素データw01,w03を順次取得する。そして、演算部51の積和演算部521は、要素データt01と要素データw01,w03とをそれぞれ乗算する。次に、演算部51の積和演算部521は、レジスタファイル431の計算毎に2つ進む先頭ポインタ165の隣の位置から2つ隣の位置に格納されたボトム差分データ205の要素データb03,b05の値を取得する。そして、演算部51の積和演算部521は、各乗算結果とレジスタファイル431から取得した要素データb03,b05との値を合計し、計算結果を先頭ポインタ165の隣の位置から2つ隣の位置に格納する。
演算部51の積和演算部524〜527も、ポインタ166及び先頭ポインタ165を用いて同様の演算を行い、ボトム差分データ205の要素データb07〜b11を算出する。
さらに、図18及び図19を参照して、本実施例に係る畳み込みバックワードのボトム差分演算の概念について説明する。図18は、ストライド数が1の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。図19は、ストライド数が2の場合の畳み込みバックワードのボトム差分演算の概念を説明するための図である。
各積和演算部520〜527には、上部に記載されたデータが入力される。そして、各積和演算部520〜527は、それぞれの下に記載された乗算を行う。そして、各積和演算部520〜527は、乗算結果を矢印で結ばれた要素データb00〜b11に加算していく。
ストライド数が1の場合、例えば、積和演算部520は、t00×w00,t00×w01,t00×w02,t00×w03及びt00×w04を順次行う。そして、積和演算部520は、t00×w00を要素データb00に足し込む。また、積和演算部520は、t00×w01を要素データb01に足し込む。また、積和演算部520は、t00×w02を要素データb02に足し込む。また、積和演算部520は、t00×w03を要素データb03に足し込む。また、積和演算部520は、t00×w04を要素データb04に足し込む。
このように、演算を行うことで、破線枠740に示すように、乗算結果は、斜め方向に加算される。これにより、演算結果741に示すように、各要素データb00〜b05まで加算する乗算結果の数が増加し、その後、b11に向かって減少する。すなわち、要素データb00〜b05は、演算結果742に示すように、要素データt00〜t07に対して要素データw00〜w04を乗算した結果を1つずつずらしながら足し込んだ結果に一致する。
ストライド数が2の場合は、図19に示すように、積和演算部520,522,524及び526は、要素データt00〜t03をそれぞれが取得し、それに対して、要素データw0から1つ飛ばしの要素データw02,w04を順次乗算する。また、積和演算部521,523,525及び527は、要素データt00〜t03をそれぞれが取得し、それに対して、要素データw01から1つ飛ばしの要素データw01及びw03を順次乗算する。
すなわち、ストライド数が2の場合は、破線枠750に示すように、乗算結果は、1つ飛ばしの斜め方向に加算される。これにより、演算結果751に示すように、各要素データb00〜b05まで加算する乗算結果の数が1つおきに増加し、その後、b11に向かって1つおきに減少する。すなわち、要素データb00〜b05は、演算結果752に示すように、要素データt00〜t07に対して要素データw00〜04をスライド数ずつずらして乗算した結果を1つずつずらしながら足し込んだ結果に一致する。
次に、図20を参照して、畳み込みバックワードの重み差分演算処理の詳細な流れについて説明する。図20は、畳み込みバックワードの重み差分演算のフローチャートである。
例えば、図3及び図4で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS101)。
演算部50としてカーネルサイズ分の数の演算器が使用する演算器として割り当てられる。さらに、各演算部50は、カーネルサイズ分の積和演算部501〜503を割当てる。また、レジスタファイル430は、カーネルサイズ分のレジスタファイル301〜303を演算結果格納用のレジスタファイルとして割り当てる(ステップS102)。
ポインタ制御部16は、レジスタファイル410の先頭ポインタ163及びレジスタファイル420のポインタを初期化する(ステップS103)。
第1データ制御部12は、指定された先頭行のボトムデータ201の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS104)。
演算部50の積和演算部501〜503は、レジスタファイル410の先頭ポインタ163から順にボトムデータ201の要素データを1つずつ読み込む。また、演算部50の積和演算部501〜503は、レジスタファイル420のポインタが示すトップ差分データ203の1つの要素データを読み込む(ステップS105)。
次に、演算部50の積和演算部501〜503は、読み込んだボトムデータ201の要素データに読み込んだトップ差分データ203を乗算し、乗算結果を取得する(ステップS106)。
次に、演算部50の積和演算部501〜503は、レジスタファイル430の割り当てられたレジスタファイル301〜303から重み差分データ204の値を取得する(ステップS107)。
そして、演算部50の積和演算部501〜503は、取得した重み差分データ204に乗算結果を加算する(ステップS108)。
そして、演算部50の積和演算部501〜503は、加算結果を、レジスタファイル430の割り当てられたレジスタファイル301〜303に格納し直し更新する(ステップS109)。
次に、演算部50は、トップ差分データ203の1行分の計算が完了したか否かを判定する(ステップS110)。トップ差分データ203の1行分の計算が完了していない場合(ステップS110:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ163及びレジスタファイル420のポインタを1つシフトさせ(ステップS111)、ステップS105へ戻る。
これに対して、トップ差分データ203の1行分の計算が完了した場合(ステップS110:肯定)、演算部50は、ボトムデータ201の指定された行に対する演算が完了したか否かを判定する(ステップS112)。
ボトムデータ201の指定された行に対する演算が完了していない場合(ステップS112:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ163をストライドだけ分シフトする(ステップS113)。
さらに、ポインタ制御部16は、レジスタファイル420のポインタを1つシフトする(ステップS114)。その後、処理は、ステップS104へ戻る。
これに対して、ボトムデータ201の指定された行に対する演算が完了した場合(ステップS112:肯定)、演算部50は、ボトムデータ201の全ての行について演算が終了したか否かを判定する(ステップS115)。
演算を行っていない行がある場合(ステップS115:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行からストライド数分先の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行から1行先の行を先頭行として指定する(ステップS116)。その後、演算部50は、ステップS103へ戻る。
これに対して、ボトムデータ201の全ての行について演算が終了した場合(ステップS115:肯定)、演算部50は、畳み込みバックワードの重み差分演算処理を終了する。
次に、図21を参照して、畳み込みバックワードのボトム差分演算処理の詳細な流れについて説明する。図21は、畳み込みバックワードのボトム差分演算のフローチャートである。
例えば、図4及び図5で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS201)。
演算部50は、トップ差分データ203の列数であるトップサイズにストライド数を乗算した数分の積和演算部501〜503を演算に割り当てる。また、レジスタファイル430は、ボトムデータ201の列数であるボトムサイズの数分の演算結果格納用のレジスタファイル301〜303を演算に割り当てる(ステップS202)。
ポインタ制御部16は、レジスタファイル410のポインタ166及びレジスタファイル430の先頭ポインタ165を初期化する(ステップS203)。
第1データ制御部12は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行からストライド数の行分の重みデータ202の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS204)。
演算部50の積和演算部501〜503は、レジスタファイル410のポインタ166が示すトップ差分データ203の要素データを読み込む。また、演算部50の積和演算部501〜503は、レジスタファイル420の先頭から計算回数番目の重み差分データ204の要素データを読み込む(ステップS205)。
次に、演算部50の積和演算部501〜503は、読み込んだ重み差分データ204の要素データに読み込んだトップ差分データ203を乗算し、乗算結果を取得する(ステップS206)。
次に、演算部50の積和演算部501〜503は、レジスタファイル430の先頭ポインタ165が示す位置から自己の番号分進んだ位置のボトム差分データ205の要素データの値を取得する(ステップS207)。ここで、自己の番号とは、積和演算部501〜503において、積和演算部を1番としてその後1つずつ連番で数を割当てた番号を指す。
そして、演算部50の積和演算部501〜503は、取得したボトム差分データ205に、乗算結果を加算する(ステップS208)。
そして、演算部50の積和演算部501〜503は、加算結果を、ボトム差分データ205を取得したレジスタファイル301〜303に格納することで更新する(ステップS209)。
そして、演算部50は、トップサイズ分の演算が完了したか否かを判定する(ステップS210)。トップサイズ分の演算が完了していない場合(ステップS210:否定)、ポインタ制御部16は、レジスタファイル410のポインタ166及びレジスタファイル430の先頭ポインタ165を1つシフトし(ステップS211)、ステップS205へ戻る。
これに対して、トップサイズ分の演算が完了した場合(ステップS210:肯定)、演算部50は、トップ差分データ203の指定された行に対する演算が完了したか否かを判定する(ステップS212)。
トップ差分データ203の指定された行に対する演算が完了していない場合(ステップS212:否定)、ポインタ制御部16は、レジスタファイル410のポインタ166を1つシフトする(ステップS213)。
さらに、ポインタ制御部16は、レジスタファイル430の先頭ポインタ165をストライド数分シフトする(ステップS214)。その後、処理は、ステップS204へ戻る。
これに対して、トップ差分データ203の指定された行に対する演算が完了した場合(ステップS212:肯定)、演算部50は、カーネル数分の演算が終了したか否かを判定する(ステップS215)。
カーネル数分の演算を行っていない場合(ステップS215:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行の次の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行の次の行を先頭行として指定する(ステップS216)。その後、演算部50は、ステップS203へ戻る。
これに対して、カーネル数分の演算が終了した場合(ステップS215:肯定)、演算部50は、畳み込みバックワードのボトム差分演算処理を終了する。
以上に説明したように、本実施例に係る演算処理装置は、演算に使用する行列に並んだデータの1行ずつの演算をまとめて行い、その演算結果を用いて行列に並んだデータ同士の演算を行う。この場合、各演算部は、異なる行の演算を行うため、同じデータを同時に用いることはない。さらに、各演算部に配置された積和演算部は、畳み込みバックワードの重み差分演算の場合、それぞれが異なるボトムデータを読み込み、かつ、全てが同じトップデータを読み込む。また、各演算部に配置された積和演算部は、畳み込みバックワードのボトム差分演算の場合、それぞれが異なるトップ差分データを読み込み、かつ、全てが同じ重みデータを読み込む。これにより、データの読み込み回数を抑えることができ、且つ読み込みのコンフリクトの発生を軽減することができ、効率的にバックワード演算を行うことができる。したがって、コストの増加を抑えつつ演算処理速度を向上させることができる。
図22は、複数の演算部によるボトムデータ及びトップデータの指定を説明するための図である。以下では、複数の演算部50によるボトムデータ201及びトップ差分データ203の指定の方法を説明する。
例えば、縦横各々Nの画素数を持つN×Nサイズを有する画像データにおいて、演算部50は、画像データの左上から指定した行と指定したストライド数に基づいて移動した先の座標点(i、j)を求める。そして、演算部50は、その座標点と指定されたカーネルサイズmに基づいて定義される矩形領域としてボトムデータ201を読み込む。演算部50は、この読み込んだボトムデータ201を元に畳み込み演算を実施し、1×1サイズへ調節した上でボトムデータ201を格納する。そのため、その演算結果であるトップ差分データ203のサイズ(以下トップサイズ)は、予め設定したパッド数を用いて、(N+2*pad―m)/ストライド数+1のサイズに調節される。またボトムデータ201あるいはトップ差分データ203が複数ある場合には全てのデータを連続して演算できるように、そのデータ数を使用するボトムデータ201の枚数であるCiあるいは算出されるトップ差分データ203の枚数であるCoで指定することも行なう。
図23は、複数の演算部を用いた場合の畳み込み演算の全体のフローチャートである。まず、演算部50は、図23で指定したトップサイズ分、例えば(N+2*pad―m)/ストライド数+1の分が、演算の使用に割り当てられる(ステップS11)。
1つの演算部50による演算処理は実施例に示した処理と同様である。各演算部50は、行単位のボトムデータ201及び共通の重みデータ202を読み込む(ステップS12)。例えば、トップサイズが8であり、ストライド数が1の場合には、最初の演算部50に対してはb00〜b11が読み込まれ、次の演算部50に対してはb12〜b23が読み込まれ、そして8番目の最後の演算部50に対してはb84〜b95が読み込まれる。このように行単位でボトムデータ201が、各演算部50に読み込まれる。また、ストライド数が2以上の場合には、各演算部50に与えるボトムデータ201は、ストライド数で指定された行数分を用意される。重みデータについては1行分ずつ追加し、全ての演算部50に共通のデータとして与えられる。
そして、ボトムデータ201及び1行分の共通の重みデータ202を使用して、各演算部50は、演算処理を行う(ステップS13)。その後、各演算部50は、それぞれに対応したレジスタファイル430にその演算処理結果を格納する(ステップS14)。
その後、演算部50は、カーネルサイズ分の演算が終了したか否かを判定する(ステップS15)。カーネルサイズの演算が終了していない場合(ステップS15:否定)、演算部50は、ボトムデータ201の行数をスライド数分シフトする。そして、演算部50は、シフト先のボトムデータ201の要素データと、それぞれに共通の重みデータ202とを用いて演算処理を行ない(ステップS16)、ステップS14へ戻る。例えば、最初の演算部50に対してはb12〜b23が追加され、次の演算部50に対してはb24〜b35が追加され、そして8番目の最後の演算部50に対してはb96〜b107が追加される。すなわち、各演算部50には、行単位でボトムデータ201が読み込まれる。演算部50は、重みデータ202の次の行の要素データを読み込み、同様に演算処理を行ない、その演算処理結果を2回目以降の演算については前回の(2回目のときは最初)の演算結果に加算し格納する。例えば、カーネル数が5の場合には、演算部50は、5回計算することで、トップ差分データ203の値に対する演算が完了し、その演算結果を取得できる。また、特に各演算部50毎の演算処理となるステップS11〜S16については、畳み込みバックワードの重み差分演算の場合の詳細フローは図20と同じであり、畳み込みバックワードのボトム差分演算の場合の詳細フローは図21と同じである。
また、ボトムデータ201のデータ数Ciが複数ある場合、演算部50は、指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了したか否かを判定する(ステップS17)。
指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了していない場合(ステップS17:否定)、演算部50は、次のボトムデータ201、あるいはトップ差分データ203を指定する(ステップS18)。その後、処理は、ステップS12へ戻る。
一方、指定したボトムデータ201のデータ数、あるいはトップ差分データ203の枚数の演算が完了した場合(ステップS17:肯定)、演算部50は、演算処理を終了する。例えばCiが20の場合、演算部50は、同じ計算を20回繰り返すことで、同様にトップ差分データ203の値に対する演算が完了し、その演算結果を取得できることになる。
図24は、複数の演算部を用いた畳み込みフォワード演算のプログラムの記述例を説明するための図である。畳み込みフォワード演算は、図24に示すようにボトムデータ201(bottom_y)とトップ差分データ203(top_x)とを用いた演算は乗算及び加算で表現できる。畳み込みフォワード演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
図25は、複数の演算部を用いた畳み込みバックワードの重み差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードの重み差分演算は、図25に示すようにボトムデータ201(bottom_y)とトップデータ202(top_x)とを用いた演算は乗算及び加算で表現できる。この場合、重み差分データ(ew)が算出される。畳み込みバックワードの重み差分演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
図26は、畳み込みバックワードのボトム差分演算のプログラムの記述例を説明するための図である。畳み込みバックワードのボトム差分演算は、図26に示すようにボトムデータ201(bottom_y)とトップ差分データ203(top_x)と用いた演算は乗算及び加算で表現できる。この場合、ボトム差分データ205(bottom_ey)が算出される。畳み込みバックワードのボトム差分演算は、ボトムデータ201のデータ数Ci、トップ差分データ203のデータ数Co、バッチ数mb、ストライド数W及びトップサイズを調節するためのパラメータとなるパッド数padを指定して行なわれる。ここで、トップサイズの調整とは、トップサイズの水増しにあたる。
(ハードウェア構成)
図27は、演算処理装置のハードウェア構成図である。図27に示すように、演算処理装置1は、メインメモリ91、CPU(Central Processing Unit)92、I/O(Input/Output)コントローラ93、ハードディスク94及びGPU95を有する。さらに、GPU95は、チップ96及びメモリ99を有する。そして、チップ96には、演算器97及び内蔵メモリ98が搭載される。
一例として、CPU92は、ニューラルネットワークを管理するソフトウェアが動作し、そのソフトウェアが使用するボトムデータ201や重みデータ202がメインメモリ91に格納される。そして、ニューラルネットワークを管理するソフトウェアが演算をGPU95に依頼する。その際、GPU95上の資源を用いて演算が実行できるように、メモリ99に、ボトムデータ201及び重みデータ202が移動される。
演算器97は、演算部50の機能を実現する。また、メモリ99が、メモリ11の機能を実現する。そして、内蔵メモリ98は、レジスタファイル410,420及び430の機能を実現する。この場合、演算器97は、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現する。例えば、メモリ99に演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、演算器97は、メモリ99から各種プログラムを読み出し実行することで、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現することができる。このように、上記実施例で説明した各機能はGPU95によって実現することができる。
また、他の例として、CPU92上で動作するニューラルネットワークを管理するソフトウェアが、演算をCPU92の他のコアに依頼してもよい。その場合、CPU92が、演算部50の機能を実現する。また、ハードディスク94が、メモリ11の機能を実現する。そして、メインメモリ91が、レジスタファイル410〜430の機能を実現する。ハードディスク94は、I/Oコントローラ93を介してCPU92とデータの送受信を行う。この場合、CPU92は、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現する。例えば、ハードディスク94に、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現するためのプログラムを含む各種プログラムが格納される。そして、CPU92は、ハードディスク94から各種プログラムを読み出し実行することで、演算部50、第1データ制御部12、第2データ制御部13及びポインタ制御部16の機能を実現することができる。このように、上記実施例で説明した各機能を、演算処理装置1が有するGPU95以外のCPU92を用いて実現することもできる。