【実施例1】
【0012】
実施例1における、後に説明するシミュレーション装置10は、CG法を使ったシミュレーションを実行する。CG法は、SpMVの反復演算により、一次方程式の解を求める手法である。
【0013】
なお、以下において、行列、ベクトル及び配列の各インデックスは0から始まるものとする。また、行列Mの行インデックスがi、列インデックスがjである要素をM
ijと表記する場合がある。また、ベクトルvのインデックスがiである要素をv
iと表記する場合がある。また、配列array[]のインデックスがiである要素をarray[i]と表記する場合がある。
【0014】
また、行列の行方向は、行インデックスが増加していく方向であり、右方向と同意であることとする。行列の列方向は、列インデックスが増加していく方向であり、下方向と同意であることとする。
【0015】
ここで、例として、シミュレーション装置10がCG法を用いてn元の一次方程式の解を求める場合の処理の流れを説明する。このとき、シミュレーション装置10は、n×nの行列A及び要素数nのベクトルyから、行列Aとの積がベクトルyとなるようなベクトルxを求める。なお、以下において、行列Aのような行列を係数行列と表記し、ベクトルxのようなベクトルを解ベクトルと表記し、ベクトルyのようなベクトルを定数ベクトルと表記する場合がある。また、係数行列及び定数ベクトルは既知であるが、解ベクトルの真値は未知である。
【0016】
まず、シミュレーション装置10は、ベクトルxに任意の初期値を設定し、行列Aとベクトルxの積の計算、すなわちSpMVを実行する。そして、シミュレーション装置10は、行列AとベクトルxのSpMVの結果として得られるベクトルy´とベクトルyとの残差から計算した勾配を基に、ベクトルy´がベクトルyに近付くようにベクトルxを更新する。
【0017】
さらに、シミュレーション装置10は、行列Aと更新したベクトルxとのSpMVを実行する。その後、シミュレーション装置10は、SpMV及びベクトルxの更新を所定の条件が満たされるまで繰り返し、そのときのベクトルxを一次方程式の解又は近似解として得ることができる。
【0018】
CG法を使って製品の設計に関するシミュレーションを行う場合、係数行列は疎行列である場合がある。疎行列とは、行列の要素の多くが0の行列である。ここで、
図1を用いて、疎行列のSpMVについて説明する。
図1は、SpMVの一例を示す図である。
図1に示すように、行列Aは疎行列である。このとき、ベクトルyの要素y
0は(1)式で計算される。
【0019】
y
0=a
00×x
0+0×x
1+0×x
2+a
03×x
3+0×x
4 ・・・(1)
【0020】
ここで、(1)式の第2項、第3項及び第5項は必ず0になる。このため、プロセッサは(1)式の計算を行う場合、ベクトルxの要素x
1、x
2及びx
4を参照する必要はない。
【0021】
しかしながら、CPUやGPU(Graphics Processing Unit)等のプロセッサはメモリからのバースト転送によってデータを取得する。このため、例えばCPUが1回の転送サイクルでメモリから取得可能なデータは、連続する一定量のデータに限られる。
【0022】
ここで、1回の転送サイクルで取得可能なデータがベクトルxの連続する3要素分であるCPUが(1)式の計算を行う場合を考える。また、このとき、ベクトルxの各要素はインデックスの順に連続してメモリに格納されているものとする。
【0023】
この場合、CPUは、まず、a
00×x
0を計算するために、1回目の転送サイクルでx
0を取得する。そして、CPUは、a
03×x
3を計算するために、2回目の転送サイクルでx
3を取得する。このように、CPUは、(1)式を計算するために、少なくとも2回の転送サイクルを要する。
【0024】
仮に、CPUがベクトルxから取得する要素がx
0、x
1のように連続したものであれば、CPUは1回の転送サイクルで必要な要素を取得することができることになる。逆に、取得するベクトルの要素に連続性がない場合、すなわちベクトルへのアクセスがランダムな場合は、必要な転送サイクルが増加し、その結果SpMVの演算速度が低下する。
【0025】
さらに、シミュレーションで用いられる一次方程式の元の数は数百万から1千万を超える大きな数になる場合がある。そのような場合、係数行列や解ベクトルのサイズは非常に大きくなり、取得するベクトルの要素に連続性がないことによるSpMVの演算速度への影響も大きくなる。
【0026】
また、疎行列は、圧縮した形式で表される場合がある。疎行列の圧縮形式の1つにCSR形式がある。
図2は、CSR形式の一例を示す図である。
図2に示すようにCSR形式の疎行列は、row_off、col、valの3つの配列で表される。
【0027】
配列valには、疎行列の0でない要素(非零要素)が、疎行列における行インデックスが小さい順に格納される。また、行インデックスが同じ非零要素については、列インデックスが小さいものが配列valにおいて先の順番になる。
【0028】
また、配列colには、配列valに格納された各非零要素の対応する位置に、各非零要素の列インデックスが格納される。また、配列row_offには、配列colのインデックスであって、疎行列の各行の非零要素のうち最も列インデックスが小さい非零要素の列インデックスが格納されたインデックスが、当該非零要素の行インデックスが小さい順に格納される。
【0029】
ここで、例えば、
図1の行列Aの要素a
00の行インデックス及び列インデックスは、いずれも0である。また、配列valにおける要素a
00のインデックスは0である。このため配列colのインデックス0の要素は0である。また、配列colのインデックスであって、疎行列の1行目(行インデックスが0の行)の非零要素のうち最も列インデックスが小さい非零要素であるa
00の列インデックスが格納されたインデックスは0である。このため、配列row_offのインデックス0の要素は0である。
【0030】
また、例えば、
図1の行列Aの要素a
30の行インデックス及び列インデックスは、それぞれ3及び0である。また、配列valにおける要素a
30のインデックスは6である。このため配列colのインデックス6の要素は0である。また、配列colのインデックスであって、疎行列の4行目(行インデックスが3の行)の非零要素のうち最も列インデックスが小さい非零要素であるa
30の列インデックスが格納されたインデックスは6である。このため、配列row_offのインデックス3の要素は6である。
【0031】
図3の疑似コードを用いて、
図1の行列AがCSR形式で表されている場合の、CPUによるSpMVの処理について説明する。
図3は、SpMVの処理の一例を示す図である。
図3のiは、ベクトルyの要素のインデックスに対応している。また、jは、ベクトルxのインデックスに対応している。また、x[]及びy[]は、それぞれベクトルx及びベクトルyを格納した配列である。
【0032】
例えば、
図2に示すように、row_off[0]は0であり、row_off[1]は2である。また、col[0]は0であり、col[1]は3である。このため、
図3の3行目及び4行目に示すように、i=0の場合、CPUは、x[0]及びx[3]を取得し、取得したx[]の各要素と対応するval[]の要素との積をy[0]に足していく。つまり、i=0の場合、CPUは、(1)式の計算を行うことになる。この場合、取得するx[]の要素が連続でないことの影響を受けて、SpMVの演算速度が低下する。
【0033】
実施例1のSpMV装置10eは、CG法によるシミュレーションを行う際の疎行列の転送を最小限に抑えつつ、ベクトルへのアクセスが連続でないことによるSpMVの演算速度の低下を抑制することを目的とするものである。
【0034】
[機能ブロック]
次に、本実施例における疎行列ベクトル積演算装置10bを有するシミュレーション装置10の一例について、
図4を用いて説明する。
図4は、実施例1におけるシミュレーション装置の一例を示す図である。
図4に示すように、本実施例におけるシミュレーション装置10は、共役勾配法制御装置10aと、疎行列ベクトル積演算装置10bとを有する。共役勾配法制御装置10aは、例えばCPUによって実現される。一方、疎行列ベクトル積演算装置10bは、例えばFPGA(Field Programmable Gate Array)によって実現される。
【0035】
共役勾配法制御装置10aは、変換部11及び更新部12を有する。また、疎行列ベクトル積演算装置10bは、演算データ記憶部13、前処理制御部14、前処理部15及び加速部16を有する。
【0036】
共役勾配法制御装置10aは、CG法の制御を行う。具体的には、共役勾配法制御装置10aは、ユーザから入力された設定等を基にCG法の実行し、その際、疎行列ベクトル積演算装置10bにSpMVを実行させる。なお、SpMVにおける係数行列に対する前処理は、疎行列ベクトル積演算装置10bによって行われる。
【0037】
変換部11は、SpMVで用いられる疎行列である係数行列を列指向形式で圧縮する。例えば、変換部11は、無圧縮又はCSR等の行指向形式で表された係数行列を、列指向形式であるCSC(Compressed Sparse Column format)形式、ELL(Ellpack-Itpack generalized diagonal format)形式、JAD形式等に変換する。
【0038】
図5は、ELL形式及びJAD形式の一例を示す図である。
図5に示すように、変換部11は、行列AをELL形式に変換する場合、行列Aの非零要素を左側に詰めた行列を仮定し、仮定した行列の列単位で要素を取得し、配列に格納していく。また、行列AをJAD形式に変換する場合、変換部11は、仮定した行列の行を要素数の順でソートした上で、ELL形式と同様に要素を配列に格納していく。
【0039】
本実施例、変換部11は、行列AをJAD形式に変換し、変換した係数行列を、演算データとして疎行列ベクトル積演算装置10bの演算データ記憶部13に格納するものとする。また、このとき、変換部11は、係数行列とともに、初期値を設定した解ベクトルを演算データ記憶部13に格納し、疎行列ベクトル積演算装置10bにSpMVを実行させる。
【0040】
図6は、実施例1における演算データの一例を示す図である。
図6に示すようにJAD形式の係数行列である演算データは、colind、value、jdptr及びpermの4つの配列で表される。
【0041】
ここで、変換部11によるJAD形式の各配列の作成方法の一例を説明する。まず、変換部11は、行列Aの行インデックスを、各行の要素数順に配列permに格納する。次に、変換部11は、配列permに格納した行インデックスの順序に従って行列Aの行をフォーカスしていき、各行の配列valueに格納されていない要素のうち、最も左側にある要素を配列valueに格納する。変換部11は、フォーカスしている行の配列valueに要素を格納した場合、又はフォーカスしている行に格納する要素が存在しない場合は次の行に進む。
【0042】
さらに、変換部11は、配列valueに格納した要素の列インデックスを配列colindの対応する位置に格納する。また、変換部11は、配列permに格納した行インデックスの順序が最初である行の要素の配列valueにおける格納先のインデックスを配列jdptrに格納していく。
【0043】
更新部12は、CG法の手順に従い、疎行列ベクトル積演算装置10bによるSpMVの結果を基に解ベクトルを更新する。ここで、疎行列ベクトル積演算装置10bは、SpMVの結果として得られる定数ベクトルの計算値を演算データ記憶部13に格納するものとする。また、更新部12は、更新した解ベクトルをさらに演算データ記憶部13に格納し、疎行列ベクトル積演算装置10bにSpMVを実行させることができる。
【0044】
演算データ記憶部13は、共役勾配法の制御を行う共役勾配法制御装置10aから入力された演算データであって、係数行列との積を計算可能な解ベクトルと、列指向形式で圧縮された係数行列とを含む演算データを記憶する。なお、係数行列は疎行列である。例えば、演算データ記憶部13は、ELL形式又はJAD形式で圧縮された係数行列を記憶することができる。ただし、本実施例では、演算データ記憶部13は、JAD形式で圧縮された係数行列を記憶するものとする。
【0045】
前処理部15は、予め設定された演算データに対する複数の前処理のそれぞれに対応した処理部を備え、指定された前処理に対応する処理部を用いて前処理を実行する。前処理制御部14は、共役勾配法制御装置10aによって指定された前処理を、前処理部15に対して指定する。なお、共役勾配法制御装置10aへの前処理の指定は、ユーザによって行われてもよい。
【0046】
図7を用いて、前処理部15について説明する。
図7は、実施例1における前処理部の一例を示す図である。
図7に示すように、前処理部15は、対角スケーリング処理部151と、SSOR処理部152と、ILU処理部153と、AMG処理部154とを有する。
【0047】
対角スケーリング処理部151は、対角スケーリングによる前処理を行う。SSOR処理部152は、SSOR(Symmetric Successive Over-relaxation)による前処理を行う。ILU処理部153は、ILU(Incomplete LU Factorization)(0)、ILU(1)等による前処理を行う。AMG処理部154は、AMG(Algebraic Multigrid)による前処理を行う。なお、前処理部15に備えられる処理部は、
図7に示すものに限られない。前処理部15は、行列に対する前処理を行う処理部を複数有していればよい。
【0048】
前処理部15に含まれる各処理部は、回路の接続先の変更等により、再構成可能に配置されている。例えば、前処理制御部14によって指定された前処理が対角スケーリングであった場合、前処理部15は、演算データ記憶部13と対角スケーリング処理部151との接続を有効にする。また、そのとき、前処理部15は、演算データ記憶部13と、SSOR処理部152、ILU処理部153及びAMG処理部154との接続を無効にする。
【0049】
加速部16は、SpMVを実行する。また、加速部16によるSpMVの実行結果は、演算データ記憶部13に記憶される。なお、演算の結果は、例えば、定数ベクトルの計算値である。また、加速部16は、CG法を高速化するように構成されている。
【0050】
ここで、前処理部15は、加速部16によるSpMVが完了するたびに前処理を実行することができる。また、加速部16は、前処理部15による前処理が完了するたびにSpMVを実行する。これにより、疎行列ベクトル積演算装置10bは、前処理及びSpMVを反復して行うことができる。
【0051】
その際、共役勾配法制御装置10aは、所定のタイミングで疎行列ベクトル積演算装置10bによる反復処理に割り込みを行い、定数ベクトルの計算値を取得する。共役勾配法制御装置10aは、取得した計算値と真値との残差から計算した勾配を基に、演算データ記憶部13に記憶された解ベクトルを更新する。
【0052】
図8を用いて、加速部16について説明する。
図8は、実施例1における加速部の一例を示す図である。
図8に示すように、加速部16は、ロード部161、割当部162及び複数の演算部163を有する。また、加速部16は、演算データ記憶部13と接続されている。また、ロード部161は、読込部161a及び書込部161bを有する。
【0053】
読込部161aは、演算データ記憶部13から解ベクトル及び係数行列を読み込む。割当部162は、演算部163のそれぞれに、演算に必要なデータを割り当てる。演算部163は、読込部161aによって読み込まれた解ベクトル及び係数行列を用いてSpMVを実行する。書込部161bは、演算部163による演算の結果を演算データ記憶部13に書き込む。
【0054】
具体的には、割当部162は、解ベクトルの要素と、解ベクトルの要素に対応する係数行列の要素とを、複数の演算部163のうちの当該係数行列の要素の行と予め対応付けられた演算部163に割り当てる。演算部163は、解ベクトルの要素及び係数行列の要素が割り当てられた場合、割り当てられた解ベクトルの要素と係数行列の要素との積及び積の和を求める演算を実行する。
【0055】
ここで、演算データが
図6に示すものである場合の例を挙げて、加速部16の処理について説明する。演算データ記憶部13は、解ベクトルであるベクトルxの要素を記憶する。また、演算データ記憶部13は、係数行列である行列Aの要素を格納した配列valueと、行列Aの要素の列を特定する配列colindと、行列Aの要素の行を特定する配列jdptr及び配列permとを少なくとも記憶する。各配列の内容は、
図6に示す通りである。
【0056】
なお、ベクトルxの要素は、第1の要素の一例である。また、行列Aの要素は、第2の要素の一例である。また、配列valueは、第1のデータの一例である。また、配列colindは、第2のデータの一例である。また、配列jdptr及び配列permは、第3のデータの一例である。
【0057】
また、演算データ記憶部13は、少なくとも演算部163の数と同数のポートを備えているものとする。また、演算部163のそれぞれには、行列Aの行のいずれかが予め対応付けられているものとする。なお、行列Aの各行は、定数ベクトルであるベクトルyの各要素に対応している。また、演算部163のそれぞれは、演算データ記憶部13に備えられたポートのいずれかに対応しているものとする。
【0058】
図9の疑似コードを用いて、加速部16によるSpMVの処理について説明する。
図9は、実施例1におけるSpMVの処理の一例を示す図である。
図9のrho_maxは、配列jdptrのインデックスの最大値である。また、x[]及びy[]は、それぞれベクトルx及びベクトルyを格納した配列である。
【0059】
例えば、jが0かつiがjdptr[0]すなわち0である場合、
図9に示すように、読込部161aは、まずjdptr[0]、perm[0]、value[0]及びcolind[0]を読み込む。さらに、colind[0]は0なので、読込部161aは、バースト転送により、x[0]、x[1]及びx[2]を読み込む。そして、割当部162は、jdptr[0]、perm[0]、value[0]、colind[0]及びx[0]を対応する演算部163に割り当てる。このとき、演算部163は、y[perm[0]]にvalue[0]*x[0]を足す。
【0060】
次に、jが0のままiが1になった場合、読込部161aは、jdptr[0]、perm[0]、value[1]及びcolind[1]を読み込む。また、colind[1]は0であり、x[0]は読み込み済みであるため、読込部161aは、ここではx[0]を読み込まない。そして、割当部162は、jdptr[0]、perm[0]、value[1]、colind[1]及びx[0]を対応する演算部163に割り当てる。ここで、perm[0]=3なので、演算部163は、y[3]にvalue[1]*x[0]を足す。
【0061】
さらに処理が進み、jが1かつiがjdptr[1]、すなわち5になった場合、読込部161aは、jdptr[1]、perm[1]、value[5]及びcolind[5]を読み込む。また、colind[5]は1であり、x[1]は読み込み済みであるため、読込部161aは、ここではx[1]を読み込まない。そして、割当部162は、jdptr[1]、perm[1]、value[5]、colind[5]及びx[1]を対応する演算部163に割り当てる。ここで、perm[1]=1なので、演算部163は、y[1]にvalue[5]*x[1]を足す。
【0062】
さらに処理が進み、jが2かつiがjdptr[2]、すなわち10になった場合、読込部161aは、jdptr[2]、perm[2]、value[10]及びcolind[10]を読み込む。また、colind[10]は2であり、x[2]は読み込み済みであるため、読込部161aは、ここではx[2]を読み込まない。そして、割当部162は、jdptr[2]、perm[2]、value[10]、colind[10]及びx[2]を対応する演算部163に割り当てる。ここで、perm[2]=2なので、演算部163は、y[2]にvalue[10]*x[2]を足す。
【0063】
さらに処理が進み、jが2かつiがjdptr[2]+1、すなわち11になった場合、読込部161aは、value[11]及びcolind[11]を読み込む。また、colind[11]は3であり、x[3]は読み込み済みでないため、読込部161aは、ここでバースト転送により、x[3]、x[4]及びx[5]を読み込む。そして、割当部162は、jdptr[2]、perm[2]、value[11]、colind[11]及びx[3]を対応する演算部163に割り当てる。ここで、perm[2]=2なので、このとき、演算部163は、y[2]にvalue[11]*x[3]を足す。
【0064】
このように、加速部16は、連続的に読み込んだx[]の要素を使ってSpMVの演算を行うことができるため、ランダムアクセスを緩和し、CG法を高速化することができる。なお、1回の転送サイクルで読み取り取得可能な連続したx[]の要素を3つまでとし、演算データが
図2のようなCRS形式である場合、x[]の要素の読み取りには、少なくとも8回の転送サイクルが必要になる。一方、1回の転送サイクルで読み取り取得可能な連続したx[]の要素を3つまでとし、演算データが
図6のようなJAD形式である場合、x[]の要素の読み取りに必要な転送サイクルは2回である。
【0065】
割当部162は、配列valueに格納された行列Aの要素と、配列colindによって特定される当該行列Aの要素の列に対応したベクトルxの要素とを、配列jdptr及び配列permとともに演算部163に割り当てる。これにより、演算部163は、行列Aの各要素の、JAD形式におけるソート前の行インデックスを特定することができる。
【0066】
図10を用いて、演算部163について説明する。
図10は、実施例1における演算部の一例を示す図である。
図10に示すように、演算部163は、マルチポートメモリ163a、複数の乗算器163b及び複数の乗算器163bのそれぞれと接続された複数の加算器163cを有する。また、演算部163は、マルチポートメモリ163a及び複数の加算器163cのそれぞれと接続された複数のパイプラインレジスタ163dを有する。
【0067】
マルチポートメモリ163aは、複数の書き込みポートと、複数の書き込みポートのそれぞれに対応した読み取りポートとを備え、部分和を係数行列の行と対応付けて記憶する。
【0068】
マルチポートメモリ163aは、書き込みポート1w、2w、3w及び4wを有する。また、マルチポートメモリ163aは、読み取りポート1r、2r、3r及び4rを有する。書き込みポート1w、2w、3w及び4wは、それぞれ読み取りポート1r、2r、3r及び4rと対応している。なお、乗算器163b、加算器163c、パイプラインレジスタ163d、書き込みポート及び読み取りポートの数は
図10に示すものに限られない。
【0069】
乗算器163bは、ベクトルxの要素と行列Aの要素とを乗じた値を出力する。加算器163cは、複数の書き込みポートのうちのいずれかの書き込みポート及び当該書き込みポートに対応した読み取りポートと接続されている。加算器163cは、乗算器163bによって出力された値と、読み取りポートから読み取った第2の要素の行に対応する部分和とを足した値を書き込みポートからマルチポートメモリ163aに書き込む。
【0070】
演算部163は、複数の乗算器163b、加算器163c、書き込みポート及び読み取りポートの組み合わせを用いて、ベクトルyの部分和の計算を並列して実行することができる。このため、割当部162は、各演算部163にベクトルyの要素を担当要素として設定しておき、各担当要素の演算データを各演算部163に割り当てていくことができる。
【0071】
[処理の流れ]
次に、本実施例における処理について、
図11を用いて説明する。
図11は、実施例1におけるCG法による処理の一例を示すフローチャートである。まず、共役勾配法制御装置10aの変換部11は、係数行列を圧縮し列指向形式に変換する(ステップS10)。また、変換部11は、変換した係数行列を疎行列ベクトル積演算装置10bの演算データ記憶部13に格納する。
【0072】
次に、疎行列ベクトル積演算装置10bの前処理部15は、演算データ記憶部13から疎行列を取得し、前処理を実行する(ステップS20)。このとき、前処理部15は、前処理制御部14から指定された前処理を実行するために予め各処理部の再構成を行っておく。また、前処理部15は、前処理済みの演算データを演算データ記憶部13に格納する。
【0073】
次に、加速部16は、SpMVを実行する(ステップS30)。なお、加速部16によるSpMVの実行については後に説明する。ここで、予め設定されたCG法の終了条件が充足されていない場合(ステップS40:No)、疎行列ベクトル積演算装置10bは、S20に戻って処理を繰り返す。一方、予め設定されたCG法の終了条件が充足されている場合(ステップS40:Yes)、共役勾配法制御装置10a及び疎行列ベクトル積演算装置10bは処理を終了する。例えば、終了条件終了条件は、所定の回数だけ反復が行われたことであってもよいし、定数ベクトルの残差が収束したことであってもよい。
【0074】
図12を用いて、疎行列ベクトル積演算装置10bによるSpMVの処理について説明する。
図12は、実施例1におけるSpMVの処理の一例を示すフローチャートである。まず、加速部16の読込部161aは、演算データ記憶部13から演算データを読み込む(ステップS310)。演算データには、列指向形式で表された係数行列及び解ベクトルの各要素が含まれる。
【0075】
次に、割当部162は、演算データを各演算部163に割り当てる(ステップS320)。そして、演算部163は、割り当てられた演算データを使って演算を実行する(ステップS330)。なお、演算部163による演算処理については後に説明する。
【0076】
ここで、演算データ記憶部13に未読み込みの演算データがある場合(ステップS340:Yes)、読込部161aは、S310に戻って処理を繰り返す。一方、演算データ記憶部13に未読み込みの演算データがない場合(ステップS340:No)、疎行列ベクトル積演算装置10bは処理を終了する。
【0077】
図13を用いて、演算部163による演算処理について説明する。
図13は、実施例1における演算処理の一例を示すフローチャートである。ここで、係数行列はJAD形式で表されているものとする。まず、演算部163には、演算データとして、value[i]、x[colind[i]]、jdptr、permが入力される(ステップS331)。このとき、value[i]及びx[colind[i]]は乗算器163bへ入力される。また、jdptr及びpermは、パイプラインレジスタ163dへ入力される。
【0078】
ここで、加算器163cは、パイプラインレジスタ163dに入力されたjdptr及びpermに従って、マルチポートメモリ163aの読み取りポートのいずれかからy[perm[j]]を読み取る(ステップS332)。次に、加算器163cは、y[perm[j]]に、value[i]*x[colind[i]]を足しこむ(ステップS333)。そして、加算器163cは、パイプラインレジスタ163dに入力されたjdptr及びpermに従って、y[perm[j]]を読み取った読み取りポートに対応する書き込みポートからy[perm[j]]を書き込む(ステップS334)。
【0079】
[効果]
以上説明したように、本実施例における疎行列ベクトル積演算装置の演算データ記憶部は、共役勾配法の制御を行う共役勾配法制御装置から入力された演算データを記憶する。演算データは、疎行列との積を計算可能なベクトルと、列指向形式で圧縮された疎行列とを含む。疎行列ベクトル積演算装置は、演算データ記憶部からベクトル及び疎行列を読み込む。疎行列ベクトル積演算装置は、読み込まれたベクトル及び疎行列を用いて疎行列ベクトル積の演算を実行する。疎行列ベクトル積演算装置は、演算の結果を演算データ記憶部に書き込む。このように、疎行列ベクトル積演算装置は、共役勾配法制御装置から演算データ記憶部に係数行列が入力された後は、当該疎行列の装置間の転送を行うことなくSpMVを反復して行うことができる。このため、疎行列ベクトル積演算装置は、CG法を高速化することができる。
【0080】
また、疎行列ベクトル積演算装置は、ベクトルの要素である第1の要素と、第1の要素に対応する疎行列の非零の要素である第2の要素とを、複数の演算部のうちの第2の要素の行と予め対応付けられた演算部に割り当てる。演算部は、第1の要素及び第2の要素が割り当てられた場合、第1の要素と第2の要素との積及び積の和を求める演算を実行する。これにより、疎行列ベクトル積演算装置は、列指向形式で表された係数行列を使ったSpMVを実行することができる。
【0081】
また、演算データ記憶部は、演算データとして、第2の要素を格納した第1のデータと、第2の要素の列を特定する第2のデータと、第2の要素の行を特定する第3のデータとを少なくとも記憶してもよい。疎行列ベクトル積演算装置は、第1のデータに格納された第2の要素と、第2のデータによって特定される当該第2の要素の列に対応したベクトルの要素とを、第3のデータとともに演算部に割り当てる。これにより、疎行列ベクトル積演算装置は、係数行列を配列として扱うことができる。
【0082】
演算部のマルチポートメモリは、複数の書き込みポートと、複数の書き込みポートのそれぞれに対応した読み取りポートとを備え、部分和を疎行列の行と対応付けて記憶する。複数の乗算器は、第1の要素と第2の要素とを乗じた値を出力する。複数の加算器は、複数の書き込みポートのうちのいずれかの書き込みポート及び当該書き込みポートに対応した読み取りポートと接続され、乗算器によって出力された値と、読み取りポートから読み取った第2の要素の行に対応する部分和とを足した値を書き込みポートからマルチポートメモリに書き込む。これにより、疎行列ベクトル積演算装置は、各演算部の内部でさらに並列計算を行うことができる。
【0083】
演算データ記憶部は、少なくとも演算部の数と同数のポートを備えていてもよい。これにより、疎行列ベクトル積演算装置は、演算部ごとの演算データの並列した読み取り、及びSpMVの並列処理を行うことができる。
【0084】
演算データ記憶部は、ELL形式又はJAD形式で圧縮された疎行列を記憶してもよい。これにより、疎行列ベクトル積演算装置は、列指向形式で表された係数行列を得ることができる。
【0085】
前処理部は、予め設定された演算データに対する複数の前処理のそれぞれに対応した処理部を備え、指定された前処理に対応する処理部を用いて前処理を実行してもよい。前処理制御部は、共役勾配法制御装置によって指定された前処理を、前処理部に対して指定する。これにより、ユーザが共役勾配法制御装置に対して指定した前処理を、疎行列ベクトル積演算装置に実行させることができる。
【0086】
前処理部は、演算部による疎行列ベクトル積の演算が完了するたびに前処理を実行してもよい。演算部は、前処理部による前処理が完了するたびに疎行列ベクトル積の演算を実行する。これにより、疎行列ベクトル積演算装置は、演算データの装置間での転送をともなうことなく、SpMVの反復を行うことができる。
【0087】
[システム]
また、各実施例において説明した各処理のうち、自動的に行われるものとして説明した処理の一部を手動的に行うこともできる。あるいは、手動的に行われるものとして説明した処理の全部又は一部を公知の方法で自動的に行うこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【0088】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散や統合の具体的形態は図示のものに限られない。つまり、その全部又は一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。例えば、
図4に示す前処理部15と加速部16とを統合してもよい。さらに、各装置にて行われる各処理機能は、その全部又は任意の一部が、所定のプロセッサ(CPU、GPU,FPGA等)及び当該プロセッサにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【0089】
[ハードウェア構成]
図14は、ハードウェア構成例を示す図である。
図14に示すように、シミュレーション装置10は、通信インタフェース50a、HDD(Hard Disk Drive)50b、メモリ50c、CPU10d及びFPGA50eを有する。
【0090】
通信インタフェース50aは、他の装置の通信を制御するネットワークインタフェースカードなどである。HDD50bは、プログラムやデータなどを記憶する記憶装置の一例である。メモリ50cの一例としては、SDRAM(Synchronous Dynamic Random Access Memory)等のRAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ等が挙げられる。CPU50dは、共役勾配法制御装置10aとして機能する。また、FPGA50eは、疎行列ベクトル積演算装置10bとして機能する。