(57)【特許請求の範囲】
【請求項１】
行列積の演算を行う積和演算回路であって、
第１の行列の要素を行方向に所定数ごとにグループにした行ベクトルと、第２の行列の要素を列方向に前記所定数ごとにグループにした列ベクトルとの乗算を並列に実行する前記所定数の乗算器と、
前記所定数設けられた前記乗算器の次段に、前記乗算器の乗算結果を取得して加算をする乗算器用加算器と、
前記乗算器用加算器の次段に、前記乗算器用加算器の加算結果を取得して加算をする加算器用加算器と、
最終段の前記加算器用加算器の所定のレイテンシを決められたクロックを用いてカウントするレイテンシカウンタと、
前記レイテンシカウンタが所定の累算回数までカウントすると前記行列積の演算結果が取得可能状態であることを示す信号を出力する可変カウンタと、
前記可変カウンタのカウント値の設定をする可変カウンタ設定部と、
を備えることを特徴とする積和演算回路。
【請求項２】
前記乗算器への前記行ベクトルの入力は、
前記加算器用加算器の最終段のレイテンシを示すクロック数に基づいて前記第１の行列を所定行ごとにブロック化して、前記ブロックを構成する最初の行ベクトルから列方向に順に入力し、前記所定行に達したときに前記ブロックの先頭行の次の行ベクトルを入力し、
前記乗算器への前記列ベクトルの入力は、
前記第２の行列の列ごとに最初の列ベクトルから列方向に順に入力し、該列の最後に達したときに次の列の先頭の列ベクトルを入力することを特徴とする請求項１に記載の積和演算回路。
【請求項３】
前記カウンタ設定部は、
前記行列のサイズと前記乗算器の数に基づいて前記累算回数を算出する除算器を備えることを特徴とする請求項２に記載の積和演算回路。
【請求項４】
前記除算器は、
前記行列のサイズと前記乗算器の数に基づいて剰余演算をし、前記剰余演算結果があるときは前記累算回数に１を加算することを特徴とする請求項３に記載の積和演算回路。
【請求項５】
前記乗算器から前記最終段の加算器用加算器までのレイテンシから前記除算器のレイテンシの差分だけカウンタ値の設定時間を遅延させるシフトレジスタを備えることを特徴とする請求項３または４に記載の積和演算回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数可変行列に対応した積和演算の技術に関する。
【背景技術】
【０００２】
近年、ハードウェアにより可変行列に対応した積和演算回路を実現する場合に、回路規模を縮小するとともに演算時間の短縮が求められている。
例えば、演算時間を短縮するために、行列とベクトルの積を複数の乗算器と加算きで求める積和演算回路があるが、行列が大きくなると複数の乗算器と加算器を使用するため回路規模が縮小できない。
【０００３】
また、３×３の空間積和を求める回路において、最初の３個の部分積和を求め、結果をシフトレジスタに入力する。その後、別の積和を２５５回計算した後、次の３個の積和を計算してシフトレジスタ内の結果と加算して空間積和を出力するような提案がある。
【０００４】
しかし、この方法では行の大きさに対応したシフトレジスタを用意する必要がある。また、数値シミュレーションで用いられる要素数の多い行列の積和演算では、シフトレジスタの段数で対応するのは現実的でない。
【０００５】
また、特許文献１、特許文献２のような提案がされている。
【特許文献１】特開平０２−０９０３５７号公報
【特許文献２】特開平１１−３１２１４８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
固定サイズの正方行列だけではなく、異なる行列サイズの積和演算を連続実行でき、さらに回路の利用効率および演算性能を向上させる積和演算回路を提供することを目的とする。
【課題を解決するための手段】
【０００７】
第１の態様のひとつである行列積の演算を行う積和演算回路は、乗算器、乗算器用加算器、加算器用加算器、レイテンシカウンタ、可変カウンタ、可変カウンタ設定部を備えている。乗算器は、第１の行列の要素を行方向に所定数ごとにグループにした行ベクトルと、第２の行列の要素を列方向に前記所定数ごとにグループにした列ベクトルとの積算を並列に実行する。乗算器用加算器は、前記所定数のと、前記所定の要素数と同じ数量設けられた前記乗算器の次段に、前記乗算器の乗算結果を取得して加算をする。加算器用加算器は、前記乗算器用加算器の次段に、前記乗算器用加算器の加算結果を取得して加算をする。レイテンシカウンタは、最終段の前記加算器用加算器のレイテンシを計測する。可変カウンタは、前記レイテンシカウンタが前記最終段の加算器用加算器のレイテンシを計測するごとにカウントして、所定の累算回数までカウントすると前記行列積の演算結果が取得可能状態であることを示す信号を出力する。可変カウンタ設定部は、前記可変カウンタのカウント値の設定をする。
【０００８】
また、前記乗算器への前記行ベクトルの入力は、前記加算器用加算器の最終段のレイテンシを示すクロック数に基づいて前記第１の行列を所定行ごとにブロック化して、前記ブロックを構成する最初の行ベクトルから列方向に順に入力し、前記所定行に達したときに前記ブロックの先頭行の次の行ベクトルを入力する。前記乗算器への前記列ベクトルの入力は、前記第２の行列の列ごとに最初の列ベクトルから列方向に順に入力し、該列の最後
に達したときに次の列の先頭の列ベクトルを入力する。
【０００９】
前記カウンタ設定部は、前記行列のサイズと前記乗算器の数に基づいて前記累算回数を算出する除算器を備える。前記除算器は、前記行列のサイズと前記乗算器の数に基づいて剰余演算をし、前記剰余演算結果があるときは前記累算回数に１を加算する。前記乗算器から前記最終段の加算器用加算器までのレイテンシから前記除算器のレイテンシの差分だけカウンタ値の設定時間を遅延させるシフトレジスタを備える。
【００１０】
上記構成により、行列サイズを入力に基づいて積和演算の累算回数の設定と、その設定するタイミングを調整することにより、異なるサイズの行列積和演算の連続処理を実現し、演算時間を短縮する。
【００１１】
また、可変サイズの行列に対する積和演算を可能とすることで、演算の適用範囲を拡大し、なおかつ、複数の異なるサイズの行列積和演算に対して、前の演算終了を待つことなくデータを連続投入可能なパイプライン化を実現することにより演算時間の短縮を実現する。
【発明の効果】
【００１２】
固定サイズの正方行列だけではなく、異なる行列サイズの積和演算を連続実行でき、さらに回路の利用効率および演算性能を向上させることができる。
【発明を実施するための最良の形態】
【００１３】
以下図面に基づいて、本発明の実施形態について詳細を説明する。
（実施例１）
通常の行列演算を実行する場合、例えば、行列Ａ（１３２×１３２）と行列Ｂ（１３２×１３２）を積和演算するには式１に示す計算をすることにより行列Ｃ（１３２×１３２）の１要素（例えばＣ０，０）を算出し同様に他の要素も算出する。
【数１】
0005262248.tif 000002
【００１４】
ところが、上記１３２×１３２のようにサイズが大きい多入力の積和演算をＦＰＧＡ（Field Programmable Gate Array）やＣＰＬＤ（Complex Programmable Logic Device）のようなプログラマブルデバイスにより実現する場合、積和演算を実行するためには並列に１３２個の乗算器を設けなければならない。しかし、単に並列化をすると演算器の数が多くなり回路規模が膨大なものとなるため、実際にハードウェアとしてインプリメントするには複数のプログラマブルデバイスが必要となってしまう。
【００１５】
そこで、回路規模を縮小して１３２×１３２の演算を行うためには、演算器の数を減らしてインプリメントしなければならない。ところが、単純に式２に基づいて回路規模を削減した場合、積和演算を実行する際、最終段の加算器部分のレイテンシの存在により連続して演算が実行できない。また、並列数を１３２個から４個に減らすことによる演算性能が低下するだけでなく、連続演算ができない分さらに性能が落ちてしまう。
【数２】
0005262248.tif 000003
【００１６】
そこで、図１に示すように並列数削減比を用いる積和演算回路１により積和演算性能を維持する。図１に示す図は、１３２並列の乗算器を４並列に削減した場合の積和演算回路
１を示し、１３２並列から４並列にしても積和演算性能を維持できる。
【００１７】
積和演算回路１は乗算器２、３、４、５（ｍｕｌ）、加算器６、７、８、１０（ａｄｄ）、１２進カウンタ９（レイテンシカウンタ）、３３進カウンタ１３、セレクタ１１、論理積回路１２を備えている。そして、図１に示す積和演算回路は１３２×１３２の行列演算をする回路である。
【００１８】
本例では、積和演算回路１の最終段の加算器８のレイテンシを考慮し、連続演算を可能にするため、行列Ａの１２行を１ブロックとして演算を行う。また、行列Ａ、行列Ｂ共に４要素ごとに分割し、４要素ごとに演算を行う。
【００１９】
図２を用いて分割について説明する。
図２の行列Ａの場合は行を４要素ごとの行ベクトルにする。例えば行０では「（０，０）（０，１）（０，２）（０，３）」「（０，４）（０，５）（０，６）（０，７）」・・・「（０，１２４）（０，１２５）（０，１２６）（０，１２７）」「（０，１２８）（０，１２９）（０，１３０）（０，１３１）」のようにする。同様に行ｉ＝０以外の行１〜１３１についても行ベクトルにする。また、行列Ｂの場合は列を４要素ごとに列ベクトルにする。例えば、図２の列ｊ＝０では「（０，０）（１，０）（２，０）（３，０）」「（４，０）（５，０）（６，０）（７，０）」・・・「（１２４，０）（１２５，０）（１２６，０）（１２７，０）」「（１２８，０）（１２９，０）（１３０，０）（１３１，０）」にする。同様に列ｊ＝０以外の列１〜１３１についても列ベクトルにする。
【００２０】
そして、図２に示す矢印の示す順に行列Ａと行列Ｂの要素データを取得して演算を実行する。最初は、行列Ａの「（０，０）（０，１）（０，２）（０，３）」と行列Ｂの「（０，０）（１，０）（２，０）（３，０）」の積和演算を行う。次に、行列Ａの「（１，０）（１，１）（１，２）（１，３）」と行列Ｂの「（０，０）（１，０）（２，０）（３，０）」の積和演算を行う。
【００２１】
行列Ａがブロック０の最終行１１まできたら、つまり「（１１，０）（１１，１）（１１，２）（１１，３）」まできたら、次は行列Ａの「（０，４）（０，５）（０，６）（０，７）」と行列Ｂの続きの行ベクトルの演算を行いブロック０の演算が終了するまで演算をする。演算が終了すると行列Ａのブロック単位で演算結果が確定するため、行列Ａの１ブロックの終了時、行列Ｃの１２要素が列方向に確定する。次にブロック０と同様にブロック１の演算をし、ブロック１０まで演算をする。また、演算結果は列順で確定するため、結果順にメモリなどへ転送して記録する。
【００２２】
演算器について説明する。
図３は、演算器である乗算器２〜５、加算器６〜８、１０の機能を示す図である。基本的に、各演算器は３入力、２出力のポートを備えている。入力ポートは、データを入力する２ポートと、演算を有効にするイネーブル信号を取得する１ポートの計３ポートある。出力ポートは、データを出力するポートと、次段に接続される演算を有効にするイネーブル信号を出力するための１ポートの計２ポートある。また、演算器内に示されている数値１はスループットを示し、数値２はレイテンシを示している。
【００２３】
乗算器２は、行列Ａの行ベクトルごとの最初の要素と行列Ｂの列ベクトルごとの最初の要素を取得する２つの入力ポートＡ０、Ｂ０と、乗算器の演算を行うかどうかを決定するイネーブル信号を取得するポートと、次段に接続される加算器７への出力信号（ｍｄａｔａ０）を出力する出力ポートと加算器７の演算を有効にすることを通知する信号（ｍｒｄｙ０）を出力するポートを備えている。乗算器２は、イネーブル信号が有効を示しているときに、入力ポートＡ０、Ｂ０に入力された要素を乗算する。
【００２４】
なお、例えば行列Ａが「（０，０）（０，１）（０，２）（０，３）」であれば（０，０）が最初の要素（１番目の要素）であり、（０，１）が２番目の要素、（０，２）が３番目の要素、（０，３）が４番目の要素である。つまり、行ベクトルごとに最初の要素〜４番目の要素を有している。
【００２５】
また、例えば行列Ｂが「（０，０）（１，０）（２，０）（３，０）」であれば、（０，０）が最初の要素（１番目の要素）であり、（１，０）が２番目の要素、（２，０）が３番目の要素、（３，０）が４番目の要素である。つまり、列ベクトルごとに最初の要素〜４番目の要素を有している。
【００２６】
乗算器３は、行列Ａの行ベクトルごとの２番目の要素と、行列Ｂの列ベクトルごとの２番目の要素を取得する２つの入力ポートＡ１、Ｂ１と、乗算器の演算を行うかどうかを決定するイネーブル信号を取得するポートと、次段に接続される加算器７への出力信号（ｍｄａｔａ１）を出力する出力ポートを備えている。乗算器３は、イネーブル信号が有効を示しているときに、入力ポートＡ１、Ｂ１に入力された要素を乗算する。
【００２７】
乗算器４は、行列Ａの行ベクトルごとの３番目の要素と、行列Ｂ列のベクトルごとの３番目の要素を取得する２つの入力ポートＡ２、Ｂ２と、乗算器の演算を行うかどうかを決定するイネーブル信号を取得するポートと、次段に接続される加算器７への出力信号（ｍｄａｔａ２）を出力する出力ポートと加算器７の演算を有効にすることを通知する信号（ｍｒｄｙ２）を出力するポートを備えている。乗算器４は、イネーブル信号が有効を示しているときに、入力ポートＡ２、Ｂ２に入力された要素を乗算する。
【００２８】
乗算器５は、行列Ａの行ベクトルごとの４番目の要素と、行列Ｂのベクトルごとの４番目の要素を取得する２つの入力ポートＡ３、Ｂ３と、乗算器の演算を行うかどうかを決定するイネーブル信号を取得するポートと、次段に接続される加算器７への出力信号（ｍｄａｔａ３）を出力する出力ポートを備えている。乗算器５は、イネーブル信号が有効を示しているときに、入力ポートＡ３、Ｂ３に入力された要素を乗算する。
【００２９】
本例では乗算器２、３、４、５は６４ビット浮動小数点の乗算器を用いているが、６４ビット浮動小数点の乗算器に限定するものではなく乗算ができれば固定小数点型であってもよい。
【００３０】
加算器６（乗算器用加算器）は、乗算器２と乗算器３の出力ポートと接続される入力ポートを備え、乗算結果であるｍｄａｔａ０、ｍｄａｔａ１を取得する。また、乗算器２から出力されるｍｒｄｙ０を取得する入力ポートを備えている。加算器６は、ｍｒｄｙ０が有効であるときにｍｄａｔａ０、ｍｄａｔａ１を加算してａｄａｔａ０を出力する。また、次段の加算器８にイネーブル信号ａｒｄｙ０を出力する。
【００３１】
加算器７（乗算器用加算器）は、乗算器４と乗算器５の出力ポートと接続される入力ポートを備え、乗算結果であるｍｄａｔａ２、ｍｄａｔａ３を取得する。また、乗算器４から出力されるｍｒｄｙ２を取得する入力ポートを備えている。加算器７は、ｍｒｄｙ２が有効であるときにｍｄａｔａ２、ｍｄａｔａ３を加算してａｄａｔａ１を出力する。
【００３２】
加算器８（加算器用加算器：本例では最終段の加算器用加算器）は、加算器６と加算器７の出力ポートと接続される入力ポートを備え、加算結果であるａｄａｔａ０、ａｄａｔａ１を取得する。また、加算器６から出力されるａｒｄｙ０を取得する入力ポートを備えている。加算器８は、次段に接続される加算器１０に加算結果を出力するａｄａｔａ２を出力する出力ポートを備えている。また、加算器８は、次段に接続される加算器１０のｖ
ａｌｉｄポートにイネーブル信号ａｒｄｙ２を出力する。
【００３３】
加算器１０は、ａｄａｔａ２を取得するＡポートと、ａｒｄｙ２を取得するｖａｌｉｄポートとセレクタ１１の出力信号を取得するＢポートを備えている。また、加算器１０は、加算演算結果ａｄａｔａ３（ＲＥＳＵＬＴ）を出力する出力ポートと、次段に接続されている論理積回路１２にイネーブル信号ａｒｄｙ３を出力する。加算器１０は、ａｒｄｙ２が有効のときにａｄａｔａ２とａｄａｔａ３の加算をする。
【００３４】
加算器６、７、８，１０は、６４ビット浮動小数点の加算器を用いているが、６４ビット浮動小数点の加算器に限定するものではなく加算ができれば固定小数点型であってもよい。
【００３５】
本例では、乗算器２、３、４、５はレイテンシが９であり、加算器６、７、８、１０はレイテンシが１２である。
１２進カウンタ９（レイテンシカウンタ）は、加算器８の出力レイテンシを計測（カウント）するカウンタであり、加算器８の出力データイネーブル信号であるａｒｄｙ２をカウントし１２カウントすると、ｃａｒｒｙ信号であるｃｏｕｎｔ＿ｕｐを「１」にする。なお、本例では加算器８のレイテンシが１２であるので１２進カウンタを用いているが、レイテンシが異なる場合はレイテンシに合わせたカウンタにすることで対応できる。
【００３６】
３３進カウンタ１３は、１２進カウンタ９の出力であるｃｏｕｎｔ＿ｕｐ信号の「１」を取得してカウントするカウンタである。積和演算回路１では、１３２×１３２の行列積演算を行う例であるため、本来１３２入力の積和演算を行うには１３２個の乗算器を必要とするが４個の乗算器で実施するため１３２／４＝３３回入力してはじめて１３２入力の演算結果が得られる。また、所定の累算回数までカウントすると行列積の演算結果が取得可能状態であることを示す信号を出力する。つまり、３３進カウンタ１３は、３３進カウンタを使用し３３回に１回演算結果を選択出力するための信号(ｃｏｕｎｔ０)を出力している。
【００３７】
上記のように扱う行列サイズの要素数に応じてカウンタを変更することで、異なる行列サイズに対応できる。
セレクタ１１は、２入力から１つを選択するセレクタであり、加算器１０への入力データを選択するセレクタである。加算器１０のＢポートへは、例えばｃｏｕｎｔ０信号が「１」の場合は値「０」を選択し、それ以外の場合は加算器１０の演算結果であるフィードバック値ａｄａｔａ３を選択する。
【００３８】
論理積回路１２は、積和演算結果の出力タイミングを選択する。加算器１０の出力データが有効であることを示すＲＤＹ信号を生成する。
図４は、積和演算回路１において１組の行列演算を実行した場合の動作を示すタイムチャートである。また、３３進カウンタ１３のカウント値が「３０」から後の波形を示している。そして、図４のタイムチャートには縦軸に示された各信号の名称に対応した波形が示され、横軸には時間が示されている。
【００３９】
３３進カウンタ１３のカウント値が「３０」の期間では、行列Ａの最後の行ベクトルと行列Ｂの最後の列ベクトルの要素が入力される。図４では便宜上入力をＡ０、Ｂ０だけを示しているが実際にはＡ１〜Ａ３、Ｂ１〜Ｂ３にも要素データが入力される。Ａ０〜Ａ３、Ｂ０〜Ｂ３から入力されるデータは１クロック毎ただし、１２クロック単位で配列変換されたデータが入力される。
【００４０】
３３進カウンタ１３のカウント値が「３２」までカウントすると、３３進カウンタ１３
のカウント値が「０」に変化し、ｃｏｕｎｔ０が「０」から「１」に変化する。
３３進カウンタ１３のカウント値が「０」の期間では、ｃｏｕｎｔ０が「１」でａｒｄｙ３が「１」なので論理積回路１２の出力ＲＤＹ信号が「０」から「１」に変化する。そして、ＲＤＹ信号が「１」の間加算器１０の出力データａｄａｔａ３（ＲＥＳＵＬＴ：Ｒ０〜Ｒ１１）を取得する。このように、加算器１０の出力ａｄａｔａ３は３９６クロック毎に１２回、つまり、３３クロックに１回の割合で出力される。
【００４１】
（実施例２）
図５に示す回路は、実施例１に示した積和演算回路１を改良した積和演算回路５０である。積和演算回路５０は、図１に示した３３進カウンタ１３を可変カウンタ１４に変更した回路である。
【００４２】
実施例１では、積和演算回路には固定サイズの行列に対する積和演算しかできない。そこで、可変サイズの行列に対応するために積和演算の累算回数を設定するカウント信号Ｎを入力するポートを設ける。
【００４３】
（実施例３）
図６は、図５に示した積和演算回路５０において２組の異なるサイズの行列演算を連続して実行した場合のタイムチャートである。
【００４４】
可変カウンタ１４のカウント値が「３０」の期間では、行列Ａの最後の行ベクトルと行列Ｂの最後の列ベクトルの要素が入力される。図４と同様に便宜上入力をＡ０、Ｂ０だけを示しているが実際にはＡ１〜Ａ３、Ｂ１〜Ｂ３にも要素データが入力される。Ａ０〜Ａ３、Ｂ０〜Ｂ３から入力されるデータは１クロック毎ただし、１２クロック単位で配列変換されたデータが入力される。このとき、Ｎの値は「３３」が入力されている。
【００４５】
ところが、連続して積和演算を行う場合、例えばＮの値を「３３」から「１６」に変更してしまうと可変カウンタ１４のカウント値が変化してしまう。
その後、次の行列を演算するために次の要素が入力され、それと同時に、可変カウンタ１４が３３進カウンタから１６進カウンタに変更される。
【００４６】
その結果、カウント値「２」の間（３３進カウンタであればカウント値が「３０」）に論理積回路１２の出力ＲＤＹ信号が「０」から「１」に変化しないため、ＲＤＹ信号が「０」のまま変化せず加算器１０の出力データａｄａｔａ３（ＲＥＳＵＬＴ：Ｒ０〜Ｒ１１）を取得することができない。
【００４７】
つまり、カウンタを可変カウンタに変更した場合、一連の最終の行列積和演算が完了する前に、回路に別なサイズの行列積和演算の入力データを入れた場合に、即カウンタ値が変更されてしまうと、演算中の累算回数に狂いが生じ、正しい結果が得られない。
【００４８】
そこで、ダミーデータ（ｄｕｍｍｙ）を行列Ａ、Ｂに入れることが考えられる。しかし、要素としてダミーデータを設けて上記演算中の累算回数の狂いを回避するためには演算終了を確認するまでの待ちが必要となり、その結果、演算時間の短縮の妨げとなる。
【００４９】
図７は、ダミーデータとして何もデータを入力しない場合のタイムチャートである。このタイムチャートが示すように図１の積和演算回路１と同じ演算時間が必要になる。
（実施例４）
図８に示した積和演算回路９０は、図５に示した積和演算回路５０を改良して可変カウンタ設定部１７を備えた回路である。行列サイズの可変に対応のために、行列サイズ用の入力信号（ＭＴＲＸ＿ＳＺＩＺＥ）を入力するポートを、図５のＮを入力するポートに変
わって設ける。図９に示すように可変カウンタ設定部１７は除算器１５とシフトレジスタ１６を備え、行列サイズから積和演算結果の累算回数を算出し、その累算回数を可変カウンタ１４にセットする。
【００５０】
除算器１５は、累算回数ｎの算出はＭＴＲＸ＿ＳＩＺＥと乗算器数（図９においては４個）から式３により算出する。
ｎ＝ＭＴＲＸ＿ＳＩＺＥ÷４＋ｘ        （式３）
ここで、ｘ＝ｍｏｄ（ＭＴＲＸ＿ＳＩＺＥ，４）≠０ではｘを「１」にし、ｘ＝ｍｏｄ（ＭＴＲＸ＿ＳＩＺＥ，４）＝０ではｘを「０」にする。ｍｏｄは剰余演算を示している。上記演算結果である累算回数ｎを可変カウンタ１４にセットする。
【００５１】
シフトレジスタ１６は、パイプライン化に対応するために可変カウンタ１４にｎ値をセットするタイミングを、積和演算の出力信号と同期をとるように調整する。累算回数ｎを可変カウンタ１４にセットするタイミングを積和演算の出力信号と同期をとるためにシフトレジスタで調整する。乗算器２〜５から最終段の加算器８までのレイテンシから除算器１５のレイテンシの差分だけカウンタ値の設定時間を遅延させるシフトレジスタである。例えば、加算器８までのレイテンシが３３クロックで、除算器１５のレイテンシが１０クロックの場合はシフトレジスタで２３クロック遅延させる。
【００５２】
図９は、積和演算回路９０の動作を示すタイムチャートである。
可変カウンタ１４のカウンタ値が「３０」の期間に、ＭＴＲＩＸ＿ＳＩＺＥは「１３２」であり、ｎの値は「３３」である。
【００５３】
行列Ａの最後の行ベクトルと行列Ｂの最後の列ベクトルの要素のデータが入力される。図４と同様に便宜上入力をＡ０、Ｂ０だけを示しているが実際にはＡ１〜Ａ３、Ｂ１〜Ｂ３にも要素データが入力される。Ａ０〜Ａ３、Ｂ０〜Ｂ３から入力されるデータは１クロック毎ただし、１２クロック単位で配列変換されたデータが入力される。このとき、Ｎの値は「３３」が入力されている。
【００５４】
可変カウンタ１４のカウンタ値が「３１」の期間に、次の行列Ａと行列Ｂの４分割した要素が入力される。さらに、ＭＴＲＩＸ＿ＳＩＺＥは「１３２」から「６４」に変更され、式３に従ってｎ値が「１６」が算出される。
【００５５】
シフトレジスタ１６により遅延することにより、可変カウンタ１４のカウンタ値が「０」の期間に、ａｒｄｙ３とｃｏｕｎｔ０がともに「１」になるため、ＲＤＹ信号が「１」に変化して加算器１０の出力データａｄａｔａ３（ＲＥＳＵＬＴ：Ｒ０〜Ｒ１１）を取得することができる。また、連続して２組の異なるサイズの行列演算を連続して演算することができるようになる。
【００５６】
また、行列サイズを入力に基づいて積和演算の累算回数の設定と、その設定するタイミングを調整することにより、異なるサイズの行列積和演算の連続処理を実現し、演算時間を短縮する。
【００５７】
また、可変サイズの行列に対する積和演算を可能とすることで、演算の適用範囲を拡大し、なおかつ、複数の異なるサイズの行列積和演算に対して、前の演算終了を待つことなくデータを連続投入可能なパイプライン化を実現することにより演算時間の短縮を実現する。
また、本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【００５８】
以上実施例を含む実施形態に関し、更に以下の付記を開示する。
（付記１）
行列積の演算を行う積和演算回路であって、
第１の行列の要素を行方向に所定数ごとにグループにした行ベクトルと、第２の行列の要素を列方向に前記所定数ごとにグループにした列ベクトルとの積算を並列に実行する前記所定数の乗算器と、
前記所定の要素数と同じ数量設けられた前記乗算器の次段に、前記乗算器の乗算結果を取得して加算をする乗算器用加算器と、
前記乗算器用加算器の次段に、前記乗算器用加算器の加算結果を取得して加算をする加算器用加算器と、
最終段の前記加算器用加算器のレイテンシを計測するレイテンシカウンタと、
前記レイテンシカウンタが前記最終段の加算器用加算器のレイテンシを計測するごとにカウントして、所定の累算回数までカウントすると前記行列積の演算結果が取得可能状態であることを示す信号を出力する可変カウンタと、
前記可変カウンタのカウント値の設定をする可変カウンタ設定部と、
を備えることを特徴とする積和演算回路。
（付記２）
前記乗算器への前記行ベクトルの入力は、
前記加算器用加算器の最終段のレイテンシを示すクロック数に基づいて前記第１の行列を所定行ごとにブロック化して、前記ブロックを構成する最初の行ベクトルから列方向に順に入力し、前記所定行に達したときに前記ブロックの先頭行の次の行ベクトルを入力し、
前記乗算器への前記列ベクトルの入力は、
前記第２の行列の列ごとに最初の列ベクトルから列方向に順に入力し、該列の最後に達したときに次の列の先頭の列ベクトルを入力することを特徴とする付記１に記載の積和演算回路。
（付記３）
前記カウンタ設定部は、
前記行列のサイズと前記乗算器の数に基づいて前記累算回数を算出する除算器を備えることを特徴とする付記２に記載の積和演算回路。
（付記４）
前記除算器は、
前記行列のサイズと前記乗算器の数に基づいて剰余演算をし、前記剰余演算結果があるときは前記累算回数に１を加算することを特徴とする付記３に記載の積和演算回路。
（付記５）
前記乗算器から前記最終段の加算器用加算器までのレイテンシから前記除算器のレイテンシの差分だけカウンタ値の設定時間を遅延させるシフトレジスタを備えることを特徴とする付記３または４に記載の積和演算回路。
（付記６）
前記可変カウンタの出力信号により、前記最終段の加算器用加算器の出力結果と自身の出力結果を加算するフィードバック加算器を備えることを特徴とする付記４に記載の積和演算回路。
（付記７）
前記可変カウンタの出力信号が有効であるときは前記フィードバック加算器は前記最終段の加算器用加算器の出力結果を出力し、無効であるときは前記最終段の加算器用加算器の出力結果と前記フィードバック加算器の出力結果を加算することを特徴とする付記６に記載の積和演算回路。
（付記８）
前記フィードバック加算器の出力するイネーブル信号と前記可変カウンタの出力信号との論理積を演算することを特徴とする付記７に記載の積和演算回路。
【図面の簡単な説明】
【００５９】
【図１】実施例１に示す積和演算回路の構成を示す図である。
【図２】実施例１に示す積和演算回路の演算方法を示す図である。
【図３】演算器の機能を説明する図である。
【図４】実施例１に示す積和演算回路の動作を示すタイムチャートである。
【図５】実施例２に示す積和演算回路の構成を示す図である。
【図６】実施例２に示す積和演算回路の動作を示すタイムチャートである。
【図７】実施例２に示す積和演算回路にダミーデータを挿入時の動作を示すタイムチャートである。
【図８】実施例３に示す積和演算回路の構成を示す図である。
【図９】実施例３に示す積和演算回路の動作を示すタイムチャートである。
【符号の説明】
【００６０】
１、５０、９０      積和演算回路
２、３、４、５      乗算器
６、７、８、１０      加算器
９      １２進カウンタ（レイテンシカウンタ）
１１      セレクタ
１２      論理積回路
１３      ３３進カウンタ
１４      可変カウンタ
１５      除算器
１６      シフトレジスタ
１７      可変カウンタ設定部
【図１】
0005262248.tif 000004
【図２】
0005262248.tif 000005
【図３】
0005262248.tif 000006
【図４】
0005262248.tif 000007
【図５】
0005262248.tif 000008
【図６】
0005262248.tif 000009
【図７】
0005262248.tif 000010
【図８】
0005262248.tif 000011
【図９】
0005262248.tif 000012