積和演算回路、その設計装置、プログラム
【課題】行列の積和演算の技術に関し、回路の利用効率および演算性能を向上させることが可能な積和演算回路を提供することにある。
【解決手段】乗算器102〜107は、行列Aの行を分割した部分行ベクトルと行列Bの列を分割した部分列ベクトルとの乗算を並列に実行し、加算器108〜112は乗算結果を加算し、部分積和演算結果を出力する。12個の部分積和演算結果は、レイテンシ=12の加算器116に順次溜め込まれた後、その出力側から入力側にフィードバックされながら、次のタイミングにおける新たな12個の部分積和演算結果に順次加算される。上記レイテンシに対応する12進カウンタ113と上記分割の数に対応する22進カウンタ114のカウント動作に従って、加算器116にて累算された積和演算結果が、12×22=264クロック毎に12個ずつ出力される。
【解決手段】乗算器102〜107は、行列Aの行を分割した部分行ベクトルと行列Bの列を分割した部分列ベクトルとの乗算を並列に実行し、加算器108〜112は乗算結果を加算し、部分積和演算結果を出力する。12個の部分積和演算結果は、レイテンシ=12の加算器116に順次溜め込まれた後、その出力側から入力側にフィードバックされながら、次のタイミングにおける新たな12個の部分積和演算結果に順次加算される。上記レイテンシに対応する12進カウンタ113と上記分割の数に対応する22進カウンタ114のカウント動作に従って、加算器116にて累算された積和演算結果が、12×22=264クロック毎に12個ずつ出力される。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、行列の積和演算の技術に関する。
【背景技術】
【0002】
近年、ハードウェアにより行列の積和演算回路を実現する場合に、回路規模を縮小するとともに演算時間の短縮が求められている。
例えば、図12に示されるように、それぞれ132行×132列の行列AとBの積A×Bが算出される場合、通常の演算方法では、行列Bの列(j)が固定され、行列Aの行(i)がi=0〜131の順で演算され、行列Cの列(j)の解が算出される。
【0003】
次に、行列Bの列(j)が+1された後、行列Aの行(i)がi=0〜131の順で演算されることにより、行列Cの次の列(j)の解が算出される。
この演算方法からわかるように、行列A×Bの演算には、膨大な量の積和演算が必要となる。
【0004】
この演算時間を短縮するために、例えば下記特許文献1では、行列とベクトルの積を複数の乗算器と加算器で求める積和演算回路の技術が開示されている。
また、下記特許文献2では、3×3の空間積和を求める回路において、最初の3個の部分積和が算出されて結果がシフトレジスタに入力され、その後、別の積和が255回計算された後に次の3個の積和が計算され、シフトレジスタ内の結果と加算されて空間積和が出力される技術が開示されている。
【特許文献1】特開2003−58876号公報
【特許文献2】特公平7−38217号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
しかし、上記特許文献1に記載の従来技術では、複数の乗算器と加算器が使用されるため、行列が大きくなると回路規模が縮小できないという問題点を有している。
また、上記特許文献2に記載の従来技術では、行の大きさに対応したシフトレジスタを用意する必要があるため、数値シミュレーションで用いられる要素数の多い行列の積和演算においてシフトレジスタの段数で対応するのは現実的でないという問題点を有している。
【課題を解決するための手段】
【0006】
本発明の課題は、回路の利用効率および演算性能を向上させることが可能な積和演算回路を提供することにある。
本発明の第1の態様は、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路を前提とする。
【0007】
並列演算手段(102〜112)は、所定行分を並列入力としたデータを並列演算処理する。
積算手段(113〜117)は、並列演算手段に並列入力される行数に対応したレイテンシを有し、並列演算手段の演算結果を積算する。この積算手段は例えば、並列演算手段に並列入力される行数と同じレイテンシを有する。
【0008】
本発明の第2の態様は、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行う設計装置又
は設計プログラムを前提とする。
【0009】
そして、対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段(903)を含む。この配置手段は例えば、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路の配置指示を行う。
【発明の効果】
【0010】
本発明では、加算器等によって実現される積算手段のレイテンシを利用することにより、シフトレジスタ無しに効率的な並列積和演算を実現することが可能となる。これにより、レイテンシをカウントするカウンタのカウント数のみの変更で、レイテンシを処理時間から隠蔽しかつ、行列要素の大きさに応じた積和演算を可能にする。
【発明を実施するための最良の形態】
【0011】
以下図面に基づいて、本発明の実施形態について詳細に説明する。
図1は、本発明による積和演算回路の実施形態を示す構成図である。
通常の行列演算、例えば行列A(132×132)と行列B(132×132)の積の演算では、図13で説明したように、下記数1式に示す計算が実行されることにより、行列C(132×132)の1要素(例えばC0,0)が算出され同様に他の要素も算出される。
【数1】
【0012】
ところが、上記132×132のようにサイズ大きい多入力の積和演算がFPGA(Field Programmable Gate Array)やCPLD(Complex Programmable Logic Device)のようなプログラマブルデバイスにより実現される場合、積和演算の実行のために並列に132個の乗算器を設けなければならない。しかし、単に並列化をすると演算器の数が多くなり回路規模が膨大なものとなるため、実際にハードウェアとしてインプリメントするには複数のプログラマブルデバイスが必要となってしまう。
【0013】
そこで、回路規模を縮小して132×132の演算を行うためには、演算器の数を減らしてインプリメントしなければならない。そのために、例えば下記数2式に基づいて回路規模が削減される。
【数2】
【0014】
しかしこの場合、積和演算を実行する際に、最終段の加算器部分のレイテンシの存在により連続して演算が実行できない。例えば、上記数2式に基づいて並列数が132から6に削減された場合、演算性能は、6/132=1/22になるのではなく、連続演算ができない分が加わって1/264程度に落ちてしまう。
【0015】
そこで、本発明の実施形態では、図1に示される積和演算回路101の構成により、並列数の削減比にほぼ等しい演算性能(=1/22)が達成されるものである。
積和演算回路101は、乗算器102(mul0)、103(mul1)、104(mul2)、105(mul3)、106(mul4)、107(mul5)と、加算器108(add0)、109(add1)、110(add2)、111(add3)、112(add4)、116(add5)、12進カウンタ113(レイテンシカウンタ)、22進カウンタ114、セレクタ115、論理積回路117(and0)を備え、132×132の行列演算を実行する。
【0016】
本実施形態では、積和演算回路101の最終段の加算器116(add5)のレイテンシ(=12)を考慮し、連続演算を可能にするため、行列Aの12行を1ブロックとして演算が行われる。また、行列A、行列B共に6要素ごとに分割され、6要素ごとに演算が行われる。
【0017】
図2〜図5を用いて、上記分割処理について説明する。
例えば行列A及びBともに、132行×132列のサイズを有するとする。
図2の例では、まず、行列Aについて、その行が6要素ごとの部分行ベクトルに分割される。例えば行i=0は、「(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)」「(0,6)(0,7)(0,8)(0,9)(0,10)(0,11)」・・・「(0,120)(0,121)(0,122)(0,123)(0,124)(0,125)」「(0,126)(0,127)(0,128)(0,129)(0,130)(0,131)」のように分割される。同様に行i=0以外の各行i=1〜131についても、6要素ずつの部分行ベクトルに分割される。
【0018】
次に、行列Bについて、その列が6要素ごとの部分列ベクトルに分割される。例えば、列j=0は、「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」・・・「(120,0)(121,0)(122,0)(123,0)(124,0)(125,0)」「(126,0)(127,0)(128,0)(129,0)(130,0)(131,0)」のように分割される。同様に列j=0以外の各列j=1〜131についても、6要素ずつの部分列ベクトルに分割される。
【0019】
そして、図2に示す矢印の示す順に行列Aと行列Bの要素データがブロック単位で入力されて、並列積和演算が実行される。
最初は、行列Aの部分行ベクトル「(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)」と行列Bの部分列ベクトル「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」の並列積和演算が行われる。この並列積和演算は図1の102〜112の回路群によって実行される。そして、その並列積和演算結果は、0行0列の積和演算出力C0,0 のための部分的な演算結果として、加算器116(add5)に溜め込まれる。
【0020】
このadd5は、レイテンシ=12を有するため、12回分の演算結果を溜め込むことができる。
次に、行列Aの部分行ベクトル「(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)」と行列Bの部分列ベクトル「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」の並列積和演算が行われる。その並列積和演算結果は、1行0列の積和演算出力C1,0 のための部分的な演算結果として、add5に溜め込まれる。
【0021】
以下同様にして、行列Aの部分行ベクトルが、ブロック0の最終行i=11まで処理される、つまり部分行ベクトル「(11,0)(11,1)(11,2)(11,3)(11,4)(11,5)」まで処理される。
【0022】
以上の動作の様子を、図3のclock=1〜12として示す。同図において、ピリオドで区切られた数値において、左側の数値は行番号を示し、右側の数値は列番号を示す。そして例えば、A0とclock=1とで決まる枠内に記載される「0.0」は、clo
ck=1のタイミングにおいて入力値A0(図1参照)として、行列データAの0行0列の要素値が入力されることを示す。
【0023】
図3からわかるように、入力B0〜B5(図1参照)の各値は、clock=1〜12の12クロックの間一定値とされ、入力A0〜A5のみが順次変更されてゆく。このクロック数=12は、図1の加算器116(add5)のレイテンシに一致するように設定される。
【0024】
そして、clock=1〜12の12回の動作により、0行0列〜11行0列の各積和演算出力C0,0 〜C11,0 のための1回目の12個の部分的な演算結果S05〜S115(図3参照)がadd5に溜め込まれる。
【0025】
clock=12の動作が完了したら、図3に示されるように、行列Bの部分列ベクトルが次の部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」に変更される。
【0026】
そして、行列Aの部分行ベクトル「(0,6)(0,7)(0,8)(0,9)(0,10)(0,11)」と行列Bの部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」の並列積和演算が行われる。その演算結果S011(図3参照)は、加算器116(add5)において、その出力値adata5(図1)として出力されている0行0列の積和演算出力C0,0 の演算のための12クロック前の並列積和演算結果S05と加算されて、その加算結果S05+S011が再びadd5に溜め込まれる。
【0027】
次に、行列Aの部分行ベクトル「(1,6)(1,7)(1,8)(1,9)(1,10)(1,11)」と行列Bの部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」の並列積和演算が行われる。その演算結果S111(図3参照)は、加算器116(add5)において、その出力値adata5(図1)として出力されている1行0列の積和演算出力C1,0 の演算のための12クロック前の並列積和演算結果S15と加算されて、その加算結果S15+S111が再びadd5に溜め込まれる。
【0028】
以下同様にして、行列Aの部分行ベクトルが、ブロック0の最終行i=11まで処理される、つまり部分行ベクトル「(11,6)(11,7)(11,8)(11,9)(11,10)(11,11)」まで処理される。
【0029】
以上の動作の様子を、図3のclock=13〜24として示す。このclock=13〜24の12回の動作により、0行0列〜11行0列の各積和演算出力C0,0 〜C11,0 のための2回目の12個の部分的な演算結果S05+S011〜S115+S1111(図3参照)がadd5に溜め込まれる。
【0030】
clock=12の動作が完了したら、図3に示されるように、行列Bの部分列ベクトルが次の部分列ベクトル「(12,0)(13,0)(14,0)(15,0)(16,0)(17,0)」に変更される。
【0031】
以上の12クロックずつの動作が22回繰り返される、即ち12×22=264クロック分の動作が繰り返されることによって、0行0列〜11行0列の12個の積和演算出力C0,0 〜C11,0 が確定する。図3では、行列A×行列B=行列Cの演算において、block0のブロックにおける12個のデータが確定する様子が示されている。
【0032】
次に、ブロック0と同様にブロック1の演算が行われ、以下順次ブロック10までの11ブロック分の演算が行われる。また、演算結果は列順で確定するため、結果順にSDRAMメモリなどへ転送して記録される。
【0033】
上述の説明は、例えば行列A及びBともに132行×132列のサイズを有する場合の例についてのものであるが、そのほかに行列A及びBが例えば66行×66列のサイズを有するような場合には、図1の加算器116(add5)のレイテンシに対応させて各行列要素を1ブロック=12要素ずつに分割した場合、余りが出てしまう。
【0034】
このような場合には、図4に示されるように、各行列要素数を12で割り切れるように拡張し、拡張部分には値0を有するdummy(ダミー)値を補充すればよい。
次に図5は、図1を構成する各演算器102〜112、及び116の機能を示す図である。
【0035】
基本的に、各演算器は3入力、2出力のポートを備えている。入力ポートは、データを入力する2ポートと、演算を有効にするイネーブル信号を取得する1ポートの計3ポートを有する。出力ポートは、データを出力するポートと、次段に接続される演算を有効にするイネーブル信号を出力するための1ポートの計2ポートを有する。また、演算器内に示されている「数値1」はスループットを示し、「数値2」はレイテンシを示している。
【0036】
図1の乗算器102〜107は、行列Aの行ベクトルごとの各要素A0〜A5と行列Bの各要素B0〜B5を取得する2つの各入力ポートと、乗算器の演算を行うかどうかを決定するイネーブル信号を取得する各ポートと、次段に接続される加算器108への出力信号(mdata0〜5)を出力する各出力ポートと、加算器108〜110の各演算を有効にすることを通知する信号(mrdy0,mrdy2,mrdy4)を出力するポートを備えている。乗算器102は、イネーブル信号が有効を示しているときに、入力ポートA0、B0に入力された要素を乗算する。
【0037】
本例では乗算器102〜107は64ビット浮動小数点の乗算器を用いているが、64ビット浮動小数点の乗算器に限定するものではなく乗算ができれば固定小数点型であってもよい。
【0038】
加算器108〜110はそれぞれ、乗算器102と103、乗算器104と105、及び乗算器106と107の各出力ポートと接続される各入力ポートを備え、乗算結果であるmdata0とmdata1、mdata2とmdata3、及びmdata4とmdata5を取得する。また、乗算器102,104,106からそれぞれ出力されるmrdy0,mrdy2,mrdy4信号をそれぞれ取得する各入力ポートを備えている。加算器108〜110は、mrdy0,mrdy2,mrdy4がそれぞれ有効であるときに各加算動作を実行し、各出力adata0〜2を出力する。
【0039】
加算器108は、次段の加算器111にイネーブル信号ardy0信号を出力する。
加算器111は、加算器108と109の各出力ポートと接続される各入力ポートを備え、加算結果であるadata0とadata1を取得する。また、加算器108から出力されるardy0信号を取得する入力ポートを備えている。加算器111は、ardy0信号が有効であるときに加算動作を実行し、出力adata3を出力する。また、加算器111は、次段の加算器112にイネーブル信号ardy3信号を出力する。
【0040】
加算器112は、加算器111と110の各出力ポートと接続される各入力ポートを備え、加算結果であるadata3とadata2を取得する。また、加算器111から出
力されるardy3信号を取得する入力ポートを備えている。加算器112は、ardy3信号が有効であるときに加算動作を実行し、出力adata4を出力する。また、加算器112は、次段の加算器116等にイネーブル信号ardy4信号を出力する。
【0041】
加算器116は、adata4を取得するAポートと、ardy4信号を取得するvalidポートとセレクタ115の出力信号を取得するBポートを備えている。また、加算器116は、加算演算結果adata5(RESULT)を出力する出力ポートと、次段に接続されている論理積回路117にイネーブル信号ardy5信号を出力するポートを有する。加算器116は、ardy4信号が有効のときにadata4とセレクタ115の出力(adata5又は値0)の加算を行う。
【0042】
加算器108〜112,116は、64ビット浮動小数点の加算器を用いているが、64ビット浮動小数点の加算器に限定するものではなく加算ができれば固定小数点型であってもよい。
【0043】
本例では、乗算器102〜107はレイテンシが9であり、加算器108〜112,116はレイテンシが12である。
12進カウンタ113(レイテンシカウンタ)は、加算器116の出力レイテンシを計測(カウント)するカウンタであり、加算器112の出力データイネーブル信号であるardy4信号をカウントし12カウントすると、carry信号であるcount_upを「1」にする。なお、本例では加算器116のレイテンシが12であるので12進カウンタを用いているが、レイテンシが異なる場合はレイテンシに合わせたカウンタにすることで対応できる。
【0044】
22進カウンタ114は、12進カウンタ113の出力であるcount_up信号の「1」を取得してカウントするカウンタである。積和演算回路101では、前述したように、132×132の行列積演算が実行される場合には、12×22=264クロックに1回の割合で12個の出力が得られるため、12進カウンタ113と22進カウンタ114の組合せにより上記264クロックを計測している。
【0045】
そして、22進カウンタ114は、22回に1回、演算結果を選択出力するための信号(count0)を出力する。
このカウンタ114のカウント数は、行列サイズに応じて決定すればよい。
【0046】
セレクタ115は、2入力から1つを選択するセレクタであり、加算器116への入力データを選択するセレクタである。加算器116のBポートへは、例えばcount0信号が「1」の場合は値「0」を選択し、それ以外の場合は加算器116の演算結果であるフィードバック値adata5を選択する。
【0047】
論理積回路117は、積和演算結果の出力タイミングを選択する。加算器116の出力データが有効であることを示すRDY信号を生成する。
図6及び図7は、図1の積和演算回路101において1組の行列演算を実行した場合の動作を示す動作タイミングチャートである。図6は、積和演算回路101への行列データの入力から加算器112(add4)からの出力までのタイミング、図7は、加算器112(add4)の出力から積和演算回路101からの出力までのタイミングを示している。
【0048】
まず、図6において、積和演算回路101へのデータ入力タイミングはグループ1とグループ2がある。
グループ1は、乗算器102〜105への入力のグループであり、VALID信号=1
で入力が行われる。
【0049】
グループ2は、乗算器106及び107への入力のグループであり、VALID_LAT12信号=1で入力が行われる。グループ2に属する入力データ群は、後続の加算器が1段少ないため、加算器112(add4)の入力タイミングを合わせるために、加算器111(add3)のレイテンシの分=12クロック分遅延させられて、乗算器106及び107への入力が行われる。
【0050】
行列Aの入力データA0〜A5と行列Bの入力データB0〜B5の関係は、図3等で説明した通りである。
乗算器102〜107のレイテンシ=9、加算器108〜110のレイテンシ=12、加算器111のレイテンシ=12、及び加算器112のレイテンシ=12であるため、乗算器102〜107への入力から加算器112からの出力までのレイテンシは、9+12+12+12=45である。従って、加算器112(add4)は、クロックCLK=0でグループ1の入力が開始された後、クロックCLK=45で有効データを出力し、データ有効を示す信号ardy4信号=1を出力する。
【0051】
次に、図7において、クロックCLK=45で加算器112(add4)のデータが有効(ardy4信号=1)になると、加算器116(add5)での加算が開始され、これと同時に、12進カウンタ113(レイテンシカウンタ:counter0)でのカウント動作が開始される。
【0052】
最終段の加算器116(add5)はardy4信号=1の間、加算動作を行う。具体的な加算動作については、図2及び図3で説明した通りである。
12進カウンタ113(レイテンシカウンタ:counter0)でのカウント値が11になるとcount_up信号=1となり、22進カウンタ114(counter1)がカウントされる(図7のクロックCLK=67のタイミング)。
【0053】
ardy4信号=1のとき22進カウンタ114(counter1)のカウント値が0になるとcount0信号=1となり、積和演算結果の出力(adata5/RESULT)が有効であることを示すRDY信号=1が出力される(図7のクロックCLK=309のタイミング)。このタイミングは前述したように、加算器112が出力を開始してから12×22=264クロック目である。図1の積和演算回路101に入力されてからのクロック数は、前記レイテンシ45+264=309クロックである。
【0054】
積和演算結果の出力(adata5/RESULT)が有効であることを示すRDY信号は、ardy4信号=1となってから264クロック毎にRDY=1となり、そこから12クロック間RDY=1となる。これにより、前述した264クロック毎に12個ずつの積和演算結果データ(図7のR0〜R11)が出力される。
この間、セレクタ115は、値0を選択し、加算器116が実質的な加算動作を行わないように制御する。
【0055】
図1の構成における演算性能について考察する。
本実施形態では、前述したように、加算器116(add5)のレイテンシ=12を考慮した積和演算回路設計により、132行×132列のサイズを有する行例AとBについてのA×B演算は、前述したように264クロック毎に12個の演算結果を得ることができる。これから、本実施形態による132×132行列の6並列FPGA処理時間は、264クロック×132行/12×132列=383,328クロックとなる。
【0056】
一方、132×132行列の積和計算の逐次処理時間は、各乗算及び加算のスループット=1として、132×132×132=2,299,968クロックである。
従って、本実施形態は、383,328/2,299,968=1/6となり、並列数に対応する積和演算性能を達成することができる。これは、部分的な積和演算結果を積算する最終段の加算器116(add5)のスタートアップステージの全段に異なった行の部分積和結果を溜め込み、それらの部分的な積和演算結果の積算を2つのカウンタ113及び114によって制御することにより、最終段のadd5加算器及び積和演算器のレイテンシを最小に隠蔽させることが可能となり、これにより演算器並列の並列処理性能が最大限に発揮されるためである。
【0057】
最終段の加算器116(add5)がもし無いと仮定すると、加算器112(add4)の結果をメモリに格納する必要が生じる。この場合、A×Bの部分積和が演算されるごとにレイテンシ45クロックがかかる。その上で、例えば本実施形態と同じように6要素ごとに計算が実行された場合、(45+264)クロック×132行/12×132列=448,668クロックがかかる。また、add5相当の演算のために、22回×132行×132列+12=383,340クロックがかかる。従って、全体では、448,668+383,340=832,008クロックがかかる。逐次演算との比較は、832,008/2,299,968=1/2.76となってしまい、演算性能が大幅にダウンすることがわかる。
これにより、本発明の実施形態の演算性能が高いことは明らかである。
【0058】
図8は、図1の構成を有する行列積和演算回路の、FPGAへの具体的な実装例を示した図である。MAT_CALCとして示されたブロックが図1に対応しており、これに、メモリ転送を制御するインタフェース回路、演算データ制御を実行する回路等が実装される。
【0059】
図9は、図1又は図8の構成を有するFPGAを設計する装置の構成図である。
この設計装置901は、入力手段902からの配置データの入力に従って、FPGA904(図1又は図8に対応)に対して演算回路の配置指示を行う配置手段903を有する。
【0060】
図10は、図9の配置手段903が実行する配置動作を示す動作フローチャートである。
利用者はまず、図9の入力手段902から、クロック速度を入力する(ステップS1001)。例えば、クロック速度=1GHzと入力されたとする。
【0061】
配置手段903は、回路処理速度データベース1001より、対象となる加算回路の処理速度を抽出し、レイテンシを算出する(ステップ1002)。図11は、回路速度データベース1001のデータ構成例を示した図である。演算回路毎に処理時間が記録されている。ここでは、加算回路が16nsの処理時間を要すると認識できる。
【0062】
レイテンシは、加算回路が何クロックで処理できるかという性能を表し、
レイテンシ=加算回路の処理時間/(1/クロック)
となる。本実施の形態では、上記のようにクロック:1GHz、加算回路の処理時間:16nsなので、
レイテンシ=16ns/(1/1GHz)
=16
となる。
【0063】
続いて、配置手段903は、算出されたレイテンシ=16に合わせて、入力数を設定し、回路構成を生成する(ステップS1003)。
そして、配置手段903は、FPGA904(図9)に対して、回路の再構築を指示する(ステップS1004)。
【0064】
実施例では積和演算回路について説明しているが、同一の演算アルゴリズムによって多数の独立した演算結果を得る場合には、例えば図1において入力の乗算器102の一部または全部を他の演算器(加減算器、除算器、あるいは複数の演算器の組合せなど)で置き換えて構成される、積和と単純加算との混合演算手段あるいは多数の数値の総和を計算する積算手段あるいはその他の演算手段としても、本発明が適用可能である。
【0065】
本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【図面の簡単な説明】
【0066】
【図1】積和演算回路の実施形態を示す構成図である。
【図2】実施形態の積和演算方式の説明図(N=132(11ブロック)の場合)である。
【図3】実施形態の説明図(N=132(11ブロック)の場合)である。
【図4】実施形態の積和演算方式の説明図(N=66(6ブロック)の場合)である。
【図5】演算器の機能の説明図である。
【図6】実施形態に示す積和演算回路の動作タイミングチャート(その1)である。
【図7】実施形態に示す積和演算回路の動作タイミングチャート(その2)である。
【図8】実施形態に示す積和演算回路が構成されるFPGAの全体ブロック図である。
【図9】本実施形態のFPGAを設計する装置の構成図である。
【図10】配置動作を示す動作フローチャートである。
【図11】回路処理速度データベースのデータ構成図である。
【図12】従来の積和演算方式の説明図である。
【符号の説明】
【0067】
101 積和演算回路
102〜107 乗算器
108〜112,116 加算器
113 12進カウンタ(レイテンシカウンタ)
114 22進カウンタ
115 セレクタ
117 論理回路
901 FPGA設計装置
902 入力手段
903 配置手段
904 FPGA
【技術分野】
【0001】
本発明は、行列の積和演算の技術に関する。
【背景技術】
【0002】
近年、ハードウェアにより行列の積和演算回路を実現する場合に、回路規模を縮小するとともに演算時間の短縮が求められている。
例えば、図12に示されるように、それぞれ132行×132列の行列AとBの積A×Bが算出される場合、通常の演算方法では、行列Bの列(j)が固定され、行列Aの行(i)がi=0〜131の順で演算され、行列Cの列(j)の解が算出される。
【0003】
次に、行列Bの列(j)が+1された後、行列Aの行(i)がi=0〜131の順で演算されることにより、行列Cの次の列(j)の解が算出される。
この演算方法からわかるように、行列A×Bの演算には、膨大な量の積和演算が必要となる。
【0004】
この演算時間を短縮するために、例えば下記特許文献1では、行列とベクトルの積を複数の乗算器と加算器で求める積和演算回路の技術が開示されている。
また、下記特許文献2では、3×3の空間積和を求める回路において、最初の3個の部分積和が算出されて結果がシフトレジスタに入力され、その後、別の積和が255回計算された後に次の3個の積和が計算され、シフトレジスタ内の結果と加算されて空間積和が出力される技術が開示されている。
【特許文献1】特開2003−58876号公報
【特許文献2】特公平7−38217号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
しかし、上記特許文献1に記載の従来技術では、複数の乗算器と加算器が使用されるため、行列が大きくなると回路規模が縮小できないという問題点を有している。
また、上記特許文献2に記載の従来技術では、行の大きさに対応したシフトレジスタを用意する必要があるため、数値シミュレーションで用いられる要素数の多い行列の積和演算においてシフトレジスタの段数で対応するのは現実的でないという問題点を有している。
【課題を解決するための手段】
【0006】
本発明の課題は、回路の利用効率および演算性能を向上させることが可能な積和演算回路を提供することにある。
本発明の第1の態様は、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路を前提とする。
【0007】
並列演算手段(102〜112)は、所定行分を並列入力としたデータを並列演算処理する。
積算手段(113〜117)は、並列演算手段に並列入力される行数に対応したレイテンシを有し、並列演算手段の演算結果を積算する。この積算手段は例えば、並列演算手段に並列入力される行数と同じレイテンシを有する。
【0008】
本発明の第2の態様は、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行う設計装置又
は設計プログラムを前提とする。
【0009】
そして、対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段(903)を含む。この配置手段は例えば、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路の配置指示を行う。
【発明の効果】
【0010】
本発明では、加算器等によって実現される積算手段のレイテンシを利用することにより、シフトレジスタ無しに効率的な並列積和演算を実現することが可能となる。これにより、レイテンシをカウントするカウンタのカウント数のみの変更で、レイテンシを処理時間から隠蔽しかつ、行列要素の大きさに応じた積和演算を可能にする。
【発明を実施するための最良の形態】
【0011】
以下図面に基づいて、本発明の実施形態について詳細に説明する。
図1は、本発明による積和演算回路の実施形態を示す構成図である。
通常の行列演算、例えば行列A(132×132)と行列B(132×132)の積の演算では、図13で説明したように、下記数1式に示す計算が実行されることにより、行列C(132×132)の1要素(例えばC0,0)が算出され同様に他の要素も算出される。
【数1】
【0012】
ところが、上記132×132のようにサイズ大きい多入力の積和演算がFPGA(Field Programmable Gate Array)やCPLD(Complex Programmable Logic Device)のようなプログラマブルデバイスにより実現される場合、積和演算の実行のために並列に132個の乗算器を設けなければならない。しかし、単に並列化をすると演算器の数が多くなり回路規模が膨大なものとなるため、実際にハードウェアとしてインプリメントするには複数のプログラマブルデバイスが必要となってしまう。
【0013】
そこで、回路規模を縮小して132×132の演算を行うためには、演算器の数を減らしてインプリメントしなければならない。そのために、例えば下記数2式に基づいて回路規模が削減される。
【数2】
【0014】
しかしこの場合、積和演算を実行する際に、最終段の加算器部分のレイテンシの存在により連続して演算が実行できない。例えば、上記数2式に基づいて並列数が132から6に削減された場合、演算性能は、6/132=1/22になるのではなく、連続演算ができない分が加わって1/264程度に落ちてしまう。
【0015】
そこで、本発明の実施形態では、図1に示される積和演算回路101の構成により、並列数の削減比にほぼ等しい演算性能(=1/22)が達成されるものである。
積和演算回路101は、乗算器102(mul0)、103(mul1)、104(mul2)、105(mul3)、106(mul4)、107(mul5)と、加算器108(add0)、109(add1)、110(add2)、111(add3)、112(add4)、116(add5)、12進カウンタ113(レイテンシカウンタ)、22進カウンタ114、セレクタ115、論理積回路117(and0)を備え、132×132の行列演算を実行する。
【0016】
本実施形態では、積和演算回路101の最終段の加算器116(add5)のレイテンシ(=12)を考慮し、連続演算を可能にするため、行列Aの12行を1ブロックとして演算が行われる。また、行列A、行列B共に6要素ごとに分割され、6要素ごとに演算が行われる。
【0017】
図2〜図5を用いて、上記分割処理について説明する。
例えば行列A及びBともに、132行×132列のサイズを有するとする。
図2の例では、まず、行列Aについて、その行が6要素ごとの部分行ベクトルに分割される。例えば行i=0は、「(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)」「(0,6)(0,7)(0,8)(0,9)(0,10)(0,11)」・・・「(0,120)(0,121)(0,122)(0,123)(0,124)(0,125)」「(0,126)(0,127)(0,128)(0,129)(0,130)(0,131)」のように分割される。同様に行i=0以外の各行i=1〜131についても、6要素ずつの部分行ベクトルに分割される。
【0018】
次に、行列Bについて、その列が6要素ごとの部分列ベクトルに分割される。例えば、列j=0は、「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」・・・「(120,0)(121,0)(122,0)(123,0)(124,0)(125,0)」「(126,0)(127,0)(128,0)(129,0)(130,0)(131,0)」のように分割される。同様に列j=0以外の各列j=1〜131についても、6要素ずつの部分列ベクトルに分割される。
【0019】
そして、図2に示す矢印の示す順に行列Aと行列Bの要素データがブロック単位で入力されて、並列積和演算が実行される。
最初は、行列Aの部分行ベクトル「(0,0)(0,1)(0,2)(0,3)(0,4)(0,5)」と行列Bの部分列ベクトル「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」の並列積和演算が行われる。この並列積和演算は図1の102〜112の回路群によって実行される。そして、その並列積和演算結果は、0行0列の積和演算出力C0,0 のための部分的な演算結果として、加算器116(add5)に溜め込まれる。
【0020】
このadd5は、レイテンシ=12を有するため、12回分の演算結果を溜め込むことができる。
次に、行列Aの部分行ベクトル「(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)」と行列Bの部分列ベクトル「(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)」の並列積和演算が行われる。その並列積和演算結果は、1行0列の積和演算出力C1,0 のための部分的な演算結果として、add5に溜め込まれる。
【0021】
以下同様にして、行列Aの部分行ベクトルが、ブロック0の最終行i=11まで処理される、つまり部分行ベクトル「(11,0)(11,1)(11,2)(11,3)(11,4)(11,5)」まで処理される。
【0022】
以上の動作の様子を、図3のclock=1〜12として示す。同図において、ピリオドで区切られた数値において、左側の数値は行番号を示し、右側の数値は列番号を示す。そして例えば、A0とclock=1とで決まる枠内に記載される「0.0」は、clo
ck=1のタイミングにおいて入力値A0(図1参照)として、行列データAの0行0列の要素値が入力されることを示す。
【0023】
図3からわかるように、入力B0〜B5(図1参照)の各値は、clock=1〜12の12クロックの間一定値とされ、入力A0〜A5のみが順次変更されてゆく。このクロック数=12は、図1の加算器116(add5)のレイテンシに一致するように設定される。
【0024】
そして、clock=1〜12の12回の動作により、0行0列〜11行0列の各積和演算出力C0,0 〜C11,0 のための1回目の12個の部分的な演算結果S05〜S115(図3参照)がadd5に溜め込まれる。
【0025】
clock=12の動作が完了したら、図3に示されるように、行列Bの部分列ベクトルが次の部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」に変更される。
【0026】
そして、行列Aの部分行ベクトル「(0,6)(0,7)(0,8)(0,9)(0,10)(0,11)」と行列Bの部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」の並列積和演算が行われる。その演算結果S011(図3参照)は、加算器116(add5)において、その出力値adata5(図1)として出力されている0行0列の積和演算出力C0,0 の演算のための12クロック前の並列積和演算結果S05と加算されて、その加算結果S05+S011が再びadd5に溜め込まれる。
【0027】
次に、行列Aの部分行ベクトル「(1,6)(1,7)(1,8)(1,9)(1,10)(1,11)」と行列Bの部分列ベクトル「(6,0)(7,0)(8,0)(9,0)(10,0)(11,0)」の並列積和演算が行われる。その演算結果S111(図3参照)は、加算器116(add5)において、その出力値adata5(図1)として出力されている1行0列の積和演算出力C1,0 の演算のための12クロック前の並列積和演算結果S15と加算されて、その加算結果S15+S111が再びadd5に溜め込まれる。
【0028】
以下同様にして、行列Aの部分行ベクトルが、ブロック0の最終行i=11まで処理される、つまり部分行ベクトル「(11,6)(11,7)(11,8)(11,9)(11,10)(11,11)」まで処理される。
【0029】
以上の動作の様子を、図3のclock=13〜24として示す。このclock=13〜24の12回の動作により、0行0列〜11行0列の各積和演算出力C0,0 〜C11,0 のための2回目の12個の部分的な演算結果S05+S011〜S115+S1111(図3参照)がadd5に溜め込まれる。
【0030】
clock=12の動作が完了したら、図3に示されるように、行列Bの部分列ベクトルが次の部分列ベクトル「(12,0)(13,0)(14,0)(15,0)(16,0)(17,0)」に変更される。
【0031】
以上の12クロックずつの動作が22回繰り返される、即ち12×22=264クロック分の動作が繰り返されることによって、0行0列〜11行0列の12個の積和演算出力C0,0 〜C11,0 が確定する。図3では、行列A×行列B=行列Cの演算において、block0のブロックにおける12個のデータが確定する様子が示されている。
【0032】
次に、ブロック0と同様にブロック1の演算が行われ、以下順次ブロック10までの11ブロック分の演算が行われる。また、演算結果は列順で確定するため、結果順にSDRAMメモリなどへ転送して記録される。
【0033】
上述の説明は、例えば行列A及びBともに132行×132列のサイズを有する場合の例についてのものであるが、そのほかに行列A及びBが例えば66行×66列のサイズを有するような場合には、図1の加算器116(add5)のレイテンシに対応させて各行列要素を1ブロック=12要素ずつに分割した場合、余りが出てしまう。
【0034】
このような場合には、図4に示されるように、各行列要素数を12で割り切れるように拡張し、拡張部分には値0を有するdummy(ダミー)値を補充すればよい。
次に図5は、図1を構成する各演算器102〜112、及び116の機能を示す図である。
【0035】
基本的に、各演算器は3入力、2出力のポートを備えている。入力ポートは、データを入力する2ポートと、演算を有効にするイネーブル信号を取得する1ポートの計3ポートを有する。出力ポートは、データを出力するポートと、次段に接続される演算を有効にするイネーブル信号を出力するための1ポートの計2ポートを有する。また、演算器内に示されている「数値1」はスループットを示し、「数値2」はレイテンシを示している。
【0036】
図1の乗算器102〜107は、行列Aの行ベクトルごとの各要素A0〜A5と行列Bの各要素B0〜B5を取得する2つの各入力ポートと、乗算器の演算を行うかどうかを決定するイネーブル信号を取得する各ポートと、次段に接続される加算器108への出力信号(mdata0〜5)を出力する各出力ポートと、加算器108〜110の各演算を有効にすることを通知する信号(mrdy0,mrdy2,mrdy4)を出力するポートを備えている。乗算器102は、イネーブル信号が有効を示しているときに、入力ポートA0、B0に入力された要素を乗算する。
【0037】
本例では乗算器102〜107は64ビット浮動小数点の乗算器を用いているが、64ビット浮動小数点の乗算器に限定するものではなく乗算ができれば固定小数点型であってもよい。
【0038】
加算器108〜110はそれぞれ、乗算器102と103、乗算器104と105、及び乗算器106と107の各出力ポートと接続される各入力ポートを備え、乗算結果であるmdata0とmdata1、mdata2とmdata3、及びmdata4とmdata5を取得する。また、乗算器102,104,106からそれぞれ出力されるmrdy0,mrdy2,mrdy4信号をそれぞれ取得する各入力ポートを備えている。加算器108〜110は、mrdy0,mrdy2,mrdy4がそれぞれ有効であるときに各加算動作を実行し、各出力adata0〜2を出力する。
【0039】
加算器108は、次段の加算器111にイネーブル信号ardy0信号を出力する。
加算器111は、加算器108と109の各出力ポートと接続される各入力ポートを備え、加算結果であるadata0とadata1を取得する。また、加算器108から出力されるardy0信号を取得する入力ポートを備えている。加算器111は、ardy0信号が有効であるときに加算動作を実行し、出力adata3を出力する。また、加算器111は、次段の加算器112にイネーブル信号ardy3信号を出力する。
【0040】
加算器112は、加算器111と110の各出力ポートと接続される各入力ポートを備え、加算結果であるadata3とadata2を取得する。また、加算器111から出
力されるardy3信号を取得する入力ポートを備えている。加算器112は、ardy3信号が有効であるときに加算動作を実行し、出力adata4を出力する。また、加算器112は、次段の加算器116等にイネーブル信号ardy4信号を出力する。
【0041】
加算器116は、adata4を取得するAポートと、ardy4信号を取得するvalidポートとセレクタ115の出力信号を取得するBポートを備えている。また、加算器116は、加算演算結果adata5(RESULT)を出力する出力ポートと、次段に接続されている論理積回路117にイネーブル信号ardy5信号を出力するポートを有する。加算器116は、ardy4信号が有効のときにadata4とセレクタ115の出力(adata5又は値0)の加算を行う。
【0042】
加算器108〜112,116は、64ビット浮動小数点の加算器を用いているが、64ビット浮動小数点の加算器に限定するものではなく加算ができれば固定小数点型であってもよい。
【0043】
本例では、乗算器102〜107はレイテンシが9であり、加算器108〜112,116はレイテンシが12である。
12進カウンタ113(レイテンシカウンタ)は、加算器116の出力レイテンシを計測(カウント)するカウンタであり、加算器112の出力データイネーブル信号であるardy4信号をカウントし12カウントすると、carry信号であるcount_upを「1」にする。なお、本例では加算器116のレイテンシが12であるので12進カウンタを用いているが、レイテンシが異なる場合はレイテンシに合わせたカウンタにすることで対応できる。
【0044】
22進カウンタ114は、12進カウンタ113の出力であるcount_up信号の「1」を取得してカウントするカウンタである。積和演算回路101では、前述したように、132×132の行列積演算が実行される場合には、12×22=264クロックに1回の割合で12個の出力が得られるため、12進カウンタ113と22進カウンタ114の組合せにより上記264クロックを計測している。
【0045】
そして、22進カウンタ114は、22回に1回、演算結果を選択出力するための信号(count0)を出力する。
このカウンタ114のカウント数は、行列サイズに応じて決定すればよい。
【0046】
セレクタ115は、2入力から1つを選択するセレクタであり、加算器116への入力データを選択するセレクタである。加算器116のBポートへは、例えばcount0信号が「1」の場合は値「0」を選択し、それ以外の場合は加算器116の演算結果であるフィードバック値adata5を選択する。
【0047】
論理積回路117は、積和演算結果の出力タイミングを選択する。加算器116の出力データが有効であることを示すRDY信号を生成する。
図6及び図7は、図1の積和演算回路101において1組の行列演算を実行した場合の動作を示す動作タイミングチャートである。図6は、積和演算回路101への行列データの入力から加算器112(add4)からの出力までのタイミング、図7は、加算器112(add4)の出力から積和演算回路101からの出力までのタイミングを示している。
【0048】
まず、図6において、積和演算回路101へのデータ入力タイミングはグループ1とグループ2がある。
グループ1は、乗算器102〜105への入力のグループであり、VALID信号=1
で入力が行われる。
【0049】
グループ2は、乗算器106及び107への入力のグループであり、VALID_LAT12信号=1で入力が行われる。グループ2に属する入力データ群は、後続の加算器が1段少ないため、加算器112(add4)の入力タイミングを合わせるために、加算器111(add3)のレイテンシの分=12クロック分遅延させられて、乗算器106及び107への入力が行われる。
【0050】
行列Aの入力データA0〜A5と行列Bの入力データB0〜B5の関係は、図3等で説明した通りである。
乗算器102〜107のレイテンシ=9、加算器108〜110のレイテンシ=12、加算器111のレイテンシ=12、及び加算器112のレイテンシ=12であるため、乗算器102〜107への入力から加算器112からの出力までのレイテンシは、9+12+12+12=45である。従って、加算器112(add4)は、クロックCLK=0でグループ1の入力が開始された後、クロックCLK=45で有効データを出力し、データ有効を示す信号ardy4信号=1を出力する。
【0051】
次に、図7において、クロックCLK=45で加算器112(add4)のデータが有効(ardy4信号=1)になると、加算器116(add5)での加算が開始され、これと同時に、12進カウンタ113(レイテンシカウンタ:counter0)でのカウント動作が開始される。
【0052】
最終段の加算器116(add5)はardy4信号=1の間、加算動作を行う。具体的な加算動作については、図2及び図3で説明した通りである。
12進カウンタ113(レイテンシカウンタ:counter0)でのカウント値が11になるとcount_up信号=1となり、22進カウンタ114(counter1)がカウントされる(図7のクロックCLK=67のタイミング)。
【0053】
ardy4信号=1のとき22進カウンタ114(counter1)のカウント値が0になるとcount0信号=1となり、積和演算結果の出力(adata5/RESULT)が有効であることを示すRDY信号=1が出力される(図7のクロックCLK=309のタイミング)。このタイミングは前述したように、加算器112が出力を開始してから12×22=264クロック目である。図1の積和演算回路101に入力されてからのクロック数は、前記レイテンシ45+264=309クロックである。
【0054】
積和演算結果の出力(adata5/RESULT)が有効であることを示すRDY信号は、ardy4信号=1となってから264クロック毎にRDY=1となり、そこから12クロック間RDY=1となる。これにより、前述した264クロック毎に12個ずつの積和演算結果データ(図7のR0〜R11)が出力される。
この間、セレクタ115は、値0を選択し、加算器116が実質的な加算動作を行わないように制御する。
【0055】
図1の構成における演算性能について考察する。
本実施形態では、前述したように、加算器116(add5)のレイテンシ=12を考慮した積和演算回路設計により、132行×132列のサイズを有する行例AとBについてのA×B演算は、前述したように264クロック毎に12個の演算結果を得ることができる。これから、本実施形態による132×132行列の6並列FPGA処理時間は、264クロック×132行/12×132列=383,328クロックとなる。
【0056】
一方、132×132行列の積和計算の逐次処理時間は、各乗算及び加算のスループット=1として、132×132×132=2,299,968クロックである。
従って、本実施形態は、383,328/2,299,968=1/6となり、並列数に対応する積和演算性能を達成することができる。これは、部分的な積和演算結果を積算する最終段の加算器116(add5)のスタートアップステージの全段に異なった行の部分積和結果を溜め込み、それらの部分的な積和演算結果の積算を2つのカウンタ113及び114によって制御することにより、最終段のadd5加算器及び積和演算器のレイテンシを最小に隠蔽させることが可能となり、これにより演算器並列の並列処理性能が最大限に発揮されるためである。
【0057】
最終段の加算器116(add5)がもし無いと仮定すると、加算器112(add4)の結果をメモリに格納する必要が生じる。この場合、A×Bの部分積和が演算されるごとにレイテンシ45クロックがかかる。その上で、例えば本実施形態と同じように6要素ごとに計算が実行された場合、(45+264)クロック×132行/12×132列=448,668クロックがかかる。また、add5相当の演算のために、22回×132行×132列+12=383,340クロックがかかる。従って、全体では、448,668+383,340=832,008クロックがかかる。逐次演算との比較は、832,008/2,299,968=1/2.76となってしまい、演算性能が大幅にダウンすることがわかる。
これにより、本発明の実施形態の演算性能が高いことは明らかである。
【0058】
図8は、図1の構成を有する行列積和演算回路の、FPGAへの具体的な実装例を示した図である。MAT_CALCとして示されたブロックが図1に対応しており、これに、メモリ転送を制御するインタフェース回路、演算データ制御を実行する回路等が実装される。
【0059】
図9は、図1又は図8の構成を有するFPGAを設計する装置の構成図である。
この設計装置901は、入力手段902からの配置データの入力に従って、FPGA904(図1又は図8に対応)に対して演算回路の配置指示を行う配置手段903を有する。
【0060】
図10は、図9の配置手段903が実行する配置動作を示す動作フローチャートである。
利用者はまず、図9の入力手段902から、クロック速度を入力する(ステップS1001)。例えば、クロック速度=1GHzと入力されたとする。
【0061】
配置手段903は、回路処理速度データベース1001より、対象となる加算回路の処理速度を抽出し、レイテンシを算出する(ステップ1002)。図11は、回路速度データベース1001のデータ構成例を示した図である。演算回路毎に処理時間が記録されている。ここでは、加算回路が16nsの処理時間を要すると認識できる。
【0062】
レイテンシは、加算回路が何クロックで処理できるかという性能を表し、
レイテンシ=加算回路の処理時間/(1/クロック)
となる。本実施の形態では、上記のようにクロック:1GHz、加算回路の処理時間:16nsなので、
レイテンシ=16ns/(1/1GHz)
=16
となる。
【0063】
続いて、配置手段903は、算出されたレイテンシ=16に合わせて、入力数を設定し、回路構成を生成する(ステップS1003)。
そして、配置手段903は、FPGA904(図9)に対して、回路の再構築を指示する(ステップS1004)。
【0064】
実施例では積和演算回路について説明しているが、同一の演算アルゴリズムによって多数の独立した演算結果を得る場合には、例えば図1において入力の乗算器102の一部または全部を他の演算器(加減算器、除算器、あるいは複数の演算器の組合せなど)で置き換えて構成される、積和と単純加算との混合演算手段あるいは多数の数値の総和を計算する積算手段あるいはその他の演算手段としても、本発明が適用可能である。
【0065】
本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【図面の簡単な説明】
【0066】
【図1】積和演算回路の実施形態を示す構成図である。
【図2】実施形態の積和演算方式の説明図(N=132(11ブロック)の場合)である。
【図3】実施形態の説明図(N=132(11ブロック)の場合)である。
【図4】実施形態の積和演算方式の説明図(N=66(6ブロック)の場合)である。
【図5】演算器の機能の説明図である。
【図6】実施形態に示す積和演算回路の動作タイミングチャート(その1)である。
【図7】実施形態に示す積和演算回路の動作タイミングチャート(その2)である。
【図8】実施形態に示す積和演算回路が構成されるFPGAの全体ブロック図である。
【図9】本実施形態のFPGAを設計する装置の構成図である。
【図10】配置動作を示す動作フローチャートである。
【図11】回路処理速度データベースのデータ構成図である。
【図12】従来の積和演算方式の説明図である。
【符号の説明】
【0067】
101 積和演算回路
102〜107 乗算器
108〜112,116 加算器
113 12進カウンタ(レイテンシカウンタ)
114 22進カウンタ
115 セレクタ
117 論理回路
901 FPGA設計装置
902 入力手段
903 配置手段
904 FPGA
【特許請求の範囲】
【請求項1】
複数の演算回路を並列処理させることにより積和演算を行う積和演算回路であって、
所定行分を並列入力としたデータを並列演算処理する並列演算手段と、
前記並列演算手段に並列入力される行数に対応したレイテンシを有し、前記並列演算手段の演算結果を積算する積算手段と、
を含むことを特徴とする積和演算回路。
【請求項2】
前記積算手段は、前記並列演算手段に並列入力される行数と同じレイテンシである、
ことを特徴とする請求項1に記載の積和演算回路。
【請求項3】
複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行う設計装置であって、
対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段を含む、
ことを特徴とする設計装置。
【請求項4】
前記配置手段は、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路の配置指示を行う、
ことを特徴とする請求項3に記載の設計装置。
【請求項5】
コンピュータに、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行わせる設計プログラムであって、
前記コンピュータを、
対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段
として機能させることを特徴とする設計プログラム。
【請求項6】
前記配置手段は、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する、
ことを特徴とする請求項5に記載の設計プログラム。
【請求項1】
複数の演算回路を並列処理させることにより積和演算を行う積和演算回路であって、
所定行分を並列入力としたデータを並列演算処理する並列演算手段と、
前記並列演算手段に並列入力される行数に対応したレイテンシを有し、前記並列演算手段の演算結果を積算する積算手段と、
を含むことを特徴とする積和演算回路。
【請求項2】
前記積算手段は、前記並列演算手段に並列入力される行数と同じレイテンシである、
ことを特徴とする請求項1に記載の積和演算回路。
【請求項3】
複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行う設計装置であって、
対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段を含む、
ことを特徴とする設計装置。
【請求項4】
前記配置手段は、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路の配置指示を行う、
ことを特徴とする請求項3に記載の設計装置。
【請求項5】
コンピュータに、複数の演算回路を並列処理させることにより積和演算を行う積和演算回路をフイールド・プログラマブル・ロジツクアレイに配置指示を行わせる設計プログラムであって、
前記コンピュータを、
対象のフイールド・プログラマブル・ロジツクアレイに対し、並列処理された演算結果を加算する積算器のレイテンシを元に求められる所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する指示を行う配置手段
として機能させることを特徴とする設計プログラム。
【請求項6】
前記配置手段は、並列処理された演算結果を加算する積算器のレイテンシと同じ所定行分を1ブロックとしたデータを並列演算処理する並列演算回路を配置する、
ことを特徴とする請求項5に記載の設計プログラム。
【図9】
【図10】
【図11】
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図12】
【図10】
【図11】
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図12】
【公開番号】特開2009−245381(P2009−245381A)
【公開日】平成21年10月22日(2009.10.22)
【国際特許分類】
【出願番号】特願2008−93985(P2008−93985)
【出願日】平成20年3月31日(2008.3.31)
【出願人】(000005223)富士通株式会社 (25,993)
【出願人】(000237156)株式会社富士通アドバンストエンジニアリング (100)
【Fターム(参考)】
【公開日】平成21年10月22日(2009.10.22)
【国際特許分類】
【出願日】平成20年3月31日(2008.3.31)
【出願人】(000005223)富士通株式会社 (25,993)
【出願人】(000237156)株式会社富士通アドバンストエンジニアリング (100)
【Fターム(参考)】
[ Back to top ]