以下に、本願の開示する演算処理装置及び演算処理装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理装置の制御方法が限定されるものではない。
図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層からの入力データを用いて重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた重みデータの期待値との差分を用いて重みデータを修正する。そして、演算処理装置1は、修正した重みデータ及び出力データ20と期待値との差分を用いて第n−1層における重みデータを修正するためのデータであるトップ差分データを求める。次に、演算処理装置1は、n−2層からの入力データに対して、求めた第n−1層の出力データ20と第n−1層における出力の期待値との差分を用いて第n−1層の重みデータを修正する。
ここで、矢印P1方向を各層の並び方向とすると、演算処理装置1は、特定の演算処理層の1つ前の演算処理層において特定の演算処理層におけるトップ差分データを算出する。そして、演算処理装置1は、算出した特定の演算処理層におけるトップ差分データと1つ前の演算処理装置1からの出力データとを用いて、特定の演算処理層における重みデータの期待値との差分を求める。さらに、演算処理装置1は、求めた特定の演算処理層における重みデータの期待値との差分を用いて重みデータを修正する。その後、演算処理装置1は、修正した特定の演算処理層における重みデータと特定の演算処理層における出力データと期待値との差分とを用いて、特定の演算処理層の1つ前の演算処理層におけるトップ差分データを算出する。
演算処理装置1は、各演算処理層における重みデータの修正及び1つ前の演算処理層におけるトップ差分データの算出を順次繰り返す。これにより、演算処理装置1は、演算処理層101〜103の全ての層の重みデータを演算処理層103の出力データの期待値に合わせて修正することができる。ここで説明した、演算処理装置1による矢印P2へ向かう方向の各演算処理層における重みデータを修正するための演算処理は、「畳み込みバックワード演算」と呼ばれる場合がある。
以下では、特定の演算処理層における入力データを、「ボトムデータ」という。ボトムデータは、特定の演算処理層の1つ前の演算処理層からの出力データにあたる。また、特定の演算処理層における重みデータの期待値との差分のデータを、「重み差分データ」という。また、特定の演算処理装置における畳み込みバックワード演算の演算結果のデータを「ボトム差分データ」という。さらに、特定の演算処理層において畳み込みバックワード演算において重みデータの修正に用いられる元データを、「トップ差分データ」という。ここで、特定の演算処理層における畳み込みバックワード演算の算出結果は、特定の演算処理層の1つ前の演算処理層の畳み込みバックワード演算の元データとして用いられる。すなわち、特定の演算処理層において算出されたボトム差分データは、特定の演算処理層の1つ前の演算処理層のトップ差分データにあたる。
また、畳み込みバックワード演算において、トップ差分データとボトムデータとを用いて重み差分データを求める演算を、「畳み込みバックワードの重み差分演算」という。さらに、修正された重みデータとトップ差分データとを用いてボトム差分データを算出する演算を、「畳み込みバックワードのボトム差分演算」という。
さらに、本実施例では、ボトムデータ及び重みデータを方形に行列として並んだ要素デを有する場合で説明する。そこで、以下では、重みデータの行数及び列数を「カーネル数」あるいはカーネル数に応じた単位として「カーネルサイズ」という。このカーネル数が、「所定数」の一例にあたる。ただし、ボトムデータ及び重みデータは、それぞれ長方形でもよい。また、畳み込みフォワード演算における重みデータの1回の移動量を「ストライド数」という場合がある。
図2は、畳み込みフォワード演算及びバックワード演算を説明するための図である。図2は、入力データ10を用いて演算処理を始める第1層から出力データ206と期待値207からトップ差分データ203を生成する。ここでは、演算処理層101を第1層敏、演算処理層104を第n−1層とし、演算処理層103を第n層として、第1層から第n層までの各演算処理層101〜104における演算を例に記載した。また、図2中の円で記載した処理は演算処理を表す。演算処理F1は、畳み込みフォワード演算を表す。演算処理F2は、畳み込みバックワードの重み差分演算を表す。また、演算処理F3は、畳み込みバックワードのボトム差分演算を表す。
演算処理装置1は、最初の第1層において入力データ10及び第1層での重みデータ202に対して演算処理F1で表される畳み込みフォワードを行い、演算結果209を算出する。その後は、図示しないが、同様に次の第2層において、前の層の演算結果209及び第2層での重みデータ202に対して同様に演算処理F1で表される畳み込みフォワード演算を行う。これらを繰り返し、最後の第n層においては、同様に前の層の演算結果209及び第n層での重みデータ202に対して演算処理F1で表される畳み込みフォワード演算を行うが、最後の第n層においては、さらに、演算処理装置1は、出力データ206と期待値207とを比較して、トップ差分データ203を算出する。ここで、第1層の入力データ10は、第2層〜第n層におけるボトムデータ201にあたる。また、第n層の出力データ20は、第1層〜第n−1層における演算結果209にあたる。
さらに続けて、バックワード演算を説明すると、演算処理装置1は、トップ差分データ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は、実施例1に係る演算処理装置のブロック図である。図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も格納する。このメモリ11が、「データ格納部」の一例にあたる。
レジスタファイル410,420及び430は、演算時に演算に用いるデータが一時的に格納される記憶部である。レジスタファイル410,420及び430は、本実施例では、各演算部50にそれぞれ1つずつの3つが割り当てられる。
レジスタファイル410は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる一方のデータを格納する。また、レジスタファイル420は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算で用いられる他方のデータを格納する。さらに、レジスタファイル430は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算における演算結果が格納される。このレジスタファイル410が、「第1演算用記憶部」の一例にあたる。また、レジスタファイル420が、「第2演算用記憶部」の一例にあたる。
第1データ制御部12は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードを実行する際に、所定行ずつメモリ11からデータを読み出し、各演算部50に対応するレジスタファイル410それぞれに格納する。
例えば、第1データ制御部12は、畳み込みフォワード演算の場合、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、指定された先頭位置からボトムデータ201の要素データをストライド数分の行ずつ、配置されたレジスタファイル410の数分までメモリ11から読み込み、各演算部50に対応するレジスタファイル410それぞれに格納する。
ここで、畳み込みフォワード演算を行う場合、重みデータ202は、その1行1列の位置をボトムデータ201の1行1列の位置に合わせた位置から行方向にストライド数ずつ移動される。以下では、2つの行を用いた演算を行う場合に、その行同士の1行1列を一致させた位置を初期位置という。そして、重みデータ202は、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数まで、ボトムデータ201の初期位置から行方向にストライド数ずつ移動される。以下では、カーネル数にストライド数の整数倍を足した数でボトムデータ201の行数より大きく且つ最小の数となる場合の整数倍に用いた数を、「最大移動数」という。
第1データ制御部12は、ボトムデータ201の要素データのストライド数の行分ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の個数回繰り返す。ただし、レジスタファイル410の個数が最大移動数分以上ある場合、第1データ制御部12は、最大移動数回処理を行うと、要素データの読み込み及びレジスタファイル41への格納を停止する。
次に、レジスタファイル410に格納した要素データを用いた演算が終了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置をストライド数分列方向に移動させ、ボトムデータ201の要素データをストライド数の行分ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。第1データ制御部12は、最大移動数の回数、ボトムデータ201の要素データのストライド数分の行ずつの読み込み及びレジスタファイル410への格納を繰り返す。
第1データ制御部12は、ボトムデータ201の要素データのストライド数分の行ずつの読み込み及びレジスタファイル410への格納が、最大移動数回終了していない場合、同様の処理を最大移動回数に達するまで繰り返す。
また、畳み込みバックワードの重み差分演算の場合、第1データ制御部12は、読み込みを開始する行の先頭位置の指定を受ける。そして、第1データ制御部12は、指定された先頭位置からボトムデータ201の要素データを1行ずつメモリ11から読み込み、各演算部50に対応するレジスタファイル410に格納する。
第1データ制御部12は、ボトムデータ201の要素データの1行ずつの読み込み及びレジスタファイル410への格納を、レジスタファイル410の数分まで繰り返す。ただし、レジスタファイル410の個数が最大移動数分以上ある場合、第1データ制御部12は、最大移動数分行うと、要素データの読込及びレジスタファイル410への格納を終了する。
次に、レジスタファイル410に格納した要素データを用いた演算が完了した後、第1データ制御部12は、行分演算の終了の通知を演算部50から受ける。そして、第1データ制御部12は、先頭位置をストライド数分列方向に移動させ、ボトムデータ201の要素データを1行ずつのメモリ11からの読み込み及びレジスタファイル410への格納を行う。第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は、畳み込みフォワード演算の場合、読み込みを開始する行の先頭位置の指定を受ける。そして、第2データ制御部13は、指定された先頭位置からストライド数の行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分メモリ11から読み込む。そして、第2データ制御部13は、読み込んだ要素データを各演算部50に対応するレジスタファイル420に格納する。すなわち、第2データ制御部13は、各演算部50に対応するレジスタファイル420の全てに同じ要素データを格納する。
レジスタファイル420に格納した要素データを用いた演算が終了した後、第2データ制御部13は、行分演算の終了の通知を演算部50から受ける。そして、第2データ制御部13は、重みデータ202における読み込みの先頭位置をストライド数分移動する。そして、第2データ制御部13は、先頭位置からストライド数の行分の重みデータ202の要素データを、配置されたレジスタファイル420の数分までメモリ11から読み込み、レジスタファイル420に格納する。第2データ制御部13は、先頭位置からのストライド数の行分の要素データの読み込み及びレジスタファイル420への格納を繰り返す。
第2データ制御部13は、最大移動数の回数、要素データの読み込み及びレジスタファイル420への格納を行った時点で、演算処理が終了していない場合、重みデータ202における読み込みの先頭位置を重みデータの先頭に移動する。そして、第2データ制御部13は、演算処理が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードの重み差分演算の場合、第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に格納する。
例えば、演算部50は、畳み込みフォワード演算の場合、レジスタファイル410における後述するポインタ制御部16により指定された先頭ポインタの位置から重みデータ202のストライド数の行分にあたるボトムデータ201の要素データを読み込む。さらに、演算部50は、レジスタファイル420に格納された重みデータ202のストライド数の行分の要素データを読み込む。そして、演算部50は、読み込んだボトムデータ201の要素データと重みデータ202の要素データとを先頭から順に対応させて、対応する要素データを乗算する。さらに、演算部50は、乗算結果を合計する。以下では、畳み込みフォワード演算における、対応する要素データを乗算しその乗算結果を合計する演算を、「フォワード積和演算」という。そして、演算部50は、レジスタファイル430におけるポインタ制御部16により指定された先頭ポインタの位置に合計した演算結果を格納する。そして、演算部50は、1回のフォワード積和演算の完了をポインタ制御部16に通知する。
次に、演算部50は、レジスタファイル410におけるポインタ制御部16によりストライド分移動された先頭ポインタの位置から重みデータ202のストライド数の行分にあたるボトムデータ201の要素データを読み込む。そして、演算部50は、前の計算で既に読み込んだ重みデータ202の要素データと今回読み込んだボトムデータ201の要素データを用いたフォワード積和演算を行う。そして、演算部50は、レジスタファイル430におけるポインタ制御部16により1つ移動された位置に演算結果を格納する。演算部50は、レジスタファイル410に格納されたボトムデータ201のストライド数の行分の要素データ全てについてフォワード積和演算を行うまで同様の処理を繰り返す。
レジスタファイル410に格納された全ての要素データについてフォワード積和演算を行った場合、演算部50は、行分演算完了を第1データ制御部12及び第2データ制御部13に送信する。そして、演算部50は、レジスタファイル410及び420に新たに格納された要素データを用いてフォワード積和演算を繰り返す。ここで、演算部50は、フォワード積和演算を重みデータ202の最大移動数分行う間、各ストライド数の行分の要素データにおいて先頭からの位置が同じ要素データを用いたフォワード積和演算の結果を、レジスタファイル430の同じ位置の値に加算していく。
演算部50は、重みデータ202の最大移動数回フォワード積和演算を行った場合、演算結果をメモリ11が有するトップ差分データ203に格納する。その後、全てのトップ差分データ203の算出が終わっていなければ、演算部50は、新たなトップ差分データ203の要素データの算出として、同様の処理を繰り返す。この畳み込みフォワード演算におけるボトムデータ201が、「第1データ」の一例にあたり、重みデータ202が、「第2データ」の一例にあたる。さらに、ここで説明した畳み込みフォワード演算の場合、ストライド数の行が「第1所定行」及び「第2所定行」の一例にあたる。
また、畳み込みバックワードの重み差分演算の場合、演算部50は、レジスタファイル410におけるポインタ制御部16により指定された先頭ポインタの位置からカーネル数分にあたるボトムデータ201の要素データを読み込む。さらに、演算部50は、レジスタファイル420におけるポインタ制御部16により指定された先頭ポインタの位置のトップ差分データ203の要素データを読み込む。そして、演算部50は、読み込んだボトムデータ201の要素データのそれぞれとトップ差分データ203の要素データとを乗算する。次に、演算部50は、乗算結果を重みデータ202の対応する要素データとして、レジスタファイル430に格納された値に加算する。以下では、畳み込みバックワードの重み差分演算における、対応する要素データを乗算しその乗算結果をレジスタファイル430の値に加算する演算を、「重み差分積和演算」という。演算部50は、演算の完了をポインタ制御部16に通知する。
次に、演算部50は、レジスタファイル410におけるポインタ制御部16によりストライド分移動された先頭ポインタの位置からカーネル数分にあたるボトムデータ201の要素データを読み込む。さらに、演算部50は、レジスタファイル420におけるポインタ制御部16により1つ移動された先頭ポインタの位置のトップ差分データ203の要素データを読み込む。そして、演算部50は、読み込んだボトムデータ201の要素データ及びトップ差分データ203の要素データを用いて重み差分積和演算を行う。演算部50は、レジスタファイル410に格納されたボトムデータ201の1行分の要素データ全てについて重み差分積和演算を行うまで同様の処理を繰り返す。
レジスタファイル410に格納された全ての要素データについて重み差分積和演算を行った場合、演算部50は、行分演算完了を第1データ制御部12及び第2データ制御部13に送信する。そして、演算部50は、レジスタファイル410及び420に新たに格納された要素データを用いて重み差分積和演算を繰り返す。ここで、演算部50は、フォワード積和演算を最大移動数分行う間、各行の要素データにおいて先頭からの位置が同じ要素データを用いた重み差分積和演算の結果を、レジスタファイル430の同じ位置の値に加算していく。
フォワード積和演算を最大移動数分行った場合、演算部50は、演算結果をメモリ11が有する重み差分データ204に格納する。その後、全ての重み差分データ204の算出が終わっていなければ、演算部50は、新たな重み差分データ204の要素データの算出として、同様の処理を繰り返す。この畳み込みバックワードの重み差分演算におけるボトムデータ201が、「第1データ」の一例にあたり、トップ差分データ203が、「第2データ」の一例にあたる。さらに、ここで説明した畳み込みバックワードの重み差分演算の場合、ボトムデータ201の1行が「第1所定行」の一例にあたり及びトップ差分データ203の1行が「第2所定行」の一例にあたる。
また、畳み込みバックワードのボトム差分演算の場合、演算部50は、レジスタファイル410におけるポインタ制御部16により指定されたポインタの位置のトップ差分データ203の要素データを読み込む。さらに、演算部50は、レジスタファイル410に格納された1行分の重みデータ202の要素データを読み込む。そして、演算部50は、読み込んだ重みデータ202の要素データのそれぞれと選択したトップ差分データ203の要素データとを乗算する。次に、演算部50は、乗算結果をボトム差分データ205の対応する要素データとして、レジスタファイル430におけるポインタ制御部16により指定された先頭ポインタからカーネル数分の値にそれぞれ加算する。以下では、畳み込みバックワードのボトム差分演算における、対応する要素データを乗算しその乗算結果をレジスタファイル430の値に加算する演算を、「ボトム差分積和演算」という。演算部50は、演算の完了をポインタ制御部16に通知する。
次に、演算部50は、読み込んだ1行分の重みデータ202の要素データを保持する。さらに、演算部50は、レジスタファイル410におけるポインタ制御部16により1つ移動された先頭ポインタの位置のトップ差分データ203の要素データを読み込む。そして、演算部50は、ボトムデータ201の要素データ及びトップ差分データ203の要素データを用いてボトム差分積和演算を行う。演算部50は、レジスタファイル420に格納されたトップ差分データ203の1行分の要素データ全てについて重み差分積和演算を行うまで同様の処理を繰り返す。
レジスタファイル410に格納された全ての要素データについてボトム差分積和演算を行った場合、演算部50は、行分演算完了を第1データ制御部12及び第2データ制御部13に送信する。そして、演算部50は、レジスタファイル410及び420に新たに格納された要素データを用いてボトム差分積和演算を繰り返す。
フォワード積和演算を重みデータ202の行数分行った場合、演算部50は、演算結果をメモリ11が有するボトム差分データ205に格納する。その後、全てのボトム差分データ205の算出が終わっていなければ、演算部50は、新たなボトム差分データ205の要素データの算出として、同様の処理を繰り返す。この畳み込みバックワードのボトム差分演算におけるトップ差分データ203が、「第1データ」の一例にあたり、重みデータ202が、「第2データ」の一例にあたる。さらに、ここで説明した畳み込みバックワードの重み差分演算の場合、トップ差分データ203の1行が「第1所定行」の一例にあたり及び重みデータ202の1行が「第2所定行」の一例にあたる。
さらに、図1の最終層の第n層である演算処理層103の場合、演算部50は、出力データをモニタなどの出力装置(不図示)へ出力しユーザに演算結果を提供する。例えば、画像認識の場合、演算部50は、認識結果を出力装置へ出力する。
ポインタ制御部16は、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算を実行する際に、レジスタファイル410〜430に対して先頭ポインタ及びポインタの指定を行う。図3では、図示の都合上、ポインタ制御部16からレジスタファイル411,421及び431に対して制御を表す矢印を例として記載したが、実際には、他のレジスタファイル410,420及び430に対してもポインタ制御部16は、制御を行う。
例えば、ポインタ制御部16は、畳み込みフォワード演算の場合、最初にレジスタファイル410における先頭ポインタを、レジスタファイル410の先頭に設定する。また、ポインタ制御部16は、最初にレジスタファイル430におけるポインタを、レジスタファイル430の先頭に設定する。
ポインタ制御部16は、1回分の演算完了の通知を受ける毎に、レジスタファイル410における先頭ポインタをストライド数分移動した位置に設定する。また、ポインタ制御部16は、レジスタファイル430におけるポインタを1つ移動した位置に設定する。そして、レジスタファイル410における先頭ポインタの移動を最大移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル41の先頭に設定する。すなわち、レジスタファイル41における先頭ポインタは、ボトムデータ201における次のストライド数分の行の先頭に設定される。また、ポインタ制御部16は、ポインタをレジスタファイル430の先頭に戻す。すなわち、レジスタファイル430におけるポインタは、トップ差分データ203の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みフォワード演算が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードの重み差分演算の場合、ポインタ制御部16は、最初にレジスタファイル410における先頭ポインタを、レジスタファイル410の先頭に設定する。また、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420の先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル410における先頭ポインタをストライド数分移動した位置に設定する。また、ポインタ制御部16は、レジスタファイル420におけるポインタを1つ移動した位置に設定する。そして、レジスタファイル410における先頭ポインタの移動をボトムデータ201の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル410の先頭に戻す。すなわち、レジスタファイル410における先頭ポインタは、ボトムデータ201の次の行の先頭に設定される。また、ポインタ制御部16は、レジスタファイル420におけるポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420におけるポインタは、トップ差分データ203の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードの重み差分演算が終了するまで、同様の処理を繰り返す。
また、畳み込みバックワードのボトム差分演算の場合、ポインタ制御部16は、最初にレジスタファイル420におけるポインタを、レジスタファイル420の先頭に設定する。また、ポインタ制御部16は、最初にレジスタファイル430における先頭ポインタを、レジスタファイル430の先頭に設定する。
ポインタ制御部16は、1回の演算完了の通知を受ける毎に、レジスタファイル420における先頭ポインタを1つ移動した位置に設定する。また、ポインタ制御部16は、レジスタファイル430におけるポインタをストライド数分移動した位置に設定する。そして、レジスタファイル420における先頭ポインタの移動をトップ差分データ203の行方向の移動数分行った場合、ポインタ制御部16は、先頭ポインタをレジスタファイル420の先頭に戻す。すなわち、レジスタファイル420における先頭ポインタは、トップ差分データ203の次の行の先頭に設定される。また、ポインタ制御部16は、レジスタファイル430におけるポインタをレジスタファイル430の先頭に戻す。すなわち、レジスタファイル430におけるポインタは、ボトム差分データ205の次の行の先頭に設定される。ポインタ制御部16は、演算部50による畳み込みバックワードのボトム差分演算が終了するまで、同様の処理を繰り返す。
さらに、畳み込みフォワード演算、畳み込みバックワードの重み差分演算及び畳み込みバックワードのボトム差分演算について詳細に説明する。
図4を参照して、畳み込みフォワード演算を実行する場合について説明する。図4は、畳み込みフォワード演算時におけるレジスタファイルへのデータの格納状態を示す図である。図4では、演算処理装置1は、12行12列に要素データが並んだボトムデータ201及びカーネル数5の要素データが5行並んだ(つまり、5行5列に要素データが並んだ)重みデータ202を用いる。ボトムデータ201は、要素データb00〜b143を有する。また、重みデータ202は、要素データw00〜w24を有する。
ボトムデータ201は、第1データ制御部12を経由してボトムデータ格納用の各レジスタファイル411,412,413(以降、これを単にレジスタファイル411,412,413とする。)へ読み込まれる。また、重みデータ202は第2データ制御部12を経由して重みデータ格納用の各レジスタファイル各レジスタファイル421,422,423(以降、これを単にレジスタファイル421,422,423とする。)へ読み込まれる。さらに、演算結果は、演算結果格納用のレジスタファイルル431,432,433(以降、これを単にレジスタファイル431,432,433とする。)へ読み込まれる。
ここで、重みデータ202をストライド数分ずつボトムデータ201上で移動させたき最後の部分がはみ出す場合、すなわち、ボトムデータ201の行数がカーネル数にストライド数の整数倍を足した数で表せない場合、第1データ制御部12及び第2データ制御部13は、以下の処理を行う。第1データ制御部12及び第2データ制御部13は、ボトムデータ201の周囲に、ストライド数の整数倍を足した数でボトムデータ201より大きく且つ最小の数になるように、ボトムデータ201の行方向及び列方向に計算調整用の要素データを付す。例えば、図4においてストライド数が2の場合、第1データ制御部12及び第2データ制御部13は、ボトムデータ201に1行1列分の要素データを加えたデータを用いられる。第1データ制御部12及び第2データ制御部13は、この処理を畳み込みバックワード演算においても行う。
さらに、本実施例では、最大移動数の演算部50が用いられる。例えば、図4においてストライド数が2の場合、5個の演算部50が用いられる。
第1データ制御部12は、畳み込みフォワード演算で用いるボトムデータ201及び重みデータ202のサイズを予め記憶する。また、第1データ制御部12は、畳み込みフォワード演算における重みデータ202の1回の移動量であるストライド数を予め記憶する。例えば、第1データ制御部12は、予めモニタなどの表示装置及びキーボードなどの入力装置を用いて設定された設定値により、ボトムデータ201のサイズ及び重みデータ202のサイズ(あるいはカーネル数)、並びに、ストライド数を取得して記憶する。
第1データ制御部12は、ボトムデータ201における先頭位置からストライド数の行分の要素データをメモリ11から読み込む。例えば、ストライド数が2の場合、第1データ制御部12は、要素データb00〜b23のデータを読み込む。そして、第1データ制御部12は、要素データb00〜b23をレジスタファイル411に格納する。
また、第1データ制御部12は、ボトムデータ201における次のストライド数の行分の要素データをメモリ11から読み込む。そして、第1データ制御部12は、レジスタファイル411に読み込んだ要素データを格納する。例えば、ストライド数が2の場合、第1データ制御部12は、要素データb24〜b47をレジスタファイル412に格納する。
このように、第1データ制御部12は、ストライド数分ずつ先頭をずらしながら、ボトムデータ201におけるストライド数分の行の要素データの取得を取得していき、異なるレジスタファイル411〜413(411,412,413)に順次格納する。
そして、第1データ制御部12は、最大移動数、ストライド数分の行の要素データのメモリ11から読み込み及びレジスタファイル410への格納を繰り返す。例えば、ストライド数が2の場合、第1データ制御部12は、要素データb96〜b119をレジスタファイル413に格納する。
また、第2データ制御部13は、重みデータ202における先頭位置からストライド数の行分、カーネル数で指定された単位の重みデータ202の要素データをメモリ11から読み込む。例えば、ストライド数が2、カーネル数が5の場合、第2データ制御部13は、要素データw00〜w04,w05〜w09をメモリ11から読み込む。そして、第2データ制御部13は、レジスタファイル421〜423(421,422,423)に要素データw00〜w09を格納する。
演算部51は、レジスタファイル411に格納された要素データb00〜b23とレジスタファイル421に格納された要素データw00〜w09とを用いてフォワード積和演算を行う。そして、演算部51は、フォワード積和演算の結果を演算結果格納用のレジスタファイル431のポインタが示す位置の値に加算する。ここで、演算結果格納用のレジスタファイル431は、初期値が0であるので、演算結果格納用のレジスタファイル431には、最初の演算ではフォワード積和演算の演算結果がそのまま格納される。
演算部52〜53も、演算部51と同様のフォワード積和演算を行い、演算結果をそれぞれレジスタファイル432〜433に格納された値に加算する。
次に、第1データ制御部12により、レジスタファイル411には、要素データb24〜b47が格納され、レジスタファイル412には、要素データb48〜b71が格納され、レジスタファイル413には、要素データb120〜b143が格納される。また、第2データ制御部13により、レジスタファイル421〜423には、要素データw10〜w19が格納される。
演算部51は、レジスタファイル411に格納された要素データb24〜b47とレジスタファイル421に格納された要素データw10〜w19とを用いてフォワード積和演算を行う。そして、演算部51は、フォワード積和演算の結果をレジスタファイル431のポインタが示す位置に格納された値に加算する。
演算部52〜53も、演算部51と同様のフォワード積和演算を行い、演算結果をそれぞれレジスタファイル432〜433に格納された値に加算する。
このように、第1データ制御部12及び第2データ制御部13は、要素データをレジスタファイル410及び420に格納する。そして、演算部51〜53は、レジスタファイル410及び420に格納された要素データを用いてフォワード積和演算を実行する。
ここで、図5及び6を参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図5は、畳み込みフォワード演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図6は、畳み込みフォワード演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、演算部51〜53の3つが存在する場合で説明する。また、この場合も、図4のボトムデータ201及び重みデータ202を使用する。
ストライド数が1の場合、最初に、図5の状態431に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb24〜b35が格納される。また、レジスタファイル421〜423には、カーネル数で指定された単位の要素データw00〜w04が格納される。
次に、状態431の演算が終了すると、状態432に示すように、レジスタファイル411〜413には、状態431で格納されていた要素データの次の1行分の要素データが格納される。このように、カーネル数で指定された重みデータ202の行数である5行分の取り込みが終わるまで、状態433〜435においても順次、前の状態で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413に格納される。
そして、状態431〜435における演算部51〜53の演算が終了した時点で、ボトムデータ201の先頭に重みデータ202の先頭を合わせて配置した状態から重みデータ202を行方向に順次移動した場合の畳み込みフォワード演算が完了する。ただし、状態431〜435の演算では、列方向に重みデータ202を移動させた状態での畳み込みフォワード演算が行われていない。そこで、演算処理装置1は、畳み込みフォワード演算を全て完了するには、行が重なる方向に重みデータ202を移動させて、行方向に重みデータ202を移動させながら畳み込みフォワード演算を行う処理を、後7回行う。
また、ストライド数が2の場合、最初に、図6の状態441に示すように、レジスタファイル411には、要素データb00〜b23が格納される。また、レジスタファイル412には、要素データb24〜b47が格納される。また、レジスタファイル413には、要素データb48〜b71が格納される。また、レジスタファイル421〜423には、要素データw00〜w09が格納される。
次に、状態441の演算が終了すると、状態442に示すように、レジスタファイル411〜413には、状態441で格納されていた要素データの次のストライド数の行分の要素データが格納される。状態443においても順次、状態442で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413に格納される。ただし、重みデータ202の行数は5であるため、ストライド数が2の場合、2回移動させた場合、例えば、演算部51は、b00〜b11、b12〜b23、b24〜b35、b36〜b47の4行分取り込んでいるため残りは1行である。そこで、2回移動させた場合の、状態443では、少なくとも、ボトムデータ201の1行分の要素データがレジスタファイル411〜413に格納され、格納された1行分の要素データを用いて同様に演算部により演算処理が行われる。
そして、状態441〜443における演算部51〜53の演算が終了した時点で、ボトムデータ201の先頭に重みデータ202の先頭を合わせて配置した状態から重みデータ202を行方向に順次移動した場合の畳み込みフォワード演算が完了する。ただし、状態441〜443の演算では、列方向に重みデータ202を移動させた状態での畳み込みフォワード演算が行われていない。そこで、演算処理装置1は、畳み込みフォワード演算を全て完了するには、列方向に重みデータ202を移動させつつ、行方向に重みデータ202を移動させて畳み込みフォワード演算を行う処理を、後4回行う。
次に、図7〜9を参照して、演算部50によるフォワード積和演算の詳細について説明する。図7は、畳み込みフォワード演算における最初の状態を表す図である。図8は、レジスタファイルに格納されたストライド数の行分の要素データにおける最後のフォワード積和演算を行う状態を表す図である。図9は、次のストライド数の行分に移動した状態を表す図である。ここでは、図4のボトムデータ201及び重みデータ202を使用し、ストライド数が1の場合で説明する。
まず、畳み込みフォワード演算を開始する場合、レジスタファイル410に要素データb00〜b11が格納される。また、レジスタファイル420に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル411に格納された最初の要素データb00にレジスタファイル411における先頭ポインタ161を設定する。また、ポインタ制御部16は、レジスタファイル430におけるトップ差分データ203の先頭の要素データt00に、レジスタファイル430におけるポインタ162を設定する。
演算部50は、点線611で囲われた部分の、レジスタファイル410の先頭ポインタ161の位置からカーネル数の要素データb00〜b04を取得する。そして、演算部50は、要素データb00〜b04と要素データw00〜w04をそれぞれ乗算し、乗算結果を合計する。そして、演算部50は、レジスタファイル430におけるポインタ162が示す要素データt00の値を取得する。ここで、要素データt00の初期値は0である。そして、演算部50は、フォワード積和演算の結果と要素データt00の値を合計し、要素データt00として、レジスタファイル430のポインタ162が示す位置に格納する。
その後、ポインタ制御部16は、先頭ポインタ161のストライド数分の移動を7回繰り返し、図8の状態とする。また、ポインタ制御部16は、ポインタ162の1つずつの移動を7回繰り返し、図8の状態とする。
図8の状態で、演算部50は、点線612で囲われた部分の、レジスタファイル410の先頭ポインタ161の位置からカーネル数の要素データb07〜b11を取得する。そして、演算部50は、要素データb07〜b11と要素データw00〜w04とをそれぞれ乗算し、乗算結果を合計する。そして、演算部50は、レジスタファイル430におけるポインタ162が示す要素データt07の値を取得する。ここで、要素データt07の初期値は0である。そして、演算部50は、フォワード積和演算の結果と要素データt07の値を合計し、要素データt07として、レジスタファイル430のポインタ162が示す位置に格納する。
図8の状態でのフォワード積和演算が完了すると、レジスタファイル410に、新たに次のストライド数の行分の要素データb12〜b23が格納される。また、レジスタファイル420に次の行の重みデータ202の要素データw05〜w09が格納される。
そして、ポインタ制御部16は、先頭ポインタ161を初期化し、図9に示すように、レジスタファイル410に格納された最初の要素データb12に先頭ポインタ161を設定する。また、ポインタ制御部16は、ポインタ162を初期化し、レジスタファイル430におけるトップ差分データ203の先頭の要素データt00にポインタ162を設定する。
演算部50は、点線613で囲われた部分の、レジスタファイル410の先頭ポインタ161の位置からカーネル数の要素データb12〜b16を取得する。そして、演算部50は、要素データb12〜b16と要素データw00〜w04をそれぞれ乗算し、乗算結果を合計する。そして、演算部50は、レジスタファイル430におけるポインタ162が示す要素データt00の値を取得する。そして、演算部50は、フォワード積和演算の結果と要素データt00の値を合計し、要素データt00として、レジスタファイル430のポインタ162が示す位置に格納する。
このように、ポインタ制御部16は、先頭ポインタ161をレジスタファイル410の先頭から1回の演算が完了する毎に、1スライド数分ずつボトムデータ201の列方向の移動数回スライドさせる。その後、先頭ポインタ161が最後尾に達すると、ポインタ制御部16は、先頭ポインタ161を初期化して先頭に戻す。また、ポインタ制御部16は、ポインタ162をレジスタファイル430の先頭から1回の演算が完了する毎に、1つずつ重みデータ202の列方向の移動数回スライドさせる。その後、ポインタ162が最後尾に達すると、ポインタ制御部16は、ポインタ162を初期化して先頭に戻す。
演算部50は、先頭ポインタ161及びポインタ162を用いて、フォワード積和演算を繰り返し、トップ差分データ203を求めていく。
次に、図10を参照して、畳み込みバックワードの重み差分演算を実行する場合について説明する。図10は、畳み込みバックワードの重み差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図4では、演算処理装置1は、12行12列に要素データが並んだボトムデータ201及び5行5列に要素データが並んだトップ差分データ203を用いる。ボトムデータ201は、要素データb00〜b143を有する。また、トップ差分データ203は、ボトムデータ201及び5行5列の重みデータ202を用いて、ストライド数が2の場合に求められたものとし、要素データt00〜t24を有する。ここでは、重み差分データ204は、重みデータ202と同じ行列数を有するので、重み差分データ204についても重みデータ202と同様に、各要素データをw00という形式で表す。
さらに、本実施例では、重み差分データ204の行数の演算部50が用いられる。これにより、演算部50は、行方向への移動を行うことで、全てのボトムデータ201に対する畳み込みバックワード重み差分演算を行うことができる。例えば、図10では、5個の演算部50が用いられる。
第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〜t04をメモリ11から読み込む。そして、第2データ制御部13は、トップ差分データ格納用のレジスタファイル421〜423(以降、これを単にレジスタファイル421,422,423とする。)に要素データt00〜t04を格納する。
演算部51は、レジスタファイル411に格納された要素データb00〜b11とレジスタファイル421に格納された要素データt00〜t04とを用いて重み差分積和演算を行い、重み差分データ204の要素データw00〜w05の仮の値を算出する。そして、演算部51は、重み差分積和演算の結果を演算結果格納用のレジスタファイル431(以降これを単にレジスタファイル431とする。)の対応する重み差分データ204の仮の値として格納する。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果であるw06〜09,・・・,w20〜w24の仮の値をそれぞれ演算結果格納用のレジスタファイル432〜433(以降、これを単にレジスタファイル432,433とする。)に格納する。
次に、第1データ制御部12により、レジスタファイル411には、ストライド数分先の行の要素データb24〜b35が格納され、レジスタファイル412には、ストライド数分先の行の要素データb60〜b71が格納され、レジスタファイル413には、要素データb72〜b83が格納される。また、第2データ制御部13により、レジスタファイル421〜423には、要素データt05〜t09が格納される。
演算部51は、レジスタファイル411に格納された要素データb24〜b35とレジスタファイル421に格納された要素データt05〜t09とを用いてフォワード積和演算を行う。演算部51は、レジスタファイル431の対応する重み差分データ204の値をたしこんでいくことで、重み差分データ204の要素データw00〜w05の仮の値をレジスタファイル431に格納する。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果をたしこんでいくことで、演算結果として重み差分データ204の仮のであるw06〜09,・・・,w20〜w24の仮の値をそれぞれレジスタファイル432〜433に格納する。
このように、第1データ制御部12は、ボトムデータ201の先頭の行から順にストライド数ずつ先の行の要素データをレジスタファイル410に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル420に格納する。同様に、第1データ制御部12及び第2データ制御部13は、1行ずつずらした行を先頭にしてレジスタファイル411〜413及び421〜423に各要素データを格納する。そして、演算部51〜53は、レジスタファイル411〜413及び421〜423に格納された要素データを用いて重み差分演算を実行する。
ここで、図11及び12を参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図11は、畳み込みバックワードの重み差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図12は、畳み込みバックワードの重み差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、演算部51〜53の3つが存在する場合で説明する。この場合も、12行12列のボトムデータ201及び5行5列の重みデータ202を用いて畳み込みフォワード演算を行い算出したトップ差分データ203を使用する。
ストライド数が1の場合、最初に、図11の状態451に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb24〜b35が格納される。また、レジスタファイル421〜423には、要素データt00〜t07が格納される。
次に、状態451の演算が終了すると、状態452に示すように、レジスタファイル411〜413には、状態431で格納されていた要素データの次の1行分の要素データが格納される。また、状態452に示すように、レジスタファイル421〜423には、状態431で格納されていた要素データの次の1行分の要素データが格納される。このように、カーネル数で指定された単位で取り込むボトムデータを同じ行内においてストライド数1でずらせる回数が最大8回なので、状態453〜458においても順次、前の状態で格納されていた要素データの次の1行分の要素データがレジスタファイル411〜413及び421〜423に格納される。
そして、状態451〜458における演算部51〜53の演算が終了した時点で、ボトムデータ201の先頭にトップ差分データ203の先頭を合わせて配置した状態から行方向に順次移動した場合の畳み込みバックワードの重み差分演算が完了する。ただし、状態451〜458の演算では、w15〜w24を算出する畳み込みバックワードの重み差分演算が行われていない。そこで、演算処理装置1は、畳み込みバックワードの重み差分演算を全て完了するには、先頭行がb36〜b47の行に重なるようにトップ差分データ203を移動させて、行方向にトップ差分データ203を移動させながら畳み込みバックワードの重み差分演算を行う処理を行う。
また、ストライド数が2の場合、最初に、図12の状態461に示すように、レジスタファイル411には、要素データb00〜b11が格納される。また、レジスタファイル412には、要素データb12〜b23が格納される。また、レジスタファイル413には、要素データb24〜b35が格納される。また、レジスタファイル421〜423には、カーネル数で指定された単位の要素データt00〜t04が格納される。
次に、状態461の演算が終了すると、状態462に示すように、レジスタファイル411〜413には、状態461で格納されていた要素データのストライド数分先の行の要素データが格納される。すなわち、レジスタファイル411には、状態461でのレジスタファイル413に格納されていた要素データが格納される。また、状態462のように、レジスタファイル421〜423には、状態461で格納されていた要素データの次の行の要素データt05〜t09が格納される。
ストライド数が2の場合に、カーネル数で指定された単位で取り込むボトムデータ201を同じ行内においてずらせる最大数が5回なので、状態463〜465においても順次、1つ前の状態で格納されていた要素データのストライド数分先の1行分の要素データがレジスタファイル411〜413に格納される。また、状態463〜465のように、レジスタファイル421〜423には、1つ前の状態で格納されていた要素データの次の行の要素データが格納される。
そして、状態461〜465における演算部51〜53の演算が終了した時点で、重み差分データ204の要素データw00〜w04,w05〜w09及びw10〜w14を含む3行分の畳み込みバックワードの重み差分演算が完了する。すなわち、トップ差分データ203の要素データt15〜t19及びt20〜t24を含む2行分の演算が未だ完了していない。そこで、演算処理装置1は、畳み込みフォワード演算を全て完了するには、ボトムデータ201の4及び5行目を先頭とする畳み込みフォワード演算を行う処理を行う。
次に、図13〜15を参照して、演算部50による重み差分積和演算の詳細について説明する。図13は、畳み込みバックワードの重み差分演算における最初の状態を表す図である。図14は、レジスタファイルに格納された1行分の要素データにおける最後の重み差分積和演算を行う状態を表す図である。図15は、次のストライド数分の行に移動した状態を表す図である。ここでは、12行12列のボトムデータ201及び5行5列の重みデータ202を使用し、ストライド数が1の場合で説明する。すなわち、トップ差分データ203は、8行8列に並んだ要素データt00〜t63を有する。
まず、畳み込みフォワード演算を開始する場合、レジスタファイル410に要素データb00〜b11が格納される。また、レジスタファイル420にトップ差分データ203の要素データt00〜t07が格納される。
ポインタ制御部16は、レジスタファイル410に格納された最初の要素データb00にレジスタファイル410における先頭ポインタ163を設定する。また、ポインタ制御部16は、レジスタファイル420におけるトップ差分データ203の先頭の要素データt00に、レジスタファイル420におけるポインタ164を設定する。
演算部50は、点線631で囲われた部分の、レジスタファイル410の先頭ポインタ163の位置からカーネル数の要素データb00〜b04を取得する。また、演算部50は、レジスタファイル420のポインタ164が指す要素データt00を取得する。そして、演算部50は、要素データb00〜b04と要素データt00をそれぞれ乗算する。次に、演算部50は、レジスタファイル430に格納された重み差分データ204の要素データw00〜w04の値を取得する。ここで、要素データw00〜w04の初期値は0である。そして、演算部50は、各乗算結果とレジスタファイル430に格納された要素データw00〜w04の値を合計し、レジスタファイル430の要素データw00〜w04を示す位置に格納する。
その後、ポインタ制御部16は、先頭ポインタ163のストライド数分の移動を7回繰り返し、図14の状態とする。また、ポインタ制御部16は、ポインタ164の1つずつの移動を7回繰り返し、図14の状態とする。
図14の状態で、演算部50は、点線631で囲われた部分の、レジスタファイル410の先頭ポインタ163の位置からカーネル数の要素データb07〜b11を取得する。また、演算部50は、レジスタファイル420のポインタ164が指す要素データt07を取得する。そして、演算部50は、要素データb07〜b11と要素データt07をそれぞれ乗算する。次に、演算部50は、レジスタファイル430に格納された重みデータ202の要素データw00〜w04の値を取得する。そして、演算部50は、各乗算結果とレジスタファイル430に格納された要素データw00〜w04の値を合計し、レジスタファイル430の要素データw00〜w04を示す位置に格納する。
図14の状態での重み差分積和演算が完了すると、レジスタファイル410に、新たに次のストライド数先の行の要素データb12〜b23が格納される。また、レジスタファイル420に次の行のトップ差分データ203の要素データt08〜t15が格納される。
そして、ポインタ制御部16は、先頭ポインタ161を初期化し、図15に示すように、レジスタファイル410に格納された最初の要素データb12に先頭ポインタ163を設定する。また、ポインタ制御部16は、ポインタ164を初期化し、レジスタファイル430におけるトップ差分データ203の先頭の要素データt08にポインタ164を設定する。
演算部50は、点線633で囲われた部分の、レジスタファイル410の先頭ポインタ163の位置からカーネル数の要素データb12〜b16を取得する。また、演算部50は、レジスタファイル420のポインタ164が指す要素データt08を取得する。そして、演算部50は、要素データb12〜b16と要素データt08をそれぞれ乗算する。次に、演算部50は、レジスタファイル430に格納された重みデータ202の要素データw00〜w04の値を取得する。そして、演算部50は、各乗算結果とレジスタファイル430に格納された要素データw00〜w04の値を合計し、レジスタファイル430の要素データw00〜w04を示す位置に格納する。
このように、ポインタ制御部16は、先頭ポインタ163をレジスタファイル410の先頭から1回の演算が完了する毎に、1スライド数分ずつボトムデータ201の列方向の移動数回スライドさせる。その後、ポインタ制御部16は、最後尾に達すると、先頭ポインタ163を初期化して先頭に戻す。また、ポインタ制御部16は、ポインタ164をレジスタファイル430の先頭から1回の演算が完了する毎に、1つずつトップ差分データ203の列方向の移動数回スライドさせる。その後、ポインタ164が最後尾に達すると、ポインタ制御部16は、ポインタ164を初期化して先頭に戻す。
演算部50は、先頭ポインタ163及びポインタ164を用いて、重み差分積和演算を繰り返して重み差分データ204を順次求める。
次に、図16を参照して、畳み込みバックワードのボトム差分演算を実行する場合について説明する。図16は、畳み込みバックワードのボトム差分演算時におけるレジスタファイルへのデータの格納状態を示す図である。図16では、演算処理装置1は、5行5列に要素データが並んだトップ差分データ203及び5行5列に要素データが並んだ重みデータ202を用いる。重みデータ202は、要素データw00〜w24を有する。また、トップ差分データ203は、12行12列のボトムデータ201及び重みデータ202を用いて、ストライド2の場合に求められたものであり、要素データt00〜t24を有する。
さらに、本実施例では、トップ差分データ203の行数の演算部50が用いられる。これにより、演算部50は、トップ差分データ格納用のレジスタファイル410(以降、これを単にレジスタファイル410とする。)のデータの入れ替えを行わずに、全てのボトムデータ201に対する畳み込みバックワードのボトム差分演算を行うことができる。例えば、図16では、5個の演算部50が用いられる。
第1データ制御部12は、畳み込みバックワードの重み差分演算で用いるトップ差分データ203、重みデータ202及びボトムデータ201のサイズを予め記憶する。例えば、第1データ制御部12は、予め表示装置及び入力装置を用いて設定された設定値の入力により、トップ差分データ203、重みデータ202及びボトムデータ201のサイズ及び重みデータ202のサイズ(あるいはカーネル数)を取得して記憶する。
第1データ制御部12は、トップ差分データ203における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt00〜t04のデータを読み込む。そして、第1データ制御部12は、要素データt00〜t04をトップ差分データ格納用のレジスタファイル411に格納する。
また、第1データ制御部12は、トップ差分データ203における次の1行の要素データをメモリ11から読み込む。例えば、第1データ制御部12は、要素データt05〜t09のデータを読み込む。そして、第1データ制御部12は、要素データt05〜t09をトップ差分データ格納用のレジスタファイル412に格納する。
第1データ制御部12は、トップ差分データ203の行数、1行毎の要素データのメモリ11から読み込み及び異なるトップ差分データ格納用のレジスタファイル411〜413(以降、これを単にレジスタファイル411,412,413とする。)への格納を繰り返す。例えば、第1データ制御部12は、要素データb20〜b24をトップ差分データ格納用のレジスタファイル413に格納する。
また、第2データ制御部13は、重みデータ202における先頭位置から1行分の要素データをメモリ11から読み込む。例えば、第2データ制御部13は、要素データw00〜w04をメモリ11から読み込む。そして、第2データ制御部13は、重みデータ格納用のレジスタファイル421〜423(以降、これを単にレジスタファイル421,422,423とする。)に要素データw00〜w04を格納する。
演算部51は、レジスタファイル410に格納された要素データt00〜t04とレジスタファイル420に格納された要素データw00〜w04とを用いてボトム差分積和演算を行い、重み差分データ204の要素データw00〜w05の仮の値を算出する。そして、演算部51は、演算結果格納用のレジスタファイル430(以降、これを単にレジスタファイル430とする。)にボトム差分データ205の要素データb01〜b23の値を格納する。
演算部52〜53も、演算部51と同様のボトム差分積和演算を行い、演算結果である要素データb24〜b47,・・・,b107〜b119の仮の値をそれぞれ演算結果格納用のレジスタファイル432〜433(以降、これを単にレジスタファイル432,433とする。)に格納する。
次に、レジスタファイル411〜413は、保持するデータを維持する。また、第2データ制御部13により、レジスタファイル421〜423には、要素データw05〜w09が格納される。
演算部51は、レジスタファイル411に格納された要素データt01〜t05とレジスタファイル421に格納された要素データw05〜w09とを用いてボトム差分積和演算を行う。演算部51は、レジスタファイル431のポインタが示す位置にボトム差分データ205の値をたしこんでいくことで、ボトム差分データ205の要素データb48〜b71の値をレジスタファイル431に格納する。
演算部52〜53も、演算部51と同様の重み差分積和演算を行い、演算結果をレジスタファイル432〜433の値にたしこんでいく。そして、レジスタファイル420に重みデータ202の最後の行の要素データw20〜w24が格納された状態で演算を行った時点で、演算部51〜53は、ボトム差分積和演算を終了し、各ボトム差分データ205の値を確定する。
このように、第1データ制御部12は、トップ差分データ203の先頭の行から順に1行ずつ要素データをレジスタファイル411〜413に格納する。また、第2データ制御部13は、トップ差分データ203の先頭の行から順に演算毎に1行ずつずらしながら要素データをレジスタファイル421〜423に格納する。そして、演算部51〜53は、カーネル数の演算を行うと演算を終了する。
ここで、図17及び18を参照して、レジスタファイル410及び420に格納される要素データの遷移について説明する。図17は、畳み込みバックワードのボトム差分演算におけるストライド数が1の場合の格納される要素データの遷移を表す図である。また、図18は、畳み込みバックワードのボトム差分演算におけるストライド数が2の場合の格納される要素データの遷移を表す図である。ここでは、演算部51〜53の3つが存在する場合で説明する。また、この場合も、12行12列のボトムデータ201、5行5列の重みデータ202及びそれらを用いたトップ差分データ203を用いる。
3を使用する。
ストライド数が1の場合、最初に、図17の状態471に示すように、レジスタファイル411には、要素データt00〜t07が格納される。また、レジスタファイル412には、要素データt08〜t15が格納される。また、レジスタファイル413には、要素データt16〜t23が格納される。また、レジスタファイル421〜423には、要素データw00〜w04が格納される。レジスタファイル421〜423には同じ要素データが格納されるので、図17では、レジスタファイル421を例に記載した。
次に、状態471の演算が終了すると、状態472に示すように、レジスタファイル411〜413には、状態471で格納されていた要素データがそのまま保持される。また、状態472に示すように、レジスタファイル421〜423には、状態471で格納されていた要素データの次の1行分の要素データが格納される。このように、状態473〜475においてもレジスタファイル411〜413には、状態471で格納されていた要素データがそのまま保持される。また、レジスタファイル421〜423には、前の状態で格納されていた要素データの次の1行分の要素データが順次格納される。
状態471〜475における演算部51〜53の演算が終了した時点では、畳み込みバックワードのボトム差分演算は途中である。実際には、トップ差分データ203の行数と同じ数の演算部50を用いることで、カーネル数の演算を行うと畳み込みバックワードのボトム差分演算が終了する。すなわち、図17のように3個の演算部51〜53を用いた場合、状態471〜475の後に、第1データ制御部12及び第2データ制御部13は、トップ差分データ203の行数と同じ数の演算部50を用いた場合と同様の残りの演算を行う。
また、ストライド数が2の場合、図18の状態481に示すように、レジスタファイル410にはストライド数が1の場合と同じ値が格納される。また、レジスタファイル420には、要素データw00〜w04及びw05〜w09が格納される。
そして、演算部51は、状態481における演算結果を、レジスタファイル431の要素データb00〜b23の位置に足し込む。具体的には、演算部51は、要素データt0〜t7と要素データw00〜w04を用いた演算結果を要素データb00〜b11の位置に足し込む。また、演算部51は、要素データt00〜t07と要素データw05〜w09を用いた演算結果を要素データb12〜b23の位置に足し込む。
また、演算部52は、状態481における演算結果を、レジスタファイル431の要素データb24〜b47の位置に足し込む。具体的には、演算部52は、要素データt08〜t15と要素データw00〜w04を用いた演算結果を要素データb24〜b35の位置に足し込む。また、演算部52は、要素データt08〜t15と要素データw05〜w09を用いた演算結果を要素データb36〜b47の位置に足し込む。
また、演算部53は、状態481における演算結果を、レジスタファイル433の要素データb48〜b71の位置にたしこむ。具体的には、演算部51は、要素データt0〜t7と要素データw00〜w04を用いた演算結果を要素データb00〜b11の位置に足し込む。また、演算部51は、要素データt00〜t07と要素データw05〜w09を用いた演算結果を要素データb12〜b23の位置に足し込む。
次に、状態481の演算が終了すると、状態482に示すように、演算部51の演算結果をたしこむ位置が、レジスタファイル431には、状態481におけるレジスタファイル432の要素データb24〜b47が移される。また、レジスタファイル432には、状態481におけるレジスタファイル433の要素データb48〜b71が移される。さらに、レジスタファイル433には、新たに、要素データb72〜b95が格納される。ただし、要素データb00〜b143の初期値はいずれも0である。
状態483〜483においても順次、1つ前の状態でレジスタファイル432に格納されていた要素データがレジスタファイル431に移され、1つ前の状態でレジスタファイル433に格納されていた要素データがレジスタファイル432に移される。さらに、レジスタファイル433には、新たにストライド数の行分の要素データが格納される。そして、演算部51〜53は、その時点でのレジスタファイル431〜433の対応する値に要素データに演算結果を足し込む。
ここで、状態481〜483における演算部51〜53の演算が終了した時点では、畳み込みバックワードのボトム差分演算は途中である。実際には、トップ差分データ203の行数と同じ数の演算部50を用いることで、カーネル数の演算を行うと畳み込みバックワードのボトム差分演算が終了する。すなわち、図18のように3個の演算部51〜53を用いた場合、状態481〜483に加えて、演算部51〜53、第1データ制御部12及び第2データ制御部13は、トップ差分データ203の行数と同じ数の演算部50を用いた場合と同様の残りの演算を行う。
次に、図19〜21を参照して、演算部50によるボトム差分積和演算の詳細について説明する。図19は、畳み込みバックワードのボトム差分演算における最初の状態を表す図である。図20は、ボトムデータの1行分の最後のボトム差分積和演算を行う状態を表す図である。図21は、ボトムデータの1行分において用いる要素データを説明するための図である。ここでは、ボトムデータ201及び重みデータ202を使用し、ストライド数が1の場合で説明する。すなわち、トップ差分データ203は、8行8列に並んだ要素データt00〜t63を有する。
まず、畳み込みバックワードのボトム差分演算を開始する場合、レジスタファイル410にトップ差分データ203の要素データt00〜t07が格納される。また、レジスタファイル420に重みデータ202の要素データw00〜w04が格納される。
ポインタ制御部16は、レジスタファイル430に格納された最初の要素データb00にレジスタファイル430における先頭ポインタ165を設定する。また、ポインタ制御部16は、レジスタファイル410におけるトップ差分データ203の先頭の要素データt00に、レジスタファイル410におけるポインタ164を設定する。
演算部50は、レジスタファイル410のポインタ164が指す要素データt00を取得する。さらに、演算部50は、レジスタファイル420に格納された要素データw00〜w04を取得する。また、演算部50は、点線651で囲われた部分の、レジスタファイル430の先頭ポインタ165の位置からカーネル数の要素データb00〜b04を取得する。ここで、要素データb00〜b04の初期値は0である。そして、演算部50は、要素データw00〜w04と要素データt00をそれぞれ乗算する。そして、演算部50は、各乗算結果をレジスタファイル430の要素データb00〜b04の値に加算し、レジスタファイル430の要素データb00〜b04を示す位置に格納する。
その後、ポインタ制御部16は、先頭ポインタ165のストライド数分の移動を7回繰り返し、図20の状態とする。また、ポインタ制御部16は、ポインタ164の1つずつの移動を7回繰り返し、図20の状態とする。
図20の状態で、演算部50は、レジスタファイル410のポインタ164が指す要素データt07を取得する。さらに、演算部50は、レジスタファイル420に格納された要素データw00〜w04を取得する。また、演算部50は、点線652で囲われた部分の、レジスタファイル430の先頭ポインタ165の位置からカーネル数の要素データb07〜b11を取得する。ここで、要素データb07〜b11の初期値は0である。そして、演算部50は、要素データw00〜w04と要素データt07をそれぞれ乗算する。そして、演算部50は、各乗算結果をレジスタファイル430の要素データb07〜b11の値に加算し、レジスタファイル430の要素データb07〜b11を示す位置に格納する。
図20の状態でのボトム差分積和演算が完了すると、レジスタファイル420に、新たに次の行の要素データw05〜w09が格納される。
そして、ポインタ制御部16は、先頭ポインタ165を初期化し、レジスタファイル430に格納された最初の要素データb12に先頭ポインタ163を設定する。また、ポインタ制御部16は、ポインタ164を初期化し、レジスタファイル410におけるトップ差分データ203の先頭の要素データt00にポインタ164を設定する。その後、演算部50は、同様のボトム差分演算を繰り返し、先頭ポインタ165で指定された要素データの格納位置に演算結果をたしこむ。
このように、ポインタ制御部16は、先頭ポインタ165をレジスタファイル430の先頭から1回の演算が完了する毎に、スライド数分ずつボトム差分データ205の列方向の移動数回スライドさせる。また、ポインタ制御部16は、ポインタ166をレジスタファイル410の先頭から1回の演算が完了する毎に、1つずつ最大移動数回スライドさせる。その後、ポインタ166が最後尾に達すると、ポインタ制御部16は、ポインタ164に初期化して先頭に戻す。
演算部50は、先頭ポインタ165及びポインタ166を用いて、ボトム差分積和演算を繰り返してボトム差分データ205を順次求める。
演算部50は、ボトム差分データ205の1行を求めるに当たり、列各行毎に用いる重みデータ202及びトップ差分データ203の行の数が異なる。
図21は、ボトム差分データの上端の1行を算出する場合の例である。ボトム差分データ205の要素データb00〜b11を算出する場合、要素データ00〜w04と要素データt00〜t07を用いた1行分の演算結果が用いられる。また、ボトム差分データ205の要素データb12〜b23の値の算出には、要素データ00〜w04と要素データt08〜t15を用いた1行分の演算結果と要素データ05〜w09と要素データt00〜t07を用いた1行分の演算結果とが用いられる。また、ボトム差分データ205の要素データb24〜35の値の算出には、図21で示す3行分の演算結果が用いられる。図21のボトム差分データ205の各行の先頭の列である欄172に記載した数字は、その行の要素データを算出するのに用いる行の数である。ここで、ボトム差分データ205の各列をB_L0〜B_L11と表す。そして、各列の要素データの算出に用いる行の数をまとめると表171のように表される。のこのように、行の先頭から列向に向けて要素データの算出に用いる行は一旦増えその後最後尾に向けて少なくなる。
次に、図22を用いて畳み込みフォワード演算及び畳み込みバックワード演算を用いた深層学習の全体的な処理の流れを説明する。図22は、深層学習処理のフローチャートである。
例えば、図4などで示した構成の番号を用いて説明すると、第1データ制御部12は、指定された先頭行からストライド数の行分のボトムデータ201の要素データを取得する。また、第2データ制御部13は、指定された先頭行からストライド数の行分の重みデータ202の要素データを取得する(ステップS1)。そして、第1データ制御部12は、取得した要素データをレジスタファイル410に格納する。また、第2データ制御部13は、取得した要素データをレジスタファイル420に格納する。
演算部50は、レジスタファイル410及び420に格納された要素データを用いて、ストライド数の行分のボトムデータ201に対するフォワード積和演算を実施する(ステップS2)。
演算部50は、ボトムデータ201に演算を行っていない残りの行があるか否かを判定する(ステップS3)。残りの行がある場合(ステップS3:肯定)、第1データ制御部12及び第2データ制御部13は、それぞれボトムデータ201の先頭行の指定をストライド数先の行へ移動する(ステップS4)。
これに対して、残りの行が無い場合(ステップS3:否定)、演算部50は、出力データ206の算出を終了する。次に、演算部50は、トップ差分データ203を取得する(ステップS5)。ここで、演算部50は、最終層であれば算出した出力データ206と期待値207との差分を求めることでトップ差分データ203を取得する。また、他の層であれば、演算部50は、1つ後の層で算出されたボトム差分データ205を自層のトップ差分データ203として取得する。
次に、第1データ制御部12は、指定された先頭行からストライド数の行分のボトムデータ201の要素データを取得する。また、第2データ制御部13は、指定された先頭行から1行分のトップ差分データ203の要素データを取得する(ステップS6)。そして、第1データ制御部12は、取得した要素データをレジスタファイル410に格納する。また、第2データ制御部13は、取得した要素データをレジスタファイル420に格納する。
演算部50は、レジスタファイル410及び420に格納された要素データを用いて、1行分のボトムデータ201に対する重み差分積和演算を実施する(ステップS7)。
演算部50は、ボトムデータ201に演算を行っていない残りの行があるか否かを判定する(ステップS8)。残りの行がある場合(ステップS8:肯定)、第1データ制御部12は、ボトムデータ201の先頭行の指定をストライド数先の行へ移動する(ステップS9)。
これに対して、残りの行が無い場合(ステップS8:否定)、第1データ制御部12は、指定された先頭行から1行分のトップ差分データ203の要素データを取得する。また、第2データ制御部13は、指定された先頭行からストライド数の行分の重みデータ202の要素データを取得する(ステップS10)。そして、第1データ制御部12は、取得した要素データをレジスタファイル410に格納する。また、第2データ制御部13は、取得した要素データをレジスタファイル420に格納する。
演算部50は、レジスタファイル410及び420に格納された要素データを用いて、1行分のトップ差分データ203に対するボトム差分積和演算を実施する(ステップS11)。
演算部50は、カーネル数の演算が終了したか否かを判定する(ステップS12)。カーネル数の演算が終了していない場合(ステップS12:否定)、第1データ制御部12は、トップ差分データ203の1先の行へ先頭行の指定を移動する(ステップS13)。
これに対して、カーネル数の演算処理が終了している場合(ステップS12:肯定)、演算部50は、畳み込みフィードバック演算、並びに、畳み込みバックワードの重み差分演算及びボトム差分演算を終了する。
次に、図23を参照して、畳み込みフォワード演算処理の詳細な流れについて説明する。図23は、畳み込みフォワード演算処理のフローチャートである。ここで、図23のフローチャートで示す畳み込みフィードバック演算処理は、図22におけるステップS1〜S4までの処理の詳細の一例にあたる。
例えば、図4で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を受ける(ステップS101)。
ポインタ制御部16は、ボトムデータ格納用のレジスタファイル410(以降、これを単にレジスタファイル410とする。)の先頭ポインタ161及び重みデータ格納用のレジスタファイル420(以降、これを単にレジスタファイル420とする。)のポインタ162を初期化する(ステップS102)。
第1データ制御部12は、指定された先頭行からストライド数の行分のボトムデータ201の要素データをメモリ11から読み出し、レジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行からストライド数の行分のボトムデータ201の要素データをメモリ11から読み出し、レジスタファイル420に格納する(ステップS103)。
演算部50は、レジスタファイル410の先頭ポインタ161からカーネル数のボトムデータ201の要素データを読み込む。また、演算部50は、レジスタファイル420から重みデータ202の要素データを読み込む(ステップS104)。
演算部50は、対応するボトムデータ201の要素データと重みデータ202の要素データとを乗算し、乗算結果を合計する(ステップS105)。
次に、演算部50は、演算結果格納用のレジスタファイル430(以降、これを単にレジスタファイル430とする。)のポインタ162が指す値を取得する(ステップS106)。
次に、演算部50は、取得した値に演算結果を加算し値を更新する(ステップS107)。
次に、演算部50は、演算結果格納用のレジスタファイル430(以降、これを単にレジスタファイル430とする。)のポインタ162が示す位置に加算結果を格納してポインタ162が示す値を更新する(ステップS108)。
そして、演算部50は、ボトムデータ201の指定された行に対する演算が終了したか否かを判定する(ステップS109)。ここで、指定された行とは、指定された先頭行からストライド数分の行である。
ボトムデータ201の指定された行に対する演算が終了していない場合(ステップS109:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタをストライド数分シフトする(ステップS110)。
さらに、ポインタ制御部16は、レジスタファイル430のポインタ162を1つシフトする(ステップS111)。その後、処理は、ステップS104へ戻る。
これに対して、ボトムデータ201の指定された行に対する演算が完了した場合(ステップS109:肯定)、演算部50は、ボトムデータ201の全ての行について演算が終了したか否かを判定する(ステップS112)。
演算を行っていない行がある場合(ステップS112:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12及び第2データ制御部13は、それぞれボトムデータ201及び重みデータ202における現在の先頭行からストライド数分先の行を先頭行として指定する(ステップS113)。
これに対して、ボトムデータ201の全ての行について演算が終了した場合(ステップS112:肯定)、演算部50は、畳み込みフィードバック演算処理を終了する。
次に、図24を参照して、畳み込みバックワードの重み差分演算処理の詳細な流れについて説明する。図24は、畳み込みバックワードの重み差分演算処理のフローチャートである。ここで、図24のフローチャートで示す畳み込みバックワードの重み差分演算処理は、図22におけるステップS5〜S9までの処理の詳細の一例にあたる。
例えば、図10で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS201)。
ポインタ制御部16は、ボトムデータ格納用のレジスタファイル410(以降、これを単にレジスタファイル410とする。)の先頭ポインタ163及びトップ差分データ格納用のレジスタファイル420(以降、これを単にレジスタファイル420とする。)のポインタ164を初期化する(ステップS202)。
第1データ制御部12は、指定された先頭行のボトムデータ201の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS203)。
演算部50は、レジスタファイル410の先頭ポインタ163からカーネル数分のボトムデータ201の要素データを読み込む。また、演算部50は、レジスタファイル420のポインタ164が示すトップ差分データ203の1つの要素データを読み込む(ステップS204)。
次に、演算部50は、読み込んだボトムデータ201の要素データそれぞれに読み込んだトップ差分データ203を乗算し、乗算結果を取得する(ステップS205)。
次に、演算部50は、演算を行う最初の行がボトムデータ201の上から何行目の行かを判定する。そして、演算部50は、演算結果格納用のレジスタファイル430(以降、これを単にレジスタファイル430とする。)に重みデータ202の上から同じ行目の行の要素データの値を格納すると決定する。そして、演算部50は、重みデータ202の初期値として0を格納する。その後、演算部50は、レジスタファイル430から重みデータ202の値を取得する(ステップS206)。
そして、演算部50は、取得した重みデータ202の要素データの先頭から順に、加算に使用したボトムデータ201の要素データの順番にしたがい並べた演算結果を対応させ、対応する値を加算する(ステップS207)。
そして、演算部50は、加算した値を、レジスタファイル430の加算に使用した要素データが格納されていた位置に格納し直し更新する(ステップS208)。
そして、演算部50は、ボトムデータ201の指定された行に対する演算が完了したか否かを判定する(ステップS209)。
ボトムデータ201の指定された行に対する演算が完了していない場合(ステップS209:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ163をストライド数分シフトする(ステップS210)。
さらに、ポインタ制御部16は、レジスタファイル420のポインタ164を1つシフトする(ステップS211)。その後、処理は、ステップS204へ戻る。
これに対して、ボトムデータ201の指定された行に対する演算が完了した場合(ステップS209:肯定)、演算部50は、ボトムデータ201の全ての行について演算が終了したか否かを判定する(ステップS212)。
演算を行っていない行がある場合(ステップS212:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行からストライド数分先の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行から1行先の行を先頭行として指定する(ステップS213)。
これに対して、ボトムデータ201の全ての行について演算が終了した場合(ステップS212:肯定)、演算部50は、畳み込みバックワードの重み差分演算処理を終了する。
次に、図25を参照して、畳み込みバックワードのボトム差分演算処理の詳細な流れについて説明する。図25は、畳み込みバックワードのボトム差分演算処理のフローチャートである。ここで、図25のフローチャートで示す畳み込みバックワードのボトム差分演算処理は、図22におけるステップS10〜S12までの処理の詳細の一例にあたる。
例えば、図16で示した構成の番号を用いて説明すると、第1データ制御部12、第2データ制御部13、演算部50及びポインタ制御部16は、カーネルサイズ(あるいはカーネル数)、ストライド数及びボトムデータ201の先頭行の指定を取得する(ステップS301)。
ポインタ制御部16は、レジスタファイル410のポインタ166及びレジスタファイル430の先頭ポインタ165を初期化する(ステップS302)。
第1データ制御部12は、指定された先頭行のトップ差分データ203の要素データをメモリ11から読み出しレジスタファイル410に格納する。また、第2データ制御部13は、指定された先頭行からストライド数の行分の重みデータ202の要素データをメモリ11から読み出しレジスタファイル420に格納する(ステップS303)。
演算部50は、レジスタファイル410のポインタ166が示すトップ差分データ203の要素データを読み込む。また、演算部50は、レジスタファイル420に格納された重み差分データ204の要素データを読み込む(ステップS304)。
次に、演算部50は、読み込んだ重み差分データ204の要素データそれぞれに読み込んだトップ差分データ403を乗算し、乗算結果を取得する(ステップS305)。
次に、演算部50は、レジスタファイル430の先頭ポインタ165が示す位置からカーネル数分のボトム差分データ205の要素データの値を取得する(ステップS306)。
そして、演算部50は、取得したボトム差分データ205の先頭から順に、使用した重みデータ202の要素データの順番で並べた演算結果を対応させ、対応する値を加算する(ステップS307)。この時、演算結果は、ボトム差分データ205のストライド数の行分生成される。
そして、演算部50は、加算結果であるボトム差分データ205のストライド数の行分のボトム差分データ205を、レジスタファイル430の加算に使用した要素データが格納されていた位置に格納することで更新する(ステップS308)。
そして、演算部50は、トップ差分データ203の指定された行に対する演算が完了したか否かを判定する(ステップS309)。
トップ差分データ203の指定された行に対する演算が完了していない場合(ステップS309:否定)、ポインタ制御部16は、レジスタファイル410の先頭ポインタ166を1つシフトする(ステップS310)。
さらに、ポインタ制御部16は、レジスタファイル430のポインタ165をストライド数分シフトする(ステップS311)。その後、処理は、ステップS304へ戻る。
これに対して、トップ差分データ203の指定された行に対する演算が完了した場合(ステップS309:肯定)、演算部50は、カーネル数分の演算が終了したか否かを判定する(ステップS312)。
カーネル数分の演算を行っていない場合(ステップS312:否定)、演算部50は、行分演算の完了を第1データ制御部12及び第2データ制御部13に通知する。第1データ制御部12は、ボトムデータ201における現在の先頭行の次の行を先頭行として指定する。また、第2データ制御部13は、トップ差分データ203における現在の先頭行の次の行を先頭行として指定する(ステップS313)。
これに対して、カーネル数分の演算が終了した場合(ステップS312:肯定)、演算部50は、畳み込みバックワードのボトム差分演算処理を終了する。
以上に説明したように、本実施例に係る演算処理装置は、演算に使用する行列に並んだデータの1行ずつの演算をまとめて行い、その演算結果を用いて行列に並んだデータ同士の演算を行う。そして各演算部は、異なる行の演算を行うため、同じデータを同時に用いることはなくなる。そのため、データの読み出し時のコンフリクトを回避でき、またデータの複製を保持しなくても良くなる。さらに、使用する行をずらしながら演算を行っていくため、同じ行を使用する回数を低減でき、効率よく入力データを使用することができる。したがって、コストの増加を抑えつつ演算処理速度を向上させることができる。