(57)【要約】  行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成するリスト生成部と、演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う演算実行部と、を備える演算装置。
2018235357.tif 000002
【特許請求の範囲】
【請求項１】
行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成するリスト生成部と、
演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う演算実行部と、
を備える演算装置。
【請求項２】
前記リスト生成部は、前記演算用行列における位置毎に、値が０以外である前記第１の要素の前記要素値を示す前記リストを生成する、
請求項１に記載の演算装置。
【請求項３】
前記リストを参照して、前記演算対象行列が有する複数の前記第２の要素のうち、演算対象の各第１の要素に０以外の前記要素値の前記第１の要素が含まれる前記第２の要素の前記要素値をロードし、前記演算対象の各第１の要素の前記要素値が全て０である前記第２の要素の前記要素値のロードを抑制するメモリ管理部を備える、
請求項１または請求項２に記載の演算装置。
【請求項４】
主記憶装置を示す第１の階層と、前記第１の階層より高速の第２の階層とを有する記憶部を備え、
少なくとも１つの前記部分行列に対する演算を開始してから終了するまで、演算結果を格納する行列を前記第２の階層に保持する、
請求項１から３の何れか一項に記載の演算装置。
【請求項５】
前記演算実行部は、前記演算対象行列が有する前記第２の要素のうち複数の部分行列に共通する前記第２の要素の前記要素値をロードした場合、ロードした前記要素値を用いて前記複数の部分行列の各々の前記演算を行う、
請求項１から４の何れか一項に記載の演算装置。
【請求項６】
行数及び列数が等しい複数の演算用行列が有する第１の要素の前記演算用行列における位置毎に、値が０以外である前記第１の要素の前記要素値を示すリストを生成するリスト生成部と、
演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う演算実行部と、
を備える演算装置。
【請求項７】
行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成し、
演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う
ことを含む演算方法。
【請求項８】
コンピュータに、
行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成し、
演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算する
処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算装置、演算方法及びプログラムに関する。
【背景技術】
【０００２】
畳み込みニューラルネットワークなど、二次元畳み込み行列の演算を用いる処理の高速化に関して幾つかの技術が提案されている。
例えば、特許文献１には、平均プーリングが実行される畳み込みニューラルネットワークの演算量を削減するための技術が示されている。特許文献１に記載の技術では、平均プーリングにおいて畳み込み層の出力の平均を求めることに基づいて、カーネルの要素毎に、当該要素と掛け合わされる入力値の総和を算出し、算出した総和とカーネルの要素との積を算出し、積の平均を算出する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１７−０７８９３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
コンピュータが二次元畳み込み行列の演算などの行列演算を行う場合、演算に要する時間には、ＣＰＵが計算を行う時間（計算時間）だけでなく、ＣＰＵがメモリにアクセスして演算対象のデータを取得する時間（メモリアクセス時間）が含まれる。行列演算を高速化するためには、演算回数を低減させて計算時間を低減させるだけでなく、メモリアクセス回数を低減させてメモリアクセス時間を低減させられることが好ましい。【０００５】
本発明は、上述の課題を解決することのできる演算装置、演算方法及びプログラムを提供することを目的としている。
【課題を解決するための手段】
【０００６】
本発明の第１の態様によれば、演算装置は、行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成するリスト生成部と、演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う演算実行部と、を備える。【０００７】
本発明の第２の態様によれば、演算装置は、行数及び列数が等しい複数の演算用行列が有する第１の要素の前記演算用行列における位置毎に、値が０以外である前記第１の要素の前記要素値を示すリストを生成するリスト生成部と、演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行う演算実行部と、を備える。【０００８】
本発明の第３の態様によれば、演算方法は、行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成し、演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算を行うことを含む。【０００９】
本発明の第４の態様によれば、プログラムは、コンピュータに、行数及び列数が等しい複数の演算用行列が有する各第１の要素の前記演算用行列における位置毎に、前記第１の要素の要素値を示すリストを生成し、演算対象行列のうち前記演算用行列と同じ行数及び列数の部分行列が有する第２の要素の要素値と、前記リストに示される前記第１の要素の要素値とに基づく演算する処理を実行させるプログラムである。
【発明の効果】
【００１０】
この発明によれば、二次元畳み込み行列の演算などの行列演算におけるメモリアクセス回数を低減させることができる。
【図面の簡単な説明】
【００１１】
【図１】一実施形態に係る演算装置の機能構成を示す概略ブロック図である。
【図２】実施形態に係るリスト生成部が二次元の畳み込みに用いる行列の構成例を示す図である。
【図３】実施形態に係る二次元の畳み込みにおける部分行列９１１の設定例を示す図である。
【図４】実施形態に係る演算実行部が複数のインプット行列及び複数のカーネルを用いて畳み込みを行う例を示す図である。
【図５】実施形態に係る演算実行部が１つのインプット行列と複数のカーネルの各々との畳み込みを行う例を示す図である。
【図６】実施形態に係るリスト生成部が生成する要素リストの例を示す図である。
【図７】実施形態に係るリスト生成部が要素リストを生成する処理手順の例を示すフローチャートである。
【図８】実施形態に係る要素リストのテンプレートの例を示す図である。
【図９】実施形態に係る演算装置がインプット行列の部分行列とカーネルとの畳み込みを行う処理手順の例を示すフローチャートである。
【図１０】畳み込みに要する計算時間とメモリアクセス時間の例を示すグラフである。
【図１１】実施形態に係る演算装置が、インプット行列からの要素値の１回のロードで複数の部分行列に対する処理を行う場合の、複数の部分行列の配置例を示す図である。
【図１２】実施形態に係るコンピュータの構成例を示す概略ブロック図である。
【図１３】一実施形態に係る演算装置の最小構成の第一例を示す図である。
【図１４】一実施形態に係る演算装置の最小構成の第二例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本発明の実施形態を説明するが、以下の実施形態は請求の範囲にかかる発明を限定するものではない。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図１は、一実施形態に係る演算装置の機能構成を示す概略ブロック図である。図１に示すように、演算装置１００は、通信部１１０と、表示部１２０と、操作入力部１３０と、記憶部１８０と、制御部１９０とを備える。記憶部１８０は、キャッシュメモリ部１８１と、主記憶部１８２とを備える。制御部１９０は、リスト生成部１９１と、演算実行部１９２と、メモリ管理部１９３とを備える。
【００１３】
演算装置１００は、行列演算を行う。以下では、演算装置１００が二次元畳み込み行列（Convolution Matrix）の演算、すなわち、二次元の畳み込み（Convolution）を行う場合を例に説明する。二次元の畳み込みは、畳み込みニューラルネットワーク及び画像フィルタなど、いろいろな用途に用いられる。
但し、演算装置１００が行う行列演算は、二次元の畳み込みに限定されない。演算装置１００が行う行列演算は、要素値が値「０」である場合に演算の一部を省略可能ないろいろな演算であってよい。
【００１４】
演算装置１００は、例えばメインフレーム（Mainframe）、ワークステーション（Workstation）またはパソコン（Personal Computer；ＰＣ）等のコンピュータを用いて構成される。
以下では、畳み込みの演算子として「＊」（アスタリスク）を用いる。また、スカラ積の演算子として「×」（クロス）を用いる。
【００１５】
通信部１１０は、制御部１９０の制御に従って他の装置と通信する。例えば、通信部１１０が、二次元の畳み込みにおけるインプット行列を他の装置から受信するようにしてもよい。
表示部１２０は、例えば液晶パネル又はＬＥＤ（Light Emitting Diode、発光ダイオード）パネル等の表示画面を備え、制御部１９０の制御に従って各種画像を表示する。例えば、演算装置１００が二次元の畳み込みを用いて画像処理を行う場合、表示部１２０が、画像処理にて得られた画像を表示するようにしてもよい。また、演算装置１００が二次元の畳み込みを用いて畳み込みニューラルネットワークを構築する場合、表示部１２０が畳み込みニューラルネットワークによる処理結果を表示するようにしてもよい。
操作入力部１３０は、例えばキーボード及びマウス等の入力装置を備え、ユーザ操作を受ける。例えば、操作入力部１３０が、演算装置１００に対して処理の実行を指示するユーザ操作を受けるようにしてもよい。
【００１６】
記憶部１８０は、各種情報を記憶する。記憶部１８０は、演算装置１００が備える複数種類の記憶装置を用いて複数階層にしたがって構成されている。具体的には、演算装置１００は、キャッシュメモリ部１８１と主記憶部１８２との２階層にしたがって構成されている。キャッシュメモリ部１８１は、演算装置１００が備えるキャッシュメモリ装置を用いて構成されている。
主記憶部１８２は、演算装置１００が備える主記憶装置を用いて構成されている。
【００１７】
キャッシュメモリ装置は主記憶装置よりも高速に動作するデバイスを用いて構成される。キャッシュメモリ装置の方が主記憶装置よりも高速に読み書き可能である。主記憶部１８２の階層は主記憶装置の階層の例に該当し、キャッシュメモリ部１８１の階層は主記憶装置の階層よりも高速の階層の例に該当する。主記憶装置の階層を主記憶部１８２の階層とも称する。また、キャッシュメモリ装置の階層をキャッシュメモリ部１８１の階層とも称する。
キャッシュメモリ部１８１は、ＣＰＵ（Central Processing Unit、中央処理装置）などの処理装置が主記憶装置にアクセスすることによるメモリアクセス時間を短くするために設けられている。
【００１８】
演算装置１００が取得したデータは、基本的には主記憶部１８２に格納され、ＣＰＵ等によるアクセスが予想されるデータが一時的にキャッシュメモリ部１８１に格納される。
例えば、キャッシュメモリ部１８１に格納されていないデータにＣＰＵ等がアクセスする際、アクセス対象のデータが主記憶部１８２から読み出され、キャッシュメモリ部１８１へブロック単位で書き込まれる。また、主記憶部１８２からのデータをキャッシュメモリ部１８１に移動する際、このデータの格納領域を確保するために、例えばＬＲＵ（Least Recently Used）など所定の入替方式に従ってキャッシュメモリ部１８１上のデータがブロック単位で選択される。選択されたデータは主記憶部１８２へ書き込まれ、キャッシュメモリ部１８１におけるこのデータの記憶領域が解放される。
【００１９】
キャッシュメモリ部１８１が、制御部１９０が演算を行う際に演算結果を格納する行列を保持する（格納している状態を維持する）ようにしてもよい。例えば、制御部１９０が後述する部分行列に対する演算を開始してから終了するまで、キャッシュメモリ部１８１が演算結果を格納する行列を保持するようにしてもよい。
制御部１９０が演算結果の書き込みを繰り返す場合、キャッシュメモリ部１８１が書き込み対象の行列を保持している。これにより、制御部１９０が主記憶部１８２に演算結果を書き込む場合よりもメモリアクセス時間を短くすることができる。
【００２０】
なお、記憶部１８０の階層構造は、図１に示すキャッシュメモリ部１８１と主記憶部１８２との２層構造に限定されない。例えば、記憶部１８０が、一次キャッシュメモリ装置、二次キャッシュメモリ装置及び主記憶装置を用いることによって、３層構造にしたがって構成されていてもよい。また、記憶部１８０が、主記憶部１８２よりも高速の階層に加えて、補助記憶部など主記憶部１８２よりも低速の階層を含んで構成されていてもよい。
【００２１】
制御部１９０は、演算装置１００の各部を制御して各種処理を実行する。制御部１９０は、演算装置１００が備えるＣＰＵが記憶部１８０からプログラムを読み出して実行することで構成される。
リスト生成部１９１は、演算実行部１９２が二次元の畳み込みに用いるためのリストを生成する。このリストを要素リストとも称する。
演算実行部１９２は、リスト生成部１９１が生成した要素リストを用いて二次元の畳み込みを行う。
ここで、図２〜図６を参照して、二次元の畳み込み及び要素リストについて説明する。
【００２２】
図２は、演算実行部１９２が二次元の畳み込みに用いる行列の構成例を示す図である。
演算実行部１９２は、インプット行列９１０とカーネル９２０との畳み込みを行い、演算結果をアウトプット行列９３０に書き込む。
インプット行列９１０は、インプット行列９１０のうちカーネル９２０と同じ大きさの部分行列９１１とカーネル９２０との畳み込みを行ってアウトプット行列９３０の１つの要素の値を算出する。ここで、行列の大きさが同じであるとは、行列の行数及び列数のいずれも同じことである。
インプット行列９１０は、演算対象行列の例に該当する。カーネル９２０は、演算用行列の例に該当する。
【００２３】
部分行列９１１とカーネル９２０との畳み込みは、同じ位置の要素同士を乗算し、得られた積の総和を求めることで行われる。
図２の例の場合、部分行列９１１とカーネル９２０との畳み込みは式（１）のように表される。
【００２４】
【数１】
2018235357.tif 000003
【００２５】
例えば、図２の例で、部分行列９１１の第１行第１列の要素の値は「０」である。また、カーネル９２０の第１行第１列の要素の値も「０」である。これらの値の積は「０」になる。また、部分行列９１１の第１行第２列の要素の値は「１」である。また、カーネル９２０の第１行第２列の要素の値は「０」である。これらの値の積は「０」になる。また、部分行列９１１の第１行第３列の要素の値は「１」である。また、カーネル９２０の第１行第３列の要素の値は「２」である。これらの値の積は「２」になる。
【００２６】
このように、部分行列９１１及びカーネル９２０における同じ位置の要素同士を乗算し、得られた積の総和を求めると、図２の例では「７」となる。演算実行部１９２は、式（１）に例示されるような畳み込み演算をそのまま行うのではなく、リスト生成部１９１が生成した要素リストを用いて行うことで、計算回数及びメモリアクセス回数を低減させる。
【００２７】
演算実行部１９２は、部分行列９１１とカーネル９２０との畳み込みの演算結果を、アウトプット行列９３０の要素のうち、部分行列９１１の位置に対応する要素に書き込む。
図２の例では、演算実行部１９２は、アウトプット行列９３０の要素のうち、部分行列９１１の最左かつ最上の要素の位置の同じ位置の要素に演算結果を書き込むよう設定される。演算実行部１９２は、アウトプット行列９３０の第１行第１列の要素に演算結果の「７」を書き込む。
【００２８】
図３は、二次元の畳み込みにおける部分行列９１１の設定例を示す図である。
図３の例では、演算実行部１９２は、インプット行列９１０の部分行列９１１を１列ずつ右にずらした領域に設定しながら、図２を参照して説明したように部分行列９１１とカーネル９２０との畳み込みを繰り返す。部分行列９１１がインプット行列９１０の右端に到達すると、演算実行部１９２は、部分行列９１１の領域を１行下の左端から右端へとずらしながら、部分行列９１１とカーネル９２０との畳み込みを繰り返す。演算実行部１９２は、部分行列９１１の設定領域を左から右、上から下へとずらし、設定領域が右下端に到達するまで部分行列９１１の設定を繰り返す。演算実行部１９２は、部分行列９１１を設定する毎に部分行列９１１とカーネル９２０との畳み込みを繰り返す。これにより、演算実行部１９２は、インプット行列９１０全体に対応するアウトプット行列９３０を算出する。
【００２９】
図４は、演算実行部１９２が複数のインプット行列９１０及び複数のカーネル９２０を用いて畳み込みを行う例を示す図である。
図４の例で、演算実行部１９２は、Ｃ個のインプット行列９１０及び、Ｃ×Ｋ個のカーネル９２０を用いて二次元の畳み込みを行い、演算結果をＫ個のアウトプット行列９３０に書き込んでいる。Ｃ個のインプット行列９１０は、いずれも同じ大きさの行列である。Ｃ×Ｋ個のカーネル９２０は、いずれも同じ大きさの行列である。Ｋ個のアウトプット行列９３０は、いずれも同じ大きさの行列である。
【００３０】
図４では、Ｃ個のインプット行列９１０に９１０１、９１０２、・・・、９１０Ｃの符号を付してこれらが区別されている。また、Ｃ×Ｋ個のカーネル９２０に、９２０１−１、９２０１−２、・・・、９２０１−Ｃ、９２０２−１、９２０２−２、・・・、９２０２−Ｃ、・・・、９２０Ｋ−１、９２０Ｋ−２、・・・、９２０Ｋ−Ｃの符号を付してこれらを区別している。また、図４では、Ｋ個のアウトプット行列９３０に、９３０１、９３０２、・・・、９３０Ｋの符号を付してこれらが区別されている。
【００３１】
演算実行部１９２は、インプット行列９１０１とカーネル９２０１−１との畳み込み、インプット行列９１０２とカーネル９２０１−２との畳み込み、・・・、インプット行列９１０Ｃとカーネル９２０１−Ｃとの畳み込みを行い、演算結果を要素の位置毎に合計してアウトプット行列９３０１を算出する。アウトプット行列９３０２〜９３０Ｋの算出についても同様である。
すなわち、ｉを１≦ｉ≦Ｋの正整数として、演算実行部１９２は、インプット行列９１０ｉとカーネル９２０ｉ−１との畳み込み、インプット行列９１０２とカーネル９２０ｉ−２との畳み込み、・・・、インプット行列９１０Ｃとカーネル９２０ｉ−Ｃとの畳み込みを行う。演算実行部１９２は、演算結果を要素の位置毎に合計してアウトプット行列９３０ｉを算出する。
【００３２】
演算実行部１９２が、複数のインプット行列９１０に対して同じカーネル９２０を用いるようにしてもよいし、インプット行列９１０毎に異なるカーネル９２０を用いるようにしてもよい。例えば図４において、カーネル９２０１−１〜９２０１−Ｃが同一のカーネル９２０であってもよい。
このように、演算実行部１９２が複数のインプット行列９１０及び複数のカーネル９２０を用いて畳み込みを行うようにしてもよい。特に、演算実行部１９２は、１つのインプット行列９１０と複数のカーネル９２０の各々との畳み込みを行う。
【００３３】
図５は、演算実行部１９２が１つのインプット行列９１０と複数のカーネル９２０の各々との畳み込みを行う例を示す図である。図５の例では、演算実行部１９２は、１つのインプット行列９１０と４つのカーネル９２０の各々との畳み込みを行って４つのアウトプット行列９３０を算出している。演算実行部１９２は、図２〜図３を参照して説明したように、インプット行列９１０における部分行列９１１の領域の位置をずらしながら部分行列９１１とカーネル９２０との畳み込みを行う。これにより、演算実行部１９２は、１つのインプット行列９１０と個々のカーネル９２０との畳み込みを行う。
【００３４】
演算実行部１９２が１つのインプット行列９１０と複数のカーネル９２０の各々との畳み込みを行う際、処理を高速化するためにリスト生成部１９１が予め要素リストを生成しておく。
図６は、リスト生成部１９１が生成する要素リストの例を示す図である。図６では、図５の例におけるカーネル９２０に対してリスト生成部１９１が生成する要素リストの例を示している。
【００３５】
図６の例では、図５の４つのカーネル９２０に対して、上から順に０〜３の識別番号を付してこれらを区別している。また、図５の例で４つのカーネル９２０と４つのアウトプット行列９３０とが一対一に対応付けられており、４つのアウトプット行列９３０についても０〜３の識別番号で区別される。カーネル９２０の識別番号をカーネルＩＤ（Identifier）とも称する。
【００３６】
図６の要素リストの各行では、領域Ａ１１に示されるように、行０〜２と列０〜２との組み合わせによってカーネル９２０における各要素の位置が特定されている。
領域Ａ１１では、カーネル９２０の各要素の値が全て「０」である要素の位置については、その表示が除外されている。例えば、図５の４つのカーネル９２０のいずれでも、第１行第０列の要素値は「０」である。これに対応して、領域Ａ１１では、第１行第０列を表す「（１，０）」は示されていない。
【００３７】
図６の要素リストの各行では、特定された要素の位置における要素の値が、カーネル９２０の識別番号と組み合わせて領域Ａ１２に示されている。要素値が０の要素については、領域Ａ１２における表示から除外されている。
例えば、図５で一番上のカーネル９２０（識別番号０のカーネル９２０）の第０行第０列の要素値は「０」である。この要素は、領域Ａ１２では表示されていない。
一方、図５で上から２番目のカーネル９２０（識別番号１のカーネル９２０）の第０行第０列の要素値は「１」である。これに対応して、図６の要素リストの一番上の行（第０行第０列に対応する行）の領域Ａ１２では、カーネル９２０の識別番号「１」と、要素値「１」とを組み合わせた「（１，１）」が示されている。
【００３８】
また、図５で上から３番目のカーネル９２０（識別番号２のカーネル９２０）の第０行第０列の要素値は「１」である。これに対応して、図６の要素リストの一番上の行（第０行第０列に対応する行）の領域Ａ１２では、カーネル９２０の識別番号「２」と、要素値「１」とを組み合わせた「（２，１）」が示されている。
また、図５で上から３番目のカーネル９２０（識別番号２のカーネル９２０）の第０行第１列の要素値は「２」である。これに対応して、図６の要素リストの上から２番目の行（第０行第１列に対応する行）の領域Ａ１２では、カーネル９２０の識別番号「２」と、要素値「２」とを組み合わせた「（２，２）」が示されている。
このようにリスト生成部１９１は、複数のカーネル９２０の要素の位置毎に要素値を示す要素リストを生成する。また、リスト生成部１９１は、複数のカーネル９２０の要素の位置毎に、要素値が値「０」以外の要素を示す要素リストを生成する。
【００３９】
演算実行部１９２は、リスト生成部１９１が生成した要素リストを用いて部分行列９１１とカーネル９２０との畳み込みを行う。具体的には、演算実行部１９２は、部分行列９１１の要素のうち領域Ａ１１に示される位置の要素の値と、要素リストに示される要素値との乗算を行う。また、演算実行部１９２は、識別番号で識別されるアウトプット行列９３０の該当要素の値に乗算結果（得られた積）を加算する。
【００４０】
演算実行部１９２が、複数のカーネル９２０の要素の位置毎に要素値を示す要素リストを用いて畳み込みを行うことで、部分行列９１１の要素と複数のカーネル９２０それぞれの要素との乗算を行うことができる。これにより、部分行列９１１の要素値の１回のロードで複数のカーネル９２０の要素との乗算を行うことができ、部分行列９１１の要素値のダウンロード回数を低減させることができる。
【００４１】
また、演算実行部１９２が、複数のカーネル９２０の要素の位置毎に、要素値が０以外の要素を示す要素リストを用いる。これにより、カーネル９２０の要素値が０の場合に部分行列９１１の要素とカーネル９２０の要素との乗算、及び、乗算の結果をアウトプット行列９３０に反映させるためのアクセスを抑制することができる。この点で、演算回数及びメモリアクセスの回数を低減させることができる。
【００４２】
メモリ管理部１９３は、記憶部１８０管理を行う。具体的には、メモリ管理部１９３は、キャッシュメモリ部１８１、主記憶部１８２それぞれに対するデータの読み書きを行う。
特に、メモリ管理部１９３は、リスト生成部１９１が生成した要素リストを参照して、インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値に０以外の値が含まれている要素をロードする。一方、メモリ管理部１９３は、インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値が全て０の要素のロードを抑制する。
すなわち、メモリ管理部１９３は、インプット行列９１０が有する複数の要素のうち、カーネル９２０における演算対象の各要素に値「０」以外の要素が含まれる、要素の要素値をロードする。また、メモリ管理部１９３は、インプット行列９１０が有する複数の要素のうち、カーネル９２０における演算対象の各要素が全て値「０」である、要素の要素値のロードを抑制する。
【００４３】
インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値が全て０の要素のロードを抑制する。このため、演算装置１００によれば、メモリアクセスの回数を低減させることができる。
また、メモリ管理部１９３は、少なくとも演算実行部１９２が１つの前記部分行列に対する演算を開始してから終了するまで、アウトプット行列９３０をキャッシュメモリ部１８１に保持する。
これにより、メモリ管理部１９３は、演算実行部１９２による演算結果をアウトプット行列９３０に反映させる際のメモリアクセス時間を短くすることができる。
メモリ管理部１９３の機能はＣＰＵを用いて実現されていてもよいし、例えばメモリアクセス専用のプロセッサなどＣＰＵ以外の装置を用いて構成されていてもよい。
【００４４】
次に、図７〜図９を参照して演算装置１００の動作について説明する。
図７は、リスト生成部１９１が要素リストを生成する処理手順の例を示すフローチャートである。リスト生成部１９１は、例えば演算装置１００にカーネル９２０が与えられると図７の処理を行うなどのように、図７の処理を予め行っておく。
（ステップＳ１０１）
リスト生成部１９１は、要素リストのテンプレートを生成する。
ステップＳ１０１の後、ステップＳ１０２へ進む。
【００４５】
図８は、要素リストのテンプレートの例を示す図である。図８に示すテンプレートでは、１つの行がカーネル９２０の１つ要素の位置に対応している。
図８に示す領域Ａ２１は、図６の領域Ａ１１に対応しており、要素の位置が行と列との組み合わせで特定されている。図６の例では、第１行第０列のようにカーネル９２０の要素の値が全て「０」である要素の位置に対応する行が削除されている。これに対し、図８に示すテンプレートの段階では、全ての行と列との組み合わせが示されている。
図８に示す領域Ａ２２は、図６の領域Ａ１２に対応しており、カーネル９２０の識別番号と要素値との組み合わせを格納する領域である。
【００４６】
（ステップＳ１０２）
図７のステップＳ１０１の後、リスト生成部１９１は、カーネル９２０の要素の位置毎（すなわち、行毎かつ列毎）に処理を行うループＬ１１を開始する。ループＬ１１で処理対象となっている位置を対象位置と称する。
ステップＳ１０２の後、ステップＳ１０３へ進む。
（ステップＳ１０３）
リスト生成部１９１は、カーネル９２０毎に処理を行うループＬ１２を開始する。ループＬ１２で処理対象となっているカーネル９２０を対象カーネルと称する。
ステップＳ１０３の後、ステップＳ１０４へ進む。
【００４７】
（ステップＳ１０４）
リスト生成部１９１は、対象カーネルの対象位置の要素値が値「０」であるか否かを判定する。
要素値が値「０」であると判定した場合（ステップＳ１０４：ＹＥＳ）、処理はステップＳ１０６へ進む。一方、要素値が値「０」ではないと判定した場合（ステップＳ１０４：ＮＯ）、処理はステップＳ１０５へ進む。
【００４８】
（ステップＳ１０５）
リスト生成部１９１は、対象カーネルのカーネルＩＤと、対象カーネルの対象位置の要素値との組み合わせを、要素リストのテンプレートの対象位置に対応する行の領域Ａ２２に書き込む。該当する行に既にカーネルＩＤと要素値との組み合わせが書き込まれている場合、リスト生成部１９１は、既に書き込まれている組み合わせを消さずに、対象カーネルのカーネルＩＤと、対象カーネルの対象位置の要素値との組み合わせを追加する。
ステップＳ１０５の後、処理はステップＳ１０６へ進む。
【００４９】
（ステップＳ１０６）
リスト生成部１９１は、ループＬ１２の終端処理を行う。具体的には、リスト生成部１９１は、全てのカーネル９２０についてループＬ１２の処理を行ったか否かを判定する。
未処理のカーネル９２０が残っていると判定した場合は、リスト生成部１９１は、ステップＳ１０３へ戻り、引き続き残りのカーネル９２０についてループＬ１２の処理を行う。一方、全てのカーネル９２０についてループＬ１２の処理を行ったと判定した場合は、リスト生成部１９１は、ループＬ１２を終了してステップＳ１０７へ進む。
【００５０】
（ステップＳ１０７）
リスト生成部１９１は、ループＬ１１の終端処理を行う。具体的には、リスト生成部１９１は、カーネル９２０における全ての要素の位置についてループＬ１１の処理を行ったか否かを判定する。未処理の位置が残っていると判定した場合は、リスト生成部１９１は、ステップＳ１０２へ戻り、引き続き残りの位置についてループＬ１１の処理を行う。一方、全ての位置についてループＬ１１の処理を行ったと判定した場合は、リスト生成部１９１は、ループＬ１１を終了してステップＳ１０８へ進む。
【００５１】
（ステップＳ１０８）
リスト生成部１９１は、要素リストのテンプレートの行のうち、領域Ａ２２にカーネルＩＤと要素値との組み合わせが１つも示されていない行を削除する。領域Ａ２２にカーネルＩＤと要素値との組み合わせが１つも示されていない行が複数ある場合は、リスト生成部１９１は、全ての該当行を削除する。この処理の結果、要素リストが完成する。
ステップＳ１０８の後、図７の処理が終了する。
【００５２】
図９は、演算装置１００がインプット行列９１０の部分行列９１１とカーネル９２０との畳み込みを行う処理手順の例を示すフローチャートである。演算装置１００は、例えば、操作入力部１３０が畳み込みの実行を指示するユーザ操作を受けると、図９の処理を行う。
図９では、１つのインプット行列９１０に対する処理の例を示している。インプット行列９１０が複数ある場合は、演算装置１００は、図９のステップＳ２０２〜Ｓ２１３の処理を、インプット行列９１０の数だけ繰り返す。
【００５３】
（ステップＳ２０１）
メモリ管理部１９３は、アウトプット行列９３０をキャッシュメモリ部１８１に格納する。具体的には、メモリ管理部１９３は、キャッシュメモリ部１８１にアウトプット行列９３０の個数分の領域を確保し、各アウトプット行列９３０の各要素の値を値「０」に初期設定する。
ステップＳ２０１の後、処理はステップＳ２０２へ進む。
【００５４】
（ステップＳ２０２）
制御部１９０は、図３を参照して説明したように部分行列９１１毎に処理を行うループＬ２１を開始する。ループＬ２１で処理対象となっている部分行列９１１を対象部分行列と称する。
ステップＳ２０２の後、処理はステップＳ２０３へ進む。
【００５５】
（ステップＳ２０３）
演算実行部１９２は、インプット行列９１０における対象部分行列の位置を算出する。例えば、演算実行部１９２は、部分行列９１１の最左最上の要素（第０行第０列の要素）のインプット行列９１０における位置を算出する。
ステップＳ２０３の後、処理はステップＳ２０４へ進む。
【００５６】
（ステップＳ２０４）
制御部１９０は、対象部分行列の要素の位置毎に処理を行うループＬ２２を開始する。ループＬ２２で処理対象となっている位置を対象位置と称する。
ステップＳ２０４の後、処理はステップＳ２０５へ進む。
（ステップＳ２０５）
演算実行部１９２は、要素リストの行のうち処理対象位置に対応する行に、カーネルＩＤと要素値との組み合わせが示されているか否かを判定する。
カーネルＩＤと要素値との組み合わせが示されていると判定した場合（ステップＳ２０５：ＹＥＳ）、処理はステップＳ２０６へ進む。一方、カーネルＩＤと要素値との組み合わせが示されていないと判定した場合（ステップＳ２０５：ＮＯ）、処理はステップＳ２１２へ進む。
【００５７】
（ステップＳ２０６）
メモリ管理部１９３は、インプット行列９１０の部分行列９１１の処理対象位置の要素値をロードする。
ステップＳ２０６の後、処理はステップＳ２０７へ進む。
（ステップＳ２０７）
演算実行部１９２は、ステップＳ２０６で得られた要素値と、要素リストの該当行に示されているカーネル９２０の要素値との積を算出する。
要素リストの該当行にカーネルＩＤと要素値との組み合わせが複数示されている場合、演算実行部１９２は、未だステップＳ２０７の処理を行っていない組み合わせを１つ選択する。そして、演算実行部１９２は、選択した組み合わせに示される要素値を用いてステップＳ２０７の処理を行う。
【００５８】
（ステップＳ２０８）
演算実行部１９２は、ステップＳ２０７で得られた積をアウトプット行列９３０の要素値に加算する。
具体的には、演算実行部１９２は、ステップＳ２０３で算出したインプット行列９１０における部分行列９１１の位置に基づいて、この位置に対応するアウトプット行列９３０の要素の位置を算出する。メモリ管理部１９３は、キャッシュメモリ部１８１にアクセスして、ステップＳ２０７で要素リストから選択されたカーネルＩＤにて識別されるアウトプット行列９３０の要素の値のうち、演算実行部１９２が算出した位置の要素値を読み出す。演算実行部１９２は、メモリ管理部１９３が読み出した要素値に、ステップＳ２０７で得られた積を加算する。メモリ管理部１９３は、演算実行部１９２が算出した和を、値を読み出した要素に上書きする。
ステップＳ２０８の後、処理はステップＳ２０９へ進む。
【００５９】
（ステップＳ２０９）
演算実行部１９２は、要素リストの行のうち処理対象位置に対応する行に、未処理のカーネルＩＤと要素値との組み合わせが残っているか否かを判定する。
未処理の組み合わせが残っていると判定した場合（ステップＳ２０９：ＹＥＳ）、演算実行部１９２は、ステップＳ２１０へ進む。一方、未処理の組み合わせが残っていないと判定した場合（ステップＳ２０９：ＮＯ）、演算実行部１９２は、ステップＳ２１２へ進む。
【００６０】
（ステップＳ２１０）
演算実行部１９２は、ステップＳ２０９で未処理と判定した組み合わせの要素値と、要素リストの該当行に示されているカーネル９２０の要素値との積を算出する。
ステップＳ２０９で未処理と判定した組み合わせが複数ある場合、演算実行部１９２は、いずれか１つの組み合わせを選択する。そして、演算実行部１９２は、選択した組み合わせに示される要素値を用いてステップＳ２１０の処理を行う。
ステップＳ２１０の後、処理はステップＳ２１１へ進む。
【００６１】
（ステップＳ２１１）
演算実行部１９２は、ステップＳ２１０で得られた積をアウトプット行列９３０の要素値に加算する。
具体的な処理については、ステップＳ２０８で説明した具体的処理について「ステップＳ２０７」の記載を「ステップＳ２１０」に読み替える。
ステップＳ２１１の後、処理はステップＳ２０９へ戻る。
【００６２】
（ステップＳ２１２）
制御部１９０は、ループＬ２２の終端処理を行う。具体的には、制御部１９０は、カーネル９２０の要素の全ての位置についてループＬ２２の処理を行ったか否かを判定する。未処理の位置が残っていると判定した場合は、ステップＳ２０４へ戻り、引き続き残りの位置についてループＬ２２の処理を行う。一方、全ての位置についてループＬ２２の処理を行ったと判定した場合は、制御部１９０は、ループＬ２２を終了してステップＳ２１３へ進む。
【００６３】
（ステップＳ２１３）
制御部１９０は、ループＬ２１の終端処理を行う。具体的には、制御部１９０は、ループＬ２１で処理対象となる全ての部分行列９１１についてループＬ２１の処理を行ったか否かを判定する。未処理の部分行列９１１が残っていると判定した場合は、制御部１９０は、ステップＳ２０２へ戻り、引き続き残りの部分行列９１１についてループＬ２１の処理を行う。一方、全ての部分行列９１１についてループＬ２１の処理を行ったと判定した場合は、制御部１９０は、ループＬ２１を終了してステップＳ２１４へ進む。
【００６４】
（ステップＳ２１４）
メモリ管理部１９３は、アウトプット行列９３０をキャッシュメモリ部１８１から主記憶部１８２へ移動させる（スワップアウトする）。あるいはメモリ管理部１９３が、ステップＳ２１４の段階では特に処理を行わず、キャッシュメモリ部１８１の記憶容量が不足した段階でアウトプット行列９３０をキャッシュメモリ部１８１から主記憶部１８２へ移動させるようにしてもよい。
ステップＳ２１４の後、図９の処理が終了する。
【００６５】
以上のように、リスト生成部１９１は、行数及び列数が等しい複数のカーネル９２０の要素の位置毎に要素値を示す要素リストを生成する。
演算実行部１９２は、インプット行列９１０のうちカーネル９２０と同じ行数及び列数の部分行列９１１の要素値と、要素リストに示される要素値との畳み込みを行う。
演算実行部１９２が、複数のカーネル９２０の要素の位置毎に要素値を示す要素リストを用いて畳み込みを行うことで、部分行列９１１の要素と複数のカーネル９２０それぞれの要素との乗算を行うことができる。これにより、部分行列９１１の要素値の１回のロードによって複数のカーネル９２０の要素との乗算を行うことができ、部分行列９１１の要素値のダウンロード回数を低減させることができる。
【００６６】
また、リスト生成部１９１は、カーネル９２０の要素の位置毎に、要素値が値「０」以外の要素を示す要素リストを生成する。
演算実行部１９２が、複数のカーネル９２０の要素の位置毎に、要素値が０以外の要素を示す要素リストを用いる。これにより、カーネル９２０の要素値が値「０」の場合に部分行列９１１の要素とカーネル９２０の要素との乗算、及び、乗算の結果をアウトプット行列９３０に反映させるためのアクセスを抑制することができる。この点で、演算回数及びメモリアクセスの回数を低減させることができる。
特に、演算装置１００では計算回数だけでなくメモリアクセス回数も低減させることができる点で、畳み込みの演算に要する時間をより低減させることができる。
【００６７】
図１０は、畳み込みに要する計算時間とメモリアクセス時間の例を示すグラフである。図１０の縦軸は時間を示す。縦軸の上の方は長い時間を示し、下の方は短い時間を示す。
図１０では、例えば、１コアのベクトル計算機等で、計算時間とメモリアクセス時間との釣り合いが取れ、共に時間Ｔ１１である場合と、計算時間及びメモリアクセス時間のいずれも短縮されている場合との例が示されている。
【００６８】
例えば、計算時間、メモリアクセス時間共に時間Ｔ１１の状態から計算回数を削減して計算時間のみを短縮した場合、メモリアクセス時間が時間Ｔ１１のままである点で、時間短縮効果は限定的である。
これに対し、図１０の例のように、計算時間が時間Ｔ１２に短縮され、メモリアクセス時間が時間Ｔ１３に短縮されている場合、計算時間、メモリアクセス時間共に短縮する。これにより、より大きな時間短縮効果が見込まれる。
【００６９】
また、メモリ管理部１９３は、要素リストを参照して、インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値に「０」以外の値が含まれている要素をロードする。一方、メモリ管理部１９３は、インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値が全て「０」の要素のロードを抑制する。
具体的には、演算実行部１９２が、インプット行列９１０における部分行列９１１の位置、及び、要素リストの行毎に行及び列で示される位置に基づいて、インプット行列９１０の要素のうちロード対象の要素を特定する。メモリ管理部１９３は、演算実行部１９２が特定した要素の値をロードする。上記のように要素リストには、値が「０」以外の要素が１つ以上ある位置のみが記載されている。このため、メモリ管理部１９３は、インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値が全て「０」の要素のロードを抑制する。
インプット行列９１０の要素のうち当該要素の演算の相手となる要素の値が全て「０」の要素のロードを抑制する点で、演算装置１００によれば、メモリアクセスの回数を低減させることができる。
【００７０】
また、記憶部１８０は複数階層にしたがって構成されている。演算装置１００のメモリ管理部１９３は、少なくとも１つの部分行列９１１に対する演算を開始してから終了するまで、アウトプット行列９３０を、記憶部１８０の記憶階層のうち主記憶部１８２よりも高速の階層であるキャッシュメモリ部１８１に保持する。
これにより、メモリ管理部１９３は、演算実行部１９２による演算結果をアウトプット行列９３０に反映させる際のメモリアクセス時間を短くすることができる。
【００７１】
演算装置１００が、複数の部分行列９１１の各々とカーネル９２０との畳み込みを並列実行するなど、インプット行列９１０からの要素値の１回のロードで複数の部分行列９１１に対する処理を行うようにしてもよい。この点について、図１１を参照して説明する。
図１１は、演算装置１００が、インプット行列９１０からの要素値の１回のロードで複数の部分行列９１１に対する処理を行う場合の、複数の部分行列９１１の配置例を示す図である。図１１では、３つの部分行列９１１が示されており、符号９１１ａ、９１１ｂ、９１１ｃを付すことでこれらが区別されている。図の左から１列ずつずれて、部分行列９１１ａ、９１１ｂ、９１１ｃの順で配置されている。
【００７２】
部分行列９１１ａの最右列の各要素は、これら３つの部分行列９１１のいずれにも含まれている。これらの要素は、部分行列９１１ｂでは真ん中の列に位置し、部分行列９１１ｃでは最左列に位置している。
メモリ管理部１９３が、このように複数の部分行列９１１に共通の要素の値をロードすると、演算実行部１９２は、ロードされた値を用いてこれら複数の部分行列９１１の各々についての計算を行う。
【００７３】
例えば、メモリ管理部１９３が、部分行列９１１ａの第０行第２列（最上行最右列）の要素値をロードした場合、演算実行部１９２は、ロードした要素値と、カーネル９２０の各々の第０行第２列の要素値との乗算を行う。演算実行部１９２は、得られた積をアウトプット行列９３０の該当する要素の値に加算する。
メモリ管理部１９３がロードした要素値は、部分行列９１１ｂでは第０行第１列（最上行真ん中の列）の要素値に該当する。そこで、演算実行部１９２は、この要素値と、カーネル９２０の各々の第０行第１列の要素値との乗算を行い、得られた積をアウトプット行列９３０の該当する要素の値に加算する。
メモリ管理部１９３がロードした要素値は、部分行列９１１ｃでは第０行第０列（最上行最左列）の要素値に該当する。そこで、演算実行部１９２は、この要素値と、カーネル９２０の各々の第０行第０列の要素値との乗算を行い、得られた積をアウトプット行列９３０の該当する要素の値に加算する。
【００７４】
以上のように、演算実行部１９２は、インプット行列９１０の要素のうち複数の部分行列に共通する要素の値がロードされると、ロードされた値を用いて複数の部分行列９１１の各々に対する演算を行う。
これにより、演算装置１００では、メモリアクセス回数を低減させることができる。
【００７５】
次に、図１２を参照して、演算装置１００を構成するためのハードウェア構成の例について説明する。
図１２は、実施形態に係るコンピュータの構成例を示す概略ブロック図である。図１２に示すコンピュータ５０は、ＣＰＵ５１と、通信装置５２と、表示装置５３と、入力装置５４と、主記憶装置５５と、キャッシュメモリ装置５６と、を備える。通信装置５２は、他の装置と通信を行う。表示装置５３は、各種画像を表示する。入力装置５４は、ユーザ操作を受ける。主記憶装置５５は、各種情報を記憶する。キャッシュメモリ装置５６は、ＣＰＵ等が主記憶装置５５へアクセスするメモリアクセス時間を低減させるために設けられた主記憶装置５５よりも高速の記憶装置であり、ＣＰＵ等での使用が予想される情報を一時的に記憶する。ＣＰＵ５１は、主記憶装置５５及びキャッシュメモリ装置５６のうち何れか一方又は両方からプログラムを読み出して実行することで、コンピュータ５０の各部を制御して各種処理を実行する。
【００７６】
主記憶部１８２は、主記憶装置５５に実装されている。キャッシュメモリ部１８１は、キャッシュメモリ装置５６に実装されている。制御部１９０の動作は、プログラムの形式で主記憶装置５５及びキャッシュメモリ装置５６のうち何れか一方又は両方に記憶されている。ＣＰＵ５１は、プログラムを主記憶装置５５及びキャッシュメモリ装置５６のうち何れか一方又は両方から読み出し、このプログラムに従って制御部１９０の処理を実行する。通信部１１０は、通信装置５２に実装されている。表示部１２０は、表示装置５３に実装されている。操作入力部１３０、入力装置５４に実装されている。
【００７７】
次に、図１３及び図１４を参照して本発明の最小構成について説明する。
図１３は、本発明に係る演算装置の最小構成の第一例を示す図である。図１３に示す演算装置１０は、リスト生成部１１と、演算実行部１２とを備える。
かかる構成にて、リスト生成部１１は、行数及び列数が等しい複数の演算用行列が有する要素（第１の要素）の演算用行列における位置毎に、要素値を示すリストを生成する。演算実行部１２は、演算対象行列のうち演算用行列と同じ行数及び列数の部分行列が有する要素（第２の要素）の要素値と、リストに示される要素（第１の要素）の要素値とに基づく演算を行う。
【００７８】
演算実行部１２が、複数の演算用行列の要素の位置毎に要素値を示すリストを用いて演算を行うことで、演算対象行列の部分行列の要素と複数の演算用行列それぞれの要素との乗算を行うことができる。これにより、演算装置１０では、部分行列の要素値の１回のロードで複数の演算用行列の要素との演算を行うことができ、部分行列の要素値のダウンロード回数を低減させることができる。
【００７９】
図１４は、本発明に係る演算装置の最小構成の第二例を示す図である。図１４に示す演算装置２０は、リスト生成部２１と、演算実行部２２とを備える。
かかる構成にて、リスト生成部２１は、行数及び列数が等しい複数の演算用行列が有する要素（第１の要素）の演算用行列における位置毎に、要素値が値「０」以外である要素の要素値を示すリストを生成する。
演算実行部２２は、演算対象行列のうち演算用行列と同じ行数及び列数の部分行列が有する要素（第２の要素）の要素値と、リストに示される要素とに基づく演算を行う。
【００８０】
演算実行部２２が、複数の演算用行列における要素の位置毎に、要素値が値「０」以外である要素の要素値を示すリストを用いて演算を行う。これにより、演算用行列の要素値が「０」の場合に演算対象行列の部分行列の要素と演算用行列の要素との乗算、及び、乗算の結果を記憶領域のデータに反映させるためのアクセスを抑制することができる。この点で、演算回数及びメモリアクセスの回数を低減させることができる。
【００８１】
なお、制御部１９０の全部または一部を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより各部の処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【００８２】
以上、この発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【００８３】
この出願は、２０１７年６月２２日に日本出願された特願２０１７−１２２４８１号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【産業上の利用可能性】
【００８４】
この発明によれば、二次元畳み込み行列の演算などの行列演算におけるメモリアクセス回数を低減させることができる。
【符号の説明】
【００８５】
１０、２０、１００  演算装置
１１、２１、１９１  リスト生成部
１２、２２、１９２  演算実行部
１１０  通信部
１２０  表示部
１３０  操作入力部
１８０  記憶部
１８１  キャッシュメモリ部
１８２  主記憶部
１９０  制御部
１９３  メモリ管理部
【図１】
2018235357.tif 000004
【図２】
2018235357.tif 000005
【図３】
2018235357.tif 000006
【図４】
2018235357.tif 000007
【図５】
2018235357.tif 000008
【図６】
2018235357.tif 000009
【図７】
2018235357.tif 000010
【図８】
2018235357.tif 000011
【図９】
2018235357.tif 000012
【図１０】
2018235357.tif 000013
【図１１】
2018235357.tif 000014
【図１２】
2018235357.tif 000015
【図１３】
2018235357.tif 000016
【図１４】
2018235357.tif 000017
【国際調査報告】
2018235357.tif 000018
2018235357.tif 000019