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