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