JP3983188B2 - 共有メモリ型スカラ並列計算機用逆行列の並列処理方法 - Google Patents
共有メモリ型スカラ並列計算機用逆行列の並列処理方法 Download PDFInfo
- Publication number
- JP3983188B2 JP3983188B2 JP2003074548A JP2003074548A JP3983188B2 JP 3983188 B2 JP3983188 B2 JP 3983188B2 JP 2003074548 A JP2003074548 A JP 2003074548A JP 2003074548 A JP2003074548 A JP 2003074548A JP 3983188 B2 JP3983188 B2 JP 3983188B2
- Authority
- JP
- Japan
- Prior art keywords
- nbase
- iblk
- block
- blocks
- update
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Images
Landscapes
- Complex Calculations (AREA)
Description
【発明の属する技術分野】
本発明は、共有メモリ型スカラ並列計算機における演算処理に関する。
【0002】
【従来の技術】
従来、ベクトル計算機では、ある行列の逆行列を求める場合、Gauss−Jordanの方法をベースに、メモリアクセス系の動作が速いことを利用した計算方法を用いて行っていた。例えば、ループ内の命令を複数回分明示的に記述する2重アンローリング等の手法が用いられていた。
【0003】
Gauss−Jordanの方法(あるいは、単にGauss法)による逆行列を求める方法を以下に説明する(なお、以下の説明ではピボットの入れ替えは省略するが実際には、ピボットの入れ替えのため行ベクトルの入れ替えを行っている。
まず、Aを逆行列を求めるべき行列、x、yは、適当な列ベクトルとする。
Ax=yは、行列要素をあらわに記載すると以下のような連立一次方程式となる。
a11x1+a12x2+・・・+a1nxn=y1
a21x1+a22x2+・・・+a2nxn=y2
・・・・・・・・・・・
an1x1+an2x2+・・・+annxn=yn
上記方程式を、By=xという形に変形すると、BがAの逆行列となって、逆行列が求まることになる。
1)1行目の方程式をa11で割る。
2)i行目(i>1)−1行目×ai1を演算する。
3)2行目の方程式のx2の係数を1にするよう、2行目にx2の係数の逆数をかける。
4)i行目(i>2)−2行目×ai2を演算する。
5)以上の演算をn−1行目まで続ける。
【0004】
ピボットの入れ替えに伴う列ベクトルの入れ替えは以下の通りである。
Ax=yの両辺にピボットの入れ替え処理に対応する行列Pをかける。
PAx=Py=z
行列Bについて、以下が成り立つとすると、
x=Bz
Bは、以下のように与えられる。
B=(PA)-1=A-1P-1
つまり、求まったBに右からPをかけることにより、Aの逆行列が求まる。実際には、列ベクトルの入れ替えを行う必要がある。
【0005】
なお、ここで、P=PnPn-1・・・P1であり、Pnは、行列の要素がPii=0、Pij=1、Pjj=0、Pji=1となる直交変換である。
【0006】
【発明が解決しようとする課題】
ベクトル計算機においては、メモリアクセス系の動作速度が速いことを前提として、上記のような方法で逆行列の演算を行っていたが、共有メモリ型スカラ計算機の場合、演算する行列が大きくなるほどに、共有メモリにアクセスする回数が多くなり、アクセス速度の遅い共有メモリへのアクセスによって、計算機の性能が大きく損なわれてしまうという問題がある。そこで、共有メモリ型スカラ計算機の各プロセッサに設けられる、アクセス速度の速いキャッシュメモリを有効に使い上記のような行列計算を行う必要がある。つまり、行列の各行あるいは列毎に演算していると、共有メモリへのアクセスが多くなってしまうので、行列をブロック化して、各プロセッサにキャッシュメモリに格納されたデータを最大限処理した後、共有メモリにアクセスするようにして、共有メモリへのアクセス数を減少する、各プロセッサに局所化したアルゴリズムが必要となる。
【0007】
本発明の課題は、共有メモリ型スカラ計算機において、高速に逆行列の演算が行える演算の並列処理方法を提供することである。
【0008】
【課題を解決するための手段】
本発明の方法は、共有メモリ型スカラ並列計算機用逆行列の並列処理方法であって、逆行列を求めるべき行列内に、所定の正方形ブロックを指定するステップと、該行列を該正方形ブロックを中心として左上、左横、左下、上、下、右上、右横、右下のそれぞれのブロックに分解するステップと、該分解されたそれぞれのブロックをプロセッサの数に応じて分割し、該正方形ブロックと、この下、右横、右下のブロックを並列にLU分解するステップと、左横、上、下、右横のブロックを再帰的プログラムで並列に更新し、左上、左下、右上、右下のブロックを該再帰的プログラムで更新されたブロックを用いて並列に更新を行うステップと、所定の正方形ブロックの更新を複数段に分けて、1つのプロセッサで行うステップと、該正方形ブロックの位置を順次、該行列の対角線上を移動するように設定し、上記ステップを繰り返すことにより該行列の逆行列を求めるステップとを備えることを特徴とする。
【0009】
本発明によれば、逆行列の演算をブロック毎の更新処理とし、各ブロックの更新を複数のプロセッサで並列に行うことにより、プロセッサに対応して設けられるキャッシュに格納されたブロックに対し、最大限演算を行った後に、共有メモリへのアクセスをするようにしているので、アルゴリズムが局所化し、高速な逆行列を求めるための演算が行える。
【0010】
【発明の実施の形態】
本発明の実施形態では、ある行列の逆行列を求めるアルゴリズムを提供する。共有メモリ型スカラ並列計算機では、ロードに対する演算量を増やす必要がある。このため、本発明の実施形態では、行列積の形で演算を効率的に行うブロック化した方法を提供する。更に、行列積を使う更新で必要となる行列部分を大きさの変化する行列積を利用する再帰プログラムで記述することで演算密度を高める。
【0011】
図1は、本発明の実施形態が前提とする共有メモリ型スカラ計算機のハードウェア構成を示した図である。
プロセッサ10−1〜10−nは、1次キャッシュメモリを持っており、この1次キャッシュメモリはプロセッサの中に組み込まれていることもある。また、各プロセッサ10−1〜10−nには、2次キャッシュメモリ13−1〜13−nが設けられ、2次キャッシュメモリ13−1〜13−nが相互結合網12に結合されている。また、相互結合網12には、共有メモリであるメモリモジュール11−1〜11−nが設けられ、プロセッサ10−1〜10−nは、演算に必要なデータをここから読み出し、相互結合網12を介して、2次キャッシュメモリ13−1〜13−nあるいは、1次キャッシュメモリに記憶させて、演算を行う。
【0012】
この場合、メモリモジュール11−1〜11−nから2次キャッシュメモリ13−1〜13−nあるいは1次キャッシュメモリにデータを読み込んだり、2次キャッシュメモリ13−1〜13−n、あるいは、1次キャッシュメモリから演算後のデータをメモリモジュール11−1〜11−nに書き込むのはプロセッサ10−1〜10−nの演算速度に比べて非常に遅い。従って、このような書き込み、読み出しが頻繁に発生すると計算機全体の性能を劣化させてしまう。
【0013】
従って、計算機全体の性能を高く維持するためには、メモリモジュール11−1〜11−nへのアクセスをできるだけ減らし、2次キャッシュメモリ13−1〜13−n、1次キャッシュメモリ、及びプロセッサ10−1〜10−nからなるローカルな系においてできるだけ多くの演算をしてしまうようなアルゴリズムが必要となる。
【0014】
したがって、本願発明の実施形態においては、以下のようにして逆行列の計算を行う。
演算すべき行列内のあるブロック幅のブロックに関して右方向の更新のみを行う。こうすることで、ブロックの外での更新で使う情報を残すようにする。つまり、消去の過程で本来機軸として選んだ列ベクトルと直交する行ベクトルの外積で残りの部分を更新することが従来の技術で説明したGauss−Jordanの方法において行われることが分かる。すなわち、前述のGauss−Jordanの方法の2)の方法をあらわに書くと、
aij−c1j×ai1となっている(i、j>1:c1j=a1j/a11)。
【0015】
この式の意味するところは、1列目の列ベクトルを機軸として選んで、これと直交する1行目の行ベクトルを選択すると、これらを除いた2行目以降×2列目以降からなる行列は、1列目の列ベクトルと1行目の行ベクトルの外積で更新されるということである。
【0016】
また、Ax=yをIを単位行列として書き直すと、Ax=Iyとなり、AをGauss−Jordan法によって変換した場合、右辺の単位行列も変換を受ける。
【0017】
この単位行列の更新においては、Aにおいて消去された列に対応する列の(i、i)要素は、右辺の行列においては1/aiiとなり、右辺の行列の他の要素は、Aの消去された列ベクトルの要素に1/aiiをかけて−1を乗じた数となる。また、列ブロック行列でも左側の消去が必要になる。
【0018】
図2〜図8は、本発明の実施形態の計算順序を説明する図である。
計算の順序は、次のようになる。
まず、図2において、行列Mを列ブロック行列毎に左からブロック化して、上で述べた方法で更新を行う。
1)EとHをLU分解する(特願平12―358232号参照)。
2)BをEの上三角部分Uを利用してB←BU-1と更新する。
3)Eの下三角部分を利用してD←L-1D及びF←L-1D
4)A、C、G、Iを更新する。
【0019】
A←A−B×D、C←C−B×F、G←G−H×D、I←I−H×F
5)Eの上三角部分の更新を行う。この部分はLU分解では未更新となっているため、このタイミングで更新する。
6)次にD及びFの上部に対する更新をD、Fの情報とEの情報を使って更新する。
【0020】
このとき、演算密度を高めるために再帰的なプログラムで行列積を使って更新する。
a)再帰的プログラム
D及びFの上部の更新は、各々の行ベクトルとEのそれと直交する列ベクトルの外積で計算できる。演算密度を上げるために次のような再帰的プログラムで行う。ここで、D及びFの上部とは、図8で説明するように、D及びFの行ブロックの上の方と言う意味であり、図8から明らかなように、D及びFの更新は、これら行ブロックの上部から行われる。
【0021】
recursive subroutine rowupdate()
if (更新幅<10)then
Eの上三角行列から対角要素を除いた行列と行ブロック行列をかけて差し引く(詳細は、図8の説明参照)
else
c 更新幅を前半と後半に分ける
前半部分を更新する
c 次に後半部分をrowupdateを呼び出して更新する
call rowupdate()
return
end
7)次に対角線上の要素を右下に移動させながら、この対角の左下の列方向の長方形部分を更新する。この結果、B及びHの更新に必要な情報を作り出す。
8)B、Hに関して左側の更新を行う。これは以下のように行う。
【0022】
ブロック幅をdとして、左からi、・・・、i+d−1と番号を振る。
aiiを逆数にする。他の部分はaiiで割って、符号を逆にする。
i+1行の左をai+1,i+1で割り、ai+1,i+1を逆数にする。
【0023】
左部分の更新を左部分のi+1行とi+1列をかけて引くことで行う。
これを繰り返す。
この部分は、更に以下の手順に分かれる。これらも再帰的なアルゴリズムに組み立て直すことが必要となる。
9)最後にEの対角線上の要素から見て左上部分の行方向の長方形部分を更新する。
10)最後に列ベクトルをピボットの入れ替えの履歴の逆方向に入れ替える処理を行う。
5)で更新する部分は図3の斜線部分(E2)を、対角要素を対角線にスライドさせながら
E2=E2−a×bで更新する。
【0024】
この部分はLU分解の処理では未更新である。これを行うことで、D、Fの更新で必要になる上三角行列の情報が得られる。
7)で更新する部分は図4の斜線部分を対角要素をスライドさせながら、E3=E3−c×dで更新する。
【0025】
この更新に先立ち、cは対角要素の逆数をかける。
更新の後の対角要素は元の対角要素の逆数とする。dは、各列要素に更新前の対角要素をかけて、−1をかけたものとする。
【0026】
この結果、B及びHの左方向の更新で必要な下三角行列の情報が得られる。
9)で、図5の斜線の部分を対角要素をスライドさせながら、
E1=E1−a×cで更新する。
【0027】
更新の後のaは、aの列要素に元の対角要素をかけて、−1をかけたものとする。
D)共有メモリ型スカラ並列計算機向けの並列化の詳細
0)E、F、H及びIのLU分解はLU分解の並列化アルゴリズムを利用して並列分解する。
1)ブロック幅の制御
本発明の実施形態では、問題規模及び並列化で使うプロセッサ数に応じて、ブロック幅を調節する機構を備える。
【0028】
ブロックEの更新は一つのプロセッサで行うので、この部分のコストが全体のコストから考えて無視できる程度(1%程度)になるようにブロック幅を決める。
2)Cの4)の更新はおのおのの行列積による更新を並列に行う。各プロセッサで2次元目を均等に分割して計算を並列分担する。
3)Cの5)での更新、つまりD及びFの更新はEの上三角部分を共通に参照して、D及びFの2次元目を均等に分割した領域を各プロセッサが並列に更新する。
4)Cの8)の更新は及びHの1次元目を均等に分割した領域を各プロセッサは並列分担して更新する。
5)最後に、列ベクトルの入れ替え処理は、行列全体の1次元目を均等に分割して、各領域の部分に関する入れ替えを並列に行う。
【0029】
図6の破線は各行列部分を並列に計算する更新を並列に行う領域の分割例を示している。
・BまたはHの更新についてのメモリのアクセス
深さ2まで再帰プログラムが動作した場合を解説する。
【0030】
図7(a)と(b)、(c)と(d)、(e)と(f)が組になっている。
最初に、図7(a)の斜線部分を更新する。このとき斜線部分及び図7(b)の破線三角部分を使う。
【0031】
詳細は、疑似コード参照。次に、図7(a)斜線部分を図7(a)横線部分と図7(b)斜線四角部分を使って更新する。その後、図7(a)横線部分を図7(b)太線三角部分を使って更新する。
【0032】
次に、図7(c)斜線部分を、図7(c)右白塗り四角と図7(d)太線四角の積で更新する。
その後、図7(e)斜線部分を図7(f)破線三角部分を使い更新する。更に、図7(e)斜線部分を図7(e)横線部分と図7(f)斜線四角の積で更新する。最後に横線部分を図7(f)太線三角部分を使って更新する。
【0033】
上記手順において、Eの参照は共通である。従って、Eは各プロセッサのキャッシュに格納して、参照するようにしても良い。また、例えば、Bの参照・更新は行方向(太線破線で分割)した領域に関して並列に処理する。
【0034】
・DまたはFの更新におけるメモリアクセス
深さ2まで再帰プログラムが動作した場合を解説する。
【0035】
最初に、図8(a)左の斜線部分を更新する。このとき斜線部分及び図8(a)右の破線三角部分を使う。
詳細は、疑似コード参照。次に、図8(a)左の斜線部分を図8(a)右の斜線四角部分と図8(a)左の縦線部分を使って更新する。その後、図8(a)左の横線部分を図8(a)右の太線三角分を使って更新する。
次に、図8(b)左の斜線部分を、図8(b)右の太線四角と図8(b)左の白塗り四角の積で更新する。
その後、図8(c)左の斜線部分を図8(c)右の破線三角部分を使い更新する。更に、図8(c)左の斜線部分を図8(c)右の斜線四角と図8(c)左の縦線部分との積で更新する。最後に図8(c)左の縦線部分を図8(c)右の太線三角部分を使って更新。
【0036】
上記手順において、E参照は共通である。従って、各プロセッサのキャッシュにEを格納して参照するようにしても良い。また、Dの参照・更新は行方向(太線破線で分割)した領域に関して並列に処理する。
【0037】
図9〜図15は、本発明の実施形態の疑似コードである。
図9は、逆行列の並列化アルゴリズムのメインアルゴリズムの疑似コードである。以下の疑似コードで、左端にcと付いている行はコメント行である。array a(k,n)は、逆行列を求めるべき行列の要素を格納する配列である。ip(n)は、LU分解のサブルーチンにおいて、行の入れ替えを行った際の情報が格納される配列である。LU分解のサブルーチンのアルゴリズムは、特願平12−358232号を参照されたい。nbは、LU分解する際に指定するブロックの数を示す。
【0038】
1つの指定ブロックについてのLU分解が終わると、ip(i)がiより大きいとき、行列のi行目をip(i)行目と入れ替える。そして、updateサブルーチンを呼び出して、行列の更新を行う。LU分解からupdateサブルーチンまでの処理は、指定されるブロック全てについて処理し終わるまで繰り返し行う。そして、最後の指定ブロックについては、別途LU分解とupdateをおこなって処理を終了する。
【0039】
図10は、ブロックLU分解の情報を利用して残りの部分の更新を行うルーチンの疑似コードである。
同図の更新ルーチンでは、ブロックA〜Hに従って、それぞれの更新を行う。ブロックA〜D及びGについては、専用のサブルーチンを更に読み出す。ブロックIは、LU分解の際に既に更新されているので、ここでは別途サブルーチンを設けることはしない。
【0040】
ブロックA〜D及びGの更新ルーチンが終了した後、バリア同期を取る。その次に、プロセッサの番号(スレッドの番号)が1の場合に、「eの更新1」を行う。これは、e−update1サブルーチンによって行う。その後、バリア同期を取る。
【0041】
lenは、1つのスレッドが処理するブロックの幅である。isは、処理するブロックの最初の位置であり、ieは、処理するブロックの最後の位置である。df−updateは、ブロックD及びFを更新するサブルーチンである。ブロックD、Fの更新が終わると、ブロックの最初の位置にブロック幅を加えたものを新たなブロックの最初の位置(nbase2)として格納し、lenを新たに計算し、ブロックの最初と最後の位置is2とie2を新たに計算し、df−updateでDとFの更新を行い、バリア同期を取る。
【0042】
更に、「eの更新2」として、スレッドの番号が1の場合に、ブロックEの更新サブルーチンe−update2を呼び出し、バリア同期を取る。上記と同様に、len、is、ieを計算し、ブロックBとHの更新ルーチンbh−updateを呼び出し、その後、nbase2を求めて、len、is2、ie2を求め、再びbh−updateで処理を行い、バリア同期を取る。
【0043】
更に、スレッドの番号が1の時、「eの更新3」として、e−update3で処理を行い、処理後バリア同期を取る。
更に、その後、ピボットの入れ替えたままの状態を元に戻すため、len、is、ieを計算した後、サブルーチンexchangeによって列の入れ替えを行って、バリア同期を取り、スレッドを消去して、処理を終了する。
【0044】
図11は、ブロックBとブロックDの更新サブルーチンの疑似コードである。
ブロックBの更新においては、サブルーチンb−updateは、共有の行列配列a(k,n)にアクセスし、上記説明と同じ意味を持つlen、is1、ie1を計算する。iofは、Bブロックの始まりの列の番号である。そして、Eブロックの上三角行列の対角要素を1にした行列TRU−Uを使って、同図に示す式によって行列aのブロックBの更新をする。ここで、is:ieという記号は、行列要素のisからieまでについて処理をすることを意味する。
【0045】
また、ブロックDの更新においては、サブルーチンd−updateによって、同様のパラメータを計算し、ブロックEの下三角行列TRLによって同図の式のように行列aの更新を行う。
【0046】
図12は、ブロックCとAの更新サブルーチンの疑似コードである。
ブロックCの更新サブルーチンc−updateでは、ブロックBとFの乗算によってブロックCを更新する。a(1:iof、is2:ie2)がブロックCを表し、a(1:iof、iof+1:iof+blk)がブロックBを、a(iof+1:iof+blk、is2:ie2)がブロックFを表す。
【0047】
ブロックAの更新サブルーチンa−pudateでは、ブロックBとDでブロックAを更新する。a(1:iof、is2:ie2)がブロックA、a(1:iof、iof+1:iof+blk)がブロックB、a(iof+1:iof+blk、is2:ie2)がブロックDである。
【0048】
図13は、ブロックG、Eの最初と2回目の更新を表す疑似コードである。
ブロックGの更新サブルーチンg−updateにおいては、前述のサブルーチンと同様に、ブロックの幅や開始位置、終了位置などを示すlen、is2、ie2、iofなどを計算し、ブロックGをブロックDとHで更新する。a(iof+1:n、is2:ie2)がブロックGであり、a(iof+1:n、iof+1:iof+blk)がブロックH、a(iof+1:iof+blk、is2:ie2)がブロックDである。
【0049】
ブロックEの最初の更新サブルーチンe−update1では、Eの対角成分より上の三角行列を対角成分以前の列ベクトルs(1:i、i)と、該対角成分以降の行ベクトル(i、i+1:blk)で更新する。
【0050】
ブロックEの2回目の更新サブルーチンe−update2では、ブロックEの上三角行列の対角成分を更新前の要素値を対角成分値で割った値に更新し、対角成分以前の行ベクトルs(i、1:i−1)と対角成分以後の列ベクトルs(i+1:blk,i)で更新し、ブロックEの下三角行列の要素値を対角成分の符号を変えたもので割った値に更新し、対角要素にブロックEの対角要素の逆数に更新する。
【0051】
図14は、ブロックEの最後の更新、ブロックD及びFの更新サブルーチンの疑似コードである。
ブロックEの最後の更新サブルーチンe−update3では、ブロックEの上三角行列を対角要素以前の列ベクトルs(1:i−1、i)と行ベクトルs(i、1:i−1)で更新し、ブロックEの対角要素以前の要素に更新前の対角要素をかけて更新する。
【0052】
ブロックD及びFの更新サブルーチンdf−updateにおいては、ブロックの幅lenが10より小さい場合、ブロックDあるいはブロックF(サブルーチンの引数のis、ieによって決定される)をブロックEの要素値s(1:i−1、i)と自身の行ベクトルa(i、is:ie)で更新する。ここで、ブロックDあるいはFの要素値がa(1:i−1、is:ie)となっているのは、このサブルーチンが行列要素を読み込む場合、前述のnbaseによって読み込む位置がオフセットされて読み込まれているため、列番号が1〜i−1の要素値について計算することがブロックDあるいはFについて研鑽することになる。lenが20以上、32以下の場合には、len1、len2を定義し、df−updateを再帰的に呼び出し、同図の処理をした後、更に、df−updateを呼び出して処理を行い終了する。
【0053】
図15は、ブロックB及びHの更新サブルーチンの疑似コードである。
同図においては、bh−updateは、lenが10より小さいとき、同図の演算によって更新し、lenが20以上、32以下の時には、len1、len2を定義し、その他の場合には、len1、len2を別に定義し、bh−updateを呼び出し、同図の式による演算を行い、更にbh−updateを呼び出し、処理をして終了する。
【0054】
本発明の実施形態によれば、同じ機能(LU分解した後、逆行列を求める別の方法)で、SUNの数値計算ライブラリSUN Performance libraryの機能に比べて7個のCPUで6.6倍高速となる。
【0055】
図16〜図29は、疑似コードの処理をフローチャートで表したものである。
図16は、メインの処理である。まず、逆行列の演算開始として、サブルーチンとしてshared配列A(k、n)を入力する。ステップS10では、スレッドを生成し、各スレッドでローカル域numthrに総スレッド数、nothrdに各スレッドに割り振られたスレッド番号を設定する。また、各スレッドでiblkにブロック幅を設定し、nb=(n+iblk-1)/iblkを設定し、i=1を設定する。ステップS11では、iがnb-1に等しいか否かを判断する。ステップS11の判断がYESの場合には、ステップS17に進む。ステップS11の判断がNOの場合には、ステップS12において、nbaseを(i-1)×iblkを設定し、ステップS13で、A(nbase+1:n、nbase+1:nbase+n)の部分をブロック幅iblkでブロックLU分解し、行ブロック及び右下正方行列部分を更新する。ここで、ip(nbase+1:nbase+iblk)に行の入れ替えの情報が入っている。これはサブルーチンにしておく。この部分の並列アルゴリズムは先に本出願人が出願した特許出願に記載されている。ステップS14においては、サブルーチンexchgrowを呼び出し、A(nbase+1:nbase+iblk、1:nbase)部分の行ベクトルの入れ替えを行う。すなわち、jをnbase+1からnbase+iblkまで変化させて、ip(j)>jを満たすときA(j,1:nbase)とA(ip(j),1:nbase)を入れ替える。ステップS15では、サブルーチンupdateを呼んで、他のブロックを更新する。ステップS16では、i=i+1として、ステップS11に戻る。ステップS17では、nbase=(nb-1)×iblksを演算し、ステップS18において、A(nbase+1:n,nbase+1:n)の部分に関して、LU分解を行う。ip(nbase+1:n-1)に行の入れ替えの情報が入っている。ステップS19において、サブルーチンexchgrowを呼び出し、A(nbase+1:n-1,1:nbase)部分の行ベクトルの入れ替えを行う。ステップS20において、サブルーチンupdateを呼んで更新する。ステップS21では、サブルーチンexchgcolを呼んで列ベクトルを入れ替える。すなわち、jをnから1づつ減らして変化させて、ip(j)>jを満たすとき、A(1:n,j)、A(1:n,ip(j))を入れ替える。ステップS22では、並列処理のために生成したスレッドを消去する。
【0056】
図17及び図18は、サブルーチンupdateのフローチャートである。
ステップS30においては、サブルーチンb-update、d-update、c-update、a-update、g-updateを呼び出すとき、nbase、iblk、配列A及びスレッドの情報であるnumthrd、各スレッドの番号nothrdを受け渡す。サブルーチンb-updateを呼んでブロックを更新する。ステップS31では、サブルーチンd-updateを呼んでブロックを更新する。ステップS32において、サブルーチンc-updateを呼んでブロックを更新する。ステップS33では、サブルーチンa-updateを呼んでブロックを更新する。ステップS34では、サブルーチンg-updateを呼んでブロックを更新する。
【0057】
ステップS35においては、各スレッド間でバリア同期を取る。ステップS36においては、nothrdの値が1のスレッドか否かを判断する。ステップS36の判断がNOの場合には、ステップS38に進む。ステップS36の判断がYESの場合には、ステップS37において、サブルーチンe-updateを呼んでブロックeを更新し、ステップS38に進む。ステップS38では、各スレッド間でバリア同期を取る。ステップS39においては、df-updateで各スレッドで分担する始点(is)、終点(ie)を決めて、受け渡す。len=(nbase+numthrd-1)/numthrd、is=(nothrd-1)×len+1,ie=min(nbase,nothrd×len)を演算する。ブロックの1次元目先頭istart=nbase+1、ブロック幅len=iblkとする。ステップS40においては、サブルーチンdf-updateを呼んでブロックfを更新する。
【0058】
ステップS41においては、同じく始点、終点を計算し受け渡す。nbase2=nbase+iblk,len=(n-nbase2+numthrd-1)/numthrd、is2=nbase2+(nothrd-1)×len+1、ie2=min(n,nbase2+nothrd×len)を演算する。ステップS42においては、ブロックの1次元目先頭istart=nbase+1、ブロック幅len=iblkとする。サブルーチンdf-updateを呼んで、ブロックfを更新する。ステップS43では、各スレッド間でバリア同期をとる。ステップS44nothrdの値が1のスレッドか否かを判断する。ステップS44の判断がNOの場合には、ステップS46に進む。ステップS44の判断がYESの場合には、ステップS45において、サブルーチンe-update2を呼んでブロックeを更新し、ステップS46に進む。ステップS46においては、各スレッド間でバリア同期を取る。ステップS47においては、bh-updateの各スレッドに受け渡す始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/numthed、is=(nothrd-1)×len+1、ie=min(nbase,nothrd×len)を計算する。ブロックの1次元目の先頭istart=nbase+1、ブロック幅len=iblkとする。サブルーチンbh-updateを呼んで、ブロックbを更新する。ステップS48においては、bh-updateの各スレッドに受け渡す始点、終点を計算する。
【0059】
ステップS49にいては、nbase2=nbase+iblk、len=(n-nbase2+numthrd-1)/numthrd、is2=nbase2+(nothrd-1)×len+1、ie2=min(n,nbase2+nothrd×nothrd×len)を計算し、ブロックの1次元目の先頭istart=nbase+1、ブロック幅len=iblkとする。ステップS50においては、bh-updateの各スレッドに受け渡す始点、終点を計算する。ステップS51においては、各スレッド間でバリア同期をとる。ステップS52では、nothrdの値が1のスレッドか否かを判断する。ステップS52の判断がNOの場合には、ステップS54に進み、判断がYESの場合には、ステップS53において、サブルーチンe-update3を呼んで、ブロックeを更新し、ステップS54に進む。ステップS54においては、各スレッド間でバリア同期を取る。
【0060】
図19は、サブルーチンb-updateとd-updateの処理を示すフローチャートである。
サブルーチンb-updateでは、ステップS60において、各スレッドで分担する1次元目の始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/numthrd、is1=(nothrd-1)×len+1、ie1=min(nbase,nothrd×len)、iof=nbaseを計算する。ステップS61においては、A(is1:ie1,iof+1:iof+iblk)=A(is1:ie1,iof+1:iof+iblk)×TRU-U(A(iof+1:iof+iblk,iof+1:iof+iblk))-1を計算する。TRU-Uは対角要素を1.0とした上三角行列部分である。そして、サブルーチンを抜ける。
【0061】
サブルーチンd-updateでは、ステップS65において、各スレッドで分担する始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/numthrd、is1=(nothrd-1)×len+1、ie1=min(nbase,nothrd×len)、iof=nbaseを計算する。ステップS66では、A(iof+1:iof+iblk,is1:ie1)=TRL(A(iof+1:iof+iblk,iof+1:iof+iblk))-1×A(iof+1:iof+iblk,is1:ie1)を計算する。TRLは正方行列の下三角行列部分である。そして、サブルーチンを抜ける。
【0062】
図20は、サブルーチンc-updateのフローチャートである。
ステップS70において、各スレッドで分担する2次元目の始点、終点を計算する。すなわち、nbase2=nbase+iblk、len=(n-nbase2+numthrd-1)/numthrd、is2=nbase2+(nothrd-1)×len+1、ie2=min(n,nbase2+nothrd×len)、iof=nbaseを計算する。ステップS71では、A(1:iof、is1:ie2)=A(1:iof,iof+1:iof+ilbk)×A(iof+1:iof+ilbk,is2:ie2)を計算し、サブルーチンを抜ける。
【0063】
図21は、サブルーチンa-updateのフローチャートである。
ステップS75において、各スレッドで分担する2次元目の始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/numthrd、is2=(nothrd-1)×len+1、ie2=min(nbase,nothrd×len)、iof=nbaseを計算する。ステップS76においては、A(1:iof,is2:ie2)=A(1:iof,is2:ie2)-A(1:iof,iof+1:iof+iblk)×A(iof+1:iof+iblk,is2:ie2)を計算して、サブルーチンを抜ける。
【0064】
図22は、サブルーチンg-updateのフローチャートである。
ステップS80においては、各スレッドで分担する2次元目の始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/umthrd、is2=(nothrd-1)×len+1、ie2=(nbase,nothrd×len)、iof=nbaseを計算する。ステップS81においては、A(iof+1:n,is2:ie2)=A(iof+1:n、is2:ie2)-A(iof+1:n,iof+1:iof+iblk)×A(iof+1:iof+iblk,is2:ie2)を計算し、サブルーチンを抜ける。
【0065】
図23は、サブルーチンe-updateのフローチャートである。
このルーチンでは、ブロックEの左上隅の要素がS(k、*)の最初の要素となるように引数で受け取る。ステップS85では、i=1を設定する。ステップS86では、i>iblkか否かを判断する。ステップS86の判断がYESの場合には、サブルーチンを抜ける。ステップS86の判断がNOの場合には、ステップS87において、S(1:i-1,i+1:iblk)=S(1:i-1,i+1:iblk)-S(1:i-1,i)×S(i,i+1:iblk)、i=i+1を計算し、サブルーチンを抜ける。
【0066】
図24は、サブルーチンe2-updateのフローチャートである。
まず、ブロックEの左上隅の要素がS(k、*)の最初の要素となるように引数で受ける。ステップS90では、i=1と設定し、ステップS91において、i>iblkか否かを判断する。ステップS91の判断がYESの場合には、サブルーチンを抜ける。ステップS91の判断がNOの場合には、ステップS92において、tmp=1.0/S(i,i)、S(i,i:i-1)=tmp×S(i,1:i-1)、S(i+1:iblk,1:i-1)=S(i+1:iblk,1:i-1)-S(i,1:i-1)×S(i+1:iblk,i)、S(i+1:iblk,i)=-A(i+1,iblk,i)×tmp、A(i,i)=tmp、i=i+1を演算して、ステップS91に戻る。
【0067】
図25は、サブルーチンe3-updateのフローチャートである。
まず、ブロックEの左上隅の要素がS(k、*)の最初の要素となるように引数で受ける。ステップS95では、i=1と設定し、ステップS96で、i>iblkか否かを判断する。ステップS96の判断がYESの場合には、サブルーチンを抜ける。ステップS96の判断がNOの場合には、ステップS97において、S(1:i-1,1:i-1)=S(1:i-1,1:i-1)-S(1:i-1,i)×S(i,1:i-1)、S(1:i-1,i)=S(1:i-1)×S(i,i)、i=i+1を演算し、ステップS96に戻る。
【0068】
図26は、サブルーチンdf-updateのフローチャートである。
このサブルーチンは、再帰的プログラムとなっている。まず、各スレッドで処理する範囲を示す始点、終点をis、ieで受ける。ブロックEの左上隅の要素がS(k、*)の最初の要素となるように引数で受ける。処理するブロックの1次元目の先頭istartとブロック幅lenで受ける。ステップS100では、len<10か否かを判断する。ステップS100の判断がNOの場合には、ステップS104に進む。ステップS100の判断がYESの場合には、ステップS101において、i=1と設定し、ステップS102において、i<=lenか否かを判断する。ステップS102の判断がNOの場合には、サブルーチンを抜ける。ステップS102の判断がYESの場合には、ステップS103において、js=istart、je=istart-1+len-1、A(js:je,is,ie)=A(js:je,is,ie)-S(js:je,i)×A(istart+i-1,is:ie)を演算し、ステップS102に戻る。
【0069】
ステップS104では、len>=32あるいはlen<=20か否かを判断する。ステップS104の判断がNOの場合には、ステップS106で、len1=len/3、len2=len-len1として、ステップS107に進む。ステップS104の判断がYESの場合には、ステップS105において、len1=len/2、len2=len-len1として、ステップS107に進む。ステップS107では、サブルーチンbf-updateを再帰的に呼び出す(ブロックの先頭のistartとブロック幅のlen1を受け渡す)。ステップS108では、js=istart、je=istart+len1-1、js2=js-nbase、je2=js2+len1-1、js3=js2+len1、je3=js3+len2-1、js4=istart+len1、je4=js4+len2-1、A(js:je,is:ie)=A(js:je,is:ie)-S(js2:je2,js3:je3)×A(js4,je4:len,is:ie)、istart2=istart+len1を演算して、ステップS109に進む。ステップS109では、サブルーチンdf-updateを再帰的に呼び出し(ブロックの先頭のistart2とブロック幅のlen2を受け渡す)、サブルーチンを終了する。
【0070】
図27は、サブルーチンbh-updateのフローチャートである。
このサブルーチンは再帰的プログラムである。まず、各スレッドで処理する範囲を示す始点及び終点をis、ieで受ける。また、ブロックEの左上隅の要素がS(k、*)の税所の要素となるように引数で受ける。処理するブロックの先頭istartとブロック幅をlenを受ける。
【0071】
ステップS115では、len<10か否かを判断する。ステップS115の判断がNOの場合には、ステップS119に進む。ステップS115の判断がYESの場合には、ステップS116において、i=1と設定し、ステップS117において、i<=lenか否かを判断する。ステップS117の判断がNOの場合には、サブルーチンを抜ける。ステップS117の判断がYESの場合には、ステップS118において、j=istart+i-1、j2=j-nbase、je=istart+len-1、je2=je-nbase、A(is:ie,j)=-A(is:ie,j)×S(j2,j2)、A(is:ie,j)=A(is:ie,j)-A(is:ie,j+1:je)×S(j2+1:je2,j2)を演算して、ステップS117に進む。
【0072】
ステップS119では、len>=32あるいはlen<=20か否かを判断する。ステップS119の判断がNOの場合には、ステップS121に進み、判断がYESの場合には、ステップS120に進む。ステップS120においては、len1=len/2、len2=len-len1を計算し、ステップS122に進む。ステップS121においては、len1=len/3、len2=len-len1を演算し、ステップS122に進む。ステップS122においては、サブルーチンbh-updateを再帰的に呼び出し、対象ブロックの先頭istartとブロック幅len1を受け渡す。ステップS123では、js=istart、je=istart+len1-1、js2=js-nbase、je2=js2+len1-1、js3=istart+len1、je3=js2+len2-1、js4=js3-nbase、je4=js4+len2-1、A(is:ie,js:je)=A(is:ie,js:je)-A(is:ie,js3:je3)×S(js4:jse,js2:je2)、istart2=istart+len1を演算する。ステップS124においては、サブルーチンbh-updateを再帰的に呼び出し、対象ブロックの先頭istart2とブロック幅len1を受け渡して、サブルーチンを抜ける。
【0073】
図28は、サブルーチンexchgrowのフローチャートである。
ステップS130において、バリア同期を取る。ステップS131において、各スレッドで分担する始点、終点を計算する。すなわち、len=(nbase+numthrd-1)/numthrd、is=(nothrd-1)×len+1、ie=min(nbase,nothrd×len)、j=nbase+1を計算する。ステップS132では、j>min(n-1,nbase+iblks)であるか否かを判断し、判断がYESの場合には、ステップS136に進み、判断がNOの場合には、ステップS133に進む。ステップS133では、ip(j)>jか否かを判断する。ステップS133の判断がNOの時は、ステップS135に進む。ステップS133の判断がYESの時は、ステップS134において、A(j,is:ie)とA(ip(j),is:ie)を入れ替え、ステップS135に進む。ステップS135において、j=j+1を演算し、ステップS132に戻る。ステップS136では、バリア同期を取って、サブルーチンを抜ける。
【0074】
図29は、サブルーチンexchgcolのフローチャートである。
ステップS140において、バリア同期を取る。ステップS141において、各スレッドで分担する始点、終点を計算する。すなわち、len=(n+numthrd-1)/numthrd、is=(nothrd-1)×len+1、ie=min(nbase,nothrd×len)、j=n-1を計算し、ステップS142に進む。ステップS142では、j<1を判断する。ステップS142の判断がYESの場合には、ステップS146に進む。ステップS142の判断がNOの場合には、ステップS143において、jp(j)>jを判断する。ステップS143の判断がNOの場合には、ステップS145に進む。ステップS143の判断がYESの場合には、ステップS144において、A(is:ie,j)とA(is:ie,jp(j))を入れ替えて、ステップS145に進む。ステップS145では、J=J-1として、ステップS142に戻る。ステップS146では、バリア同期を取って、サブルーチンを抜ける。
行列計算の一般的アルゴリズムに関しては、以下の教科書を参照されたい。
【0075】
G. H. Golub and C. F. Van Loan "Matrix Computations" The Johns Hopkins University Press, Third edition 1996
(付記1)共有メモリ型スカラ並列計算機用逆行列の並列処理方法であって、
逆行列を求めるべき行列内に、所定の正方形ブロックを指定するステップと、該行列を該正方形ブロックを中心として左上、左横、左下、上、下、右上、右横、右下のそれぞれのブロックに分解するステップと、
該分解されたそれぞれのブロックをプロセッサの数に応じて分割し、該正方形ブロックと、この下、右横、右下のブロックを並列にLU分解するステップと、
左横、上、下、右横のブロックを再帰的プログラムで並列に更新し、左上、左下、右上、右下のブロックを該再帰的プログラムで更新されたブロックを用いて並列に更新を行うステップと、
所定の正方形ブロックの更新を複数段に分けて、1つのプロセッサで行うステップと、
該正方形ブロックの位置を順次、該行列の対角線上を移動するように設定し、上記ステップを繰り返すことにより該行列の逆行列を求めるステップと、
を備える方法。
【0076】
(付記2)前記共有メモリ型スカラ並列計算機は、複数のプロセッサと、該プロセッサに対応して設けられる複数のキャッシュメモリと、複数の共有メモリと、これらを通信可能なように接続する相互結合網とからなることを特徴とする付記1に記載の方法。
【0077】
(付記3)上記方法は、Gauss−Jordanの方法をブロック毎に並列に計算する構成としたことを特徴とする付記1に記載の方法。
(付記4)前記各ブロックを分割して並列計算するさいの分割の幅は、逆行列を求める行列の大きさと並列処理のために利用できるプロセッサ数から、並列処理しない正方形ブロックの演算量の総和が演算全体の1%程度となるように設定されることを特徴とする付記1に記載の方法。
【0078】
(付記5)共有メモリ型スカラ並列計算機用逆行列の並列処理方法を実現させるプログラムであって、
逆行列を求めるべき行列内に、所定の正方形ブロックを指定するステップと、
該行列を該正方形ブロックを中心として左上、左横、左下、上、下、右上、右横、右下のそれぞれのブロックに分解するステップと、
該分解されたそれぞれのブロックをプロセッサの数に応じて分割し、該正方形ブロックと、この下、右横、右下のブロックを並列にLU分解するステップと、
左横、上、下、右横のブロックを再帰的プログラムで並列に更新し、左上、左下、右上、右下のブロックを該再帰的プログラムで更新されたブロックを用いて並列に更新を行うステップと、
所定の正方形ブロックの更新を複数段に分けて、1つのプロセッサで行うステップと、
該正方形ブロックの位置を順次、該行列の対角線上を移動するように設定し、上記ステップを繰り返すことにより該行列の逆行列を求めるステップと、
を備える方法を共有メモリ型スカラ並列計算機に実行させるプログラム。
【0079】
(付記6)前記共有メモリ型スカラ並列計算機は、複数のプロセッサと、該プロセッサに対応して設けられる複数のキャッシュメモリと、複数の共有メモリと、これらを通信可能なように接続する相互結合網とからなることを特徴とする付記5に記載のプログラム。
【0080】
(付記7)上記方法は、Gauss−Jordanの方法をブロック毎に並列に計算する構成としたことを特徴とする付記5に記載のプログラム。
(付記8)前記各ブロックを分割して並列計算するさいの分割の幅は、逆行列を求める行列の大きさと並列処理のために利用できるプロセッサ数から、並列処理しない正方形ブロックの演算量の総和が演算全体の1%程度となるように設定されることを特徴とする付記5に記載のプログラム。
【0081】
【発明の効果】
高性能かつスケーラビリティのある逆行列の解法を実現できる。
【図面の簡単な説明】
【図1】本発明の実施形態が前提とする共有メモリ型スカラ計算機のハードウェア構成を示した図である。
【図2】本発明の実施形態の計算順序を説明する図(その1)である。
【図3】本発明の実施形態の計算順序を説明する図(その2)である。
【図4】本発明の実施形態の計算順序を説明する図(その3)である。
【図5】本発明の実施形態の計算順序を説明する図(その4)である。
【図6】本発明の実施形態の計算順序を説明する図(その5)である。
【図7】本発明の実施形態の計算順序を説明する図(その6)である。
【図8】本発明の実施形態の計算順序を説明する図(その7)である。
【図9】本発明の実施形態の疑似コード(その1)である。
【図10】本発明の実施形態の疑似コード(その2)である。
【図11】本発明の実施形態の疑似コード(その3)である。
【図12】本発明の実施形態の疑似コード(その4)である。
【図13】本発明の実施形態の疑似コード(その5)である。
【図14】本発明の実施形態の疑似コード(その6)である。
【図15】本発明の実施形態の疑似コード(その7)である。
【図16】疑似コードの処理をフローチャートで表した図(その1)である。
【図17】疑似コードの処理をフローチャートで表した図(その2)である。
【図18】疑似コードの処理をフローチャートで表した図(その3)である。
【図19】疑似コードの処理をフローチャートで表した図(その4)である。
【図20】疑似コードの処理をフローチャートで表した図(その5)である。
【図21】疑似コードの処理をフローチャートで表した図(その6)である。
【図22】疑似コードの処理をフローチャートで表した図(その7)である。
【図23】疑似コードの処理をフローチャートで表した図(その8)である。
【図24】疑似コードの処理をフローチャートで表した図(その9)である。
【図25】疑似コードの処理をフローチャートで表した図(その10)である。
【図26】疑似コードの処理をフローチャートで表した図(その11)である。
【図27】疑似コードの処理をフローチャートで表した図(その12)である。
【図28】疑似コードの処理をフローチャートで表した図(その13)である。
【図29】疑似コードの処理をフローチャートで表した図(その14)である。
【符号の説明】
10−1〜10−n プロセッサ
11−1〜11−n メモリモジュール
12 相互結合網
13−1〜13−n 2次キャッシュメモリ
Claims (5)
- 共有メモリ型スカラ並列計算機用逆行列の並列処理方法を実現させるプログラムであって、
配列A(1:n、1:n)(nは行列の次数)として格納領域に格納されている、逆行列を求めるべき行列内に、所定の正方形ブロックを部分配列A( nbase +1: nbase + iblk 、 nbase +1: nbase + iblk )( nbase=iblk × (i-1) 、 i は、繰り返し回数、 iblk は、ブロック幅)に取得するステップと、
該行列を該正方形ブロックを中心として左上、左横、左下、上、下、右上、右横、右下のそれぞれのブロックに分解して、それぞれ、部分配列A(1: nbase 、1: nbase )、A( nbase+ 1: nbase+iblk 、 1 : nbase )、A( nbase+iblk+1 : n 、 1 : nbase )、A( 1 : nbase 、 nbase+1 : nbase+iblk )、A( nbase+iblk+1 :n、 nbase+1 : nbase+iblk )、A( 1:nbase 、 nbase+iblk+1:n )、A( nbase+1 : nbase+iblk 、 nbase+iblk+1 :n)、A( nbase+iblk+1 : n 、 nbase+iblk+1:n )として取得するステップと、
該正方形ブロックと、該正方形ブロックの下、右横、右下のブロックをそれぞれのブロックの行方向と列方向の内、長いほうをプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することによりLU分解するステップと、
左横、上、下、右横のブロックを(1)前半部分と後半部分にわけ、(2)前半部分を演算し、(3)後半部分に(1)〜(3)の処理を適用する構成をした再帰的プログラムで、それぞれのブロックの長いほうの配列をプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することにより更新し、左上、左下、右上、右下のブロックを該再帰的プログラムで更新されたブロックを用いて、それぞれのブロックの行方向と列方向の内、長いほうをプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することにより更新を行うステップと、
所定の正方形ブロックを更新処理のコストが全体のコストの1%程度となる幅のブロックに分割し、分割された全てのブロックの更新を順次1つのプロセッサで行うステップと、
該正方形ブロックの部分配列A( nbase+1 : nbase+iblk 、 nbase+1 : nbase + iblk )の nbase を nbase+iblk に設定し、上記ステップを繰り返すことにより該行列の逆行列を求めるステップと、
を備えることを特徴とする方法を共有メモリ型スカラ並列計算機に実現させるプログラム。 - 前記共有メモリ型スカラ並列計算機は、複数のプロセッサと、該プロセッサに対応して設けられる複数のキャッシュメモリと、複数の共有メモリと、これらを通信可能なように接続する相互結合網とからなることを特徴とする請求項1に記載のプログラム。
- 上記方法は、Gauss−Jordanの方法をブロック毎に並列に計算する構成としたことを特徴とする請求項1に記載のプログラム。
- 前記各ブロックを分割して並列計算するさいの分割の幅は、逆行列を求める行列の大きさと並列処理のために利用できるプロセッサ数から、並列処理しない正方形ブロックの演算量の総和が演算全体の1%程度となるように設定されることを特徴とする請求項1に記載のプログラム。
- 共有メモリ型スカラ並列計算機用逆行列の並列処理方法であって、
配列A(1:n、1:n)(nは行列の次数)として格納領域に格納されている、逆行列を求めるべき行列内に、所定の正方形ブロックを部分配列A( nbase +1: nbase + iblk 、 nbase +1: nbase + iblk )( nbase=iblk × (i-1) 、 i は、繰り返し回数、 iblk は、ブロック幅)に取得するステップと、
該行列を該正方形ブロックを中心として左上、左横、左下、上、下、右上、右横、右下のそれぞれのブロックに分解して、それぞれ、部分配列A(1: nbase 、1: nbase )、A( nbase+ 1: nbase+iblk 、 1 : nbase )、A( nbase+iblk+1 : n 、 1 : nbase )、A( 1 : nbase 、 nbase+1 : nbase+iblk )、A( nbase+iblk+1 :n、 nbase+1 : nbase+iblk )、A( 1:nbase 、 nbase+iblk+1:n )、A( nbase+1 : nbase+iblk 、 nbase+iblk+1 :n)、A( nbase+iblk+1 : n 、 nbase+iblk+1:n )として取得するステップと、
該正方形ブロックと、該正方形ブロックの下、右横、右下のブロックをそれぞれのブロックの行方向と列方向の内、長いほうをプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することによりLU分解するステップと、
左横、上、下、右横のブロックを(1)前半部分と後半部分にわけ、(2)前半部分を演算し、(3)後半部分に(1)〜(3)の処理を適用する構成をした再帰的プログラムで、それぞれのブロックの長いほうの配列をプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することにより更新し、左上、左下、右上、右下のブロックを該再帰的プログラムで更新されたブロックを用いて、それぞれのブロックの行方向と列方向の内、長いほうをプロセッサの数で分割して、それぞれ分割したブロックを各プロセッサに割り当て、それぞれのプロセッサが並列に演算することにより更新を行うステップと、
所定の正方形ブロックを更新処理のコストが全体のコストの1%程度となる幅のブロックに分割し、分割された全てのブロックの更新を順次1つのプロセッサで行うステップと、
該正方形ブロックの部分配列A( nbase+1 : nbase+iblk 、 nbase+1 : nbase + iblk )の nbase を nbase+iblk に設定し、上記ステップを繰り返すことにより該行列の逆行列を求めるステップと、
を備えることを特徴とする方法。
Priority Applications (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2003074548A JP3983188B2 (ja) | 2002-03-22 | 2003-03-18 | 共有メモリ型スカラ並列計算機用逆行列の並列処理方法 |
| US10/692,533 US7483937B2 (en) | 2002-03-22 | 2003-10-24 | Parallel processing method for inverse matrix for shared memory type scalar parallel computer |
Applications Claiming Priority (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2002079909 | 2002-03-22 | ||
| JP2003074548A JP3983188B2 (ja) | 2002-03-22 | 2003-03-18 | 共有メモリ型スカラ並列計算機用逆行列の並列処理方法 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JP2004005488A JP2004005488A (ja) | 2004-01-08 |
| JP3983188B2 true JP3983188B2 (ja) | 2007-09-26 |
Family
ID=30445758
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2003074548A Expired - Lifetime JP3983188B2 (ja) | 2002-03-22 | 2003-03-18 | 共有メモリ型スカラ並列計算機用逆行列の並列処理方法 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP3983188B2 (ja) |
Families Citing this family (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| WO2008136045A1 (ja) * | 2007-04-19 | 2008-11-13 | Fujitsu Limited | 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法 |
| CN114417249B (zh) * | 2022-01-24 | 2024-03-26 | 合肥工业大学 | 一种多阶矩阵快速求逆硬件结构实现方法 |
-
2003
- 2003-03-18 JP JP2003074548A patent/JP3983188B2/ja not_active Expired - Lifetime
Also Published As
| Publication number | Publication date |
|---|---|
| JP2004005488A (ja) | 2004-01-08 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US10832120B2 (en) | Systems and methods for a multi-core optimized recurrent neural network | |
| EP4227886A1 (en) | Matrix operation method and apparatus for image data, device, and storage medium | |
| US5144563A (en) | Method and apparatus for optimizing element placement and method and apparatus for deciding the optimal element placement | |
| US10642622B2 (en) | Arithmetic processing device and control method of the arithmetic processing device | |
| JP6750203B2 (ja) | 畳み込みニューラルネットワークの演算方法及び演算プログラム、情報処理装置 | |
| US10713042B2 (en) | Arithmetic processing device and control method for arithmetic processing device | |
| JP5110081B2 (ja) | 共有メモリ型スカラ並列計算機向け、実対称行列の三重対角化の並列処理方法 | |
| CN118193410A (zh) | 一种内存搬运算子的执行方法、设备及存储介质 | |
| US20020091909A1 (en) | Matrix processing method of shared-memory scalar parallel-processing computer and recording medium | |
| CN121052309B (zh) | 一种注意力机制计算方法、设备、介质及产品 | |
| US7483937B2 (en) | Parallel processing method for inverse matrix for shared memory type scalar parallel computer | |
| US20200117701A1 (en) | Computation device, computation method, and program | |
| CN118567580A (zh) | 一种张量内存搬运方法、设备、存储介质及程序产品 | |
| US6665857B2 (en) | System and method of generating integrated circuit mask data | |
| JP2001290796A (ja) | 行列リオーダリング方法及び装置並びに電子回路シミュレーション方法及び装置 | |
| JP3983188B2 (ja) | 共有メモリ型スカラ並列計算機用逆行列の並列処理方法 | |
| JP2006085619A (ja) | 帯係数行列を持つ連立1次方程式の解法プログラム | |
| EP4350581A1 (en) | High-efficiency pooling method and device therefor | |
| Abdelfattah et al. | Progressive optimization of batched LU factorization on GPUs | |
| CN118761899A (zh) | 一种张量折叠方法、设备、存储介质及程序产品 | |
| TWI797985B (zh) | 卷積運算的執行方法 | |
| JP4037303B2 (ja) | 共有メモリ型スカラ並列計算機用固有値問題の並列処理方法 | |
| JP2010123083A (ja) | 相関処理装置及びその相関処理装置で読みとり可能な媒体 | |
| CN119474620B (zh) | 基于扩展卡尔曼滤波和强化学习的束线站参数优化方法 | |
| US20250130772A1 (en) | Neural network circuit and arithmetic method |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20050609 |
|
| A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20070201 |
|
| A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20070220 |
|
| A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070417 |
|
| TRDD | Decision of grant or rejection written | ||
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20070703 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20070703 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100713 Year of fee payment: 3 |
|
| R150 | Certificate of patent or registration of utility model |
Ref document number: 3983188 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100713 Year of fee payment: 3 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110713 Year of fee payment: 4 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110713 Year of fee payment: 4 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120713 Year of fee payment: 5 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120713 Year of fee payment: 5 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130713 Year of fee payment: 6 |
|
| EXPY | Cancellation because of completion of term |