JP3983193B2 - 行列処理方法及び装置 - Google Patents
行列処理方法及び装置 Download PDFInfo
- Publication number
- JP3983193B2 JP3983193B2 JP2003095720A JP2003095720A JP3983193B2 JP 3983193 B2 JP3983193 B2 JP 3983193B2 JP 2003095720 A JP2003095720 A JP 2003095720A JP 2003095720 A JP2003095720 A JP 2003095720A JP 3983193 B2 JP3983193 B2 JP 3983193B2
- Authority
- JP
- Japan
- Prior art keywords
- node
- block
- nodes
- blocks
- matrix
- 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 - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/16—Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Pure & Applied Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Mathematical Optimization (AREA)
- Mathematical Analysis (AREA)
- Computational Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Computing Systems (AREA)
- Complex Calculations (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Multi Processors (AREA)
Description
【発明の属する技術分野】
本発明は、SMP(Symmetric MultiProsessor)ノード分散メモリ型並列計算機における行列処理装置あるいは処理方法に関する。
【0002】
【従来の技術】
ベクトルプロセッサをクロスバーで結合した並列計算機向けに開発した連立一次方程式の解法では、ブロックLU分解の各ブロックを各PEにサイクリックに配置してLU分解を行っていた。ベクトルプロセッサではブロック幅を小さくしてもコストの高い行列積による更新部分の計算効率は非常に高かった。このためブロック幅12程度でサイクリックな配置と見なして、まず、このブロックをLU分解及び1つのCPUで逐次的に計算してから、結果を部分的に分割して各プロセッサに転送して、行列積での更新を行っていた。
【0003】
図26は、スーパスカラ並列計算機用LU分解法のアルゴリズムを概略説明する図である。
配列Aを外積形式のガウスの消去法をブロック化した方法でLU分解する。ブロック幅dで分解する。
k番目の処理で、更新部分A(k)を次の計算で更新する。
A(k)=A(k)−L2(k)×U2(k)・・・・・(1)
k+1番目の処理では、A(k)を幅dで分解してdだけ小さいマトリックスを同じ式で更新する。
L2(k)、U2(k)は以下の式で求める必要がある。
式(1)で更新を行う場合、
【0004】
【数1】
【0005】
と分解し、U2(k)=L1(k)-1U2(k)と更新する。
上記のブロック化されたLU分解の方法は、特許文献1に記載されている。
そのほか、並列計算機で行列を計算する技術として特許文献2には、連立1次方程式の係数行列を外部記憶装置に格納する方式が、特許文献3には、ベクトル計算機における方式が、特許文献4には、多枢軸同時消去を行う方式が、特許文献5には、スパース行列の各要素の構成を並び替えて、縁付きブロック対角行列にしてからLU分解を行う方法が記載されている。
【0006】
【特許文献1】
特開2002−163246号公報
【特許文献2】
特開平9−179851号公報
【特許文献3】
特開平11−66041号公報
【特許文献4】
特開平5−20349号公報
【特許文献5】
特開平3−229363号公報
【0007】
【発明が解決しようとする課題】
上記スーパスカラ並列計算機用LU分解の方法を単純に一つのノードをSMPとする並列計算機システムで行うと以下の問題が発生する。
【0008】
SMPノードでの行列積を効率的に行うためにはベクトル計算機で12と設定していたブロック幅を1000程度に増やす必要がある。
(1)この結果、ブロック毎にそれが各プロセッサにサイクリックに配置されていると見なして処理を行うと、行列積での更新の計算量がプロセッサ間で不均一である割合が大きくなり並列効率が著しく低下する。
(2)また、1ノードで計算する幅1000程度のブロックのLU分解は、ノード内でのみ計算すると、他のノードはアイドル状態となる。幅の大きさに比例して、このアイドル時間が増えるため、並列化効率が著しく低下する。
(3)SMPノードを構成するCPU数を増やすと計算能力の増加に対して、転送スピードが相対的に劣化しているため、従来の方法は転送量が約0.5n2×1.5要素(ここでの要素は、行列の要素である)であったが、相対的に増えて見える。このため効率がかなり落ちる。
(1)〜(3)までの劣化は全体で焼く20〜25%の性能ダウンを引き起こす。
【0009】
本発明の課題は、SMPノード分散メモリ型並列計算機で高速に行列を処理することの出来る装置あるいは方法を提供することである。
【0010】
【課題を解決するための手段】
本発明の行列処理方法は、複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理方法であって、ノード毎にサイクリックに割り付けられた行列の部分の列ブロックの1巻き分を、該1巻き分をまとめたものを対象にして処理するために、各ノードに一つずつ分散して配置する第1の配置ステップと、該1巻き分を結合したブロックに対して対角部分と該対角ブロックの下側にある列ブロックと他のブロックに分離する分離ステップと、該対角ブロックを各ノードに冗長に配置すると共に、該列ブロックを1次元目で分割することによって得られるブロックを該複数のノードに、共に並列通信して一つずつ配置する第2の配置ステップと、該対角ブロックと配置されたブロックを、各ノード間で通信しながら、各ノードで並列にLU分解するLU分解ステップと、LU分解されたブロックを用いて、行列の他のブロックを更新する更新ステップとを備えることを特徴とする。
【0011】
本発明によれば、各ノード間の計算負荷を分散し、並列化度を上げることが出来るので、より高速な行列処理が行える。また、演算と、データ転送を並列して行うことから、計算機の処理能力をデータ転送のスピードに制限されずに、向上することが出来る。
【0012】
【発明の実施の形態】
本発明の実施形態においては、ブロック幅を大きくしても負荷バランスが完全に均一であり、1CPUで逐次計算していた部分をノード間で並列に処理する方式を提案する。
【0013】
図1は、本発明の実施形態が適用されるSMPノード分散メモリ型並列計算機の概略全体構成を示す図である。
図1(a)に示されるように、クロスバーネットワークにノード1〜ノードNが接続され、相互に通信できるようになっている。各ノードは、図1(b)に示されるように相互結合網10によって、メモリモジュール11−1〜11−n、及びプロセッサ13−1〜13−mとキャッシュ12−1〜12−mの組とが相互に結合され、通信可能となっている。データ通信用ハード(DTU)14は、図1(a)のクロスバーネットワークに接続され、他のノードと通信可能となっている。
【0014】
まず、比較的ブロック幅の小さなコラムブロックをノードにサイクリックに配置する。各ノードに一巻き分(サイクリックにコラムブロックを配置した場合の1回でサイクリックに配置される分)あるブロックを一つに束ねたものを一つに行列と見なす。これは行列を2次元目を均等に分割し、各ノードに分散配置した状態と見なすことが出来る。これを1次元目を均等に分割した配置に並列転送を利用して動的に変更する。ここで、1次元目を分割、2次元目を分割とは、行列を長方形あるいは正方形とした場合、横方向を縦の線で分割することを1次元目を分割すると言い、縦方向を横の線で分割することを2次元目を分割するという。このとき一番上の正方形部分は各ノードが重複して持つようにする。
【0015】
この分散配置の変更でクロスバーネットワークを利用した並列転送が使え、転送量はノード数分の1となる。1次元目を均等に分割した配置に変更した配置で、ノード間通信を使って、このブロックのLU分解を並列に行う。このとき並列化効率があがり、かつSMPの性能を引き出せるようにするために、更にブロックに分解して再帰的なLU分解を行う。
【0016】
このブロックLU分解が終了した時点で各ノードには対角ブロック部分の情報と1次元目を均等に分割した部分の情報があるため、これを利用して行ブロック部分を更新して、保持している列ブロック部分とで更新できる部分を更新する。更新時に隣のノードにこの情報を転送して、次の更新の準備を行う。この転送は計算と同時に行える。これらの操作を繰り返して全ての更新部分の更新を行う。
【0017】
図2は、本発明の実施形態に従った全体の処理フローチャートである。
まず、ステップS10において、最後の一巻きか否かを判断する。ステップS10の判断がYESの場合には、ステップS15に進む。ステップS10の判断がNOの場合には、ステップS11において、対象となる一巻き分のブロックを結合したブロックを1次元目で分割した配置に並列転送を利用して変換する。このとき対角ブロックは全てのノードで共通に持つようにする。ステップS12においては、1次元目を分割配置したブロックに関してLU分解を行う。このときキャッシュの大きさを考慮したブロック幅までと、そのブロック幅より小さい部分の処理を再帰的な手続きで行う。ステップS13では、LU分解した1次元目で分割配置されたブロックを並列転送をつかって元の2次元目を分割した配置に戻す。ステップS14においては、この時点で各ノードには対角ブロックと残りをノード数に1次元目で分割した小ブロックが各ノードに割り付けられている。各ノードで共通に持っていた更新済みの対角ブロックを使ってブロック行を各ノードで更新する。このとき次の更新で必要となる列ブロックを隣のノードに計算と同時に転送する。ステップS15では、最後の一巻きは各ノードに分割せずに冗長に配置して、同じ計算を行ってLU分解を行う。各ノード部分に対応する部分をコピーバックする。そして、処理を終了する。
【0018】
図3は、本発明の実施形態の一般概念図である。
図3に示されるように、行列を例えば、4等分して各ノードに分散配置する。各ノードは、列ブロックが割り当てられており、サイクリックな順序で処理する。このとき一巻き分を束ねて1つのブロックと見なす。これを対角ブロック部分を除き1次元目で分割し、通信を使って各ノードに再配置する。
【0019】
図4及び図5は、比較的ブロック幅の小さなブロックをサイクリックに配置した状態を説明する図である。
図4及び図5に示すように、行列の一部の列ブロックを、更に小さい列ブロックに細分化し、各ノード(今の場合4つとしている)にサイクリックに割り当てる。このような配置の変更は、2次元目を分割されたブロックを1次元目を分割(対角ブロックは共通に保持)変更することになる。これはクロスバーネットワークの並列転送を利用して変更することが出来る。
【0020】
これは、1巻きが結合されたブロックをメッシュに仮想的に分割したとき、対角線方向のブロックの並び(11、22、33、44)、(12、23、34、41)、(13、24、31、42)、(14、21、32、43)の各組のブロックを各ノードに(二次元目の示すプロセッサから1次元目の示すプロセッサに転送する)並列転送することで実現できる。このとき、対角ブロック部分も一緒に送ることで対角ブロック部分は各ノードが共通に持つことができる充分な大きさで、転送はプロセッサ数分の1になる。
【0021】
このように分散配置を変更した列ブロックに対するLU分解を、各ノードに対角ブロックと残りの部分を均等に分割したものを配置して、ノード間通信及びノード間で同期を取りながら処理を行う。また、ノード内でのLU分解の処理はスレッド並列化を行う。
【0022】
スレッド並列化でのLU分解がキャッシュ上で効率的に行えるように、2重構造の再帰的手続で行う。つまり、あるブロック幅までの大きさで一次の再帰手続で行い、それより小さい部分に関しては、スレッド並列化のために、各スレッドで、そのブロックを対角部分と残りの部分を並列処理するスレッド数で均等に分割した部分を合わせて連続な作業域にコピーして処理を行う。このことでキャッシュ上のデータを有効に利用する。
【0023】
また、ノード間で共有している対角ブロック部分の計算はノード間で冗長に計算されてノード間のLU分解の並列化効率が劣化する。LU分解を2重の再帰的手続きで行うことで、各ノード内でスレッドで並列計算するときのオーバヘッドを減らすことが出来る。
【0024】
図6は、図4及び図5で配置されたブロックの更新処理を説明する図である。
図6の最も左のブロックは各ノードに対角ブロックを冗長に、かつ、残りのブロックを一次元目で均等に分割したものを作業域に配置したものである。あるノードでの状態と考える。最小ブロック幅まで1次の再帰手続きを行う。
【0025】
最小ブロックのLU分解が終わったら、この情報を使って、行ブロック及び更新部分の更新を更新する領域を均等に分割して、並列に更新する。
最小ブロック部分のLU分解は、更に以下のように最小幅のブロックの対角部分を共通に、かつ、残り部分を均等に分割して、各スレッドの局所領域(キャッシュの大きさ程度)にコピーする。
【0026】
この領域を使って、更に再帰的手続きでLU分解を行う。ピボットを決めて、行の入れ替えを行うために各スレッドに、ピボットの相対的位置から、ノードでの相対位置、全体での位置に換算するための情報を保持しておく。
【0027】
ピボットがスレッドの局所領域の対角部分内にあるときは、各スレッドで、独立に入れ替えを行える。
スレッドの対角ブロックを超えたときは、その位置が、以下の条件のときによって処理が異なる。
a)ピボットがノード間に分割配置したとき冗長に配置した対角ブロック内にあるとき。
【0028】
このときは、ノード間で通信する必要はなく、各ノードで独立に処理できる。b)ピボットがノード間に分割配置した時冗長に配置した対角ブロックを超えたとき。
【0029】
このときはスレッド間での最大値、つまりノードでの最大値を全ノードに通信して最大ピボットがどのノードに有るかを決定する。これが決まった後、最大ピボットを持つノードで行の入れ替えを行う。そのあと、入れ替えられた行(ピボット行)を他のノードに通信する。
【0030】
このようなピボットの処理を行う。
2重構造を持つ再帰手続きでのLU分解の二次のスレッド並列で行うLU分解は、上記のピボット処理を行いながら、各スレッドの局所領域でLU分解を並列に行うことができる。
【0031】
ピボットの入れ替えの履歴は共用メモリに各ノードに冗長に保持する。
図7は、再帰的なLU分解の手順を説明する図である。
再帰的なLU分解の手順は以下のようになる。
【0032】
図7(b)のレイアウトを考える。図7(b)の対角ブロック部分がLU分解できると、UはL1を使って、U←L1-1U、C←L×Uと更新する。
再帰的手順は、LU分解する領域を前半と後半に分割し、分割した領域をLU分解の対象と見なして、再帰的に行う方法である。ブロックの幅が、ある最小の幅より小さくなったとき、その幅に関しては従来通りのLU分解を行う。
【0033】
図6(a)は、領域を真ん中の太線で2分割し、その左側をLU分解する過程で更に2分割したところである。太線で分割した左側は図6(b)のレイアウトを当てはめられる。このレイアウトのCの部分もLU分解できたとき、太線から左側のLU分解が終わる。
【0034】
この左側の情報から、図6(b)のレイアウトを全体にあてはめて、Cとなる右側の更新を行う。更新が終わったら、右側に図6(b)のレイアウトを当てはめて同じようにLU分解を行う。
・ブロックのLU分解処理の後の行の入れ替えと行ブロックの更新及びrank p updateでの更新
ノード間にブロックを再配置した状態でノード間通信及びスレッド並列を使ってLU分解を並列に実行した後、各ノードには各ノードに共通に置かれた対角ブロックと残りの部分を均等に分割した部分のひとかけらがLU分解された値を保持して残る。
【0035】
各ノードでピボットの入れ替えの履歴の情報と対角ブロックの情報を使って、まず行の入れ替えを行う。その後、行ブロック部分の更新を行う。この後、対角ブロックの残り部分を分割した列ブロック部分と更新された行ブロック部分を利用して更新部分を更新する。この計算と同時に更新に使う分割された列ブロック部分を全ノードで隣のノードに転送する。
【0036】
この転送は、次の更新で必要な情報を計算と同時に送り、次の計算の前までに準備を行うためであり、転送を計算と同時に行うことで計算を効率よく続けることができる。
【0037】
また、部分的な行列積の更新をスレッド数が多くても効率的に行えるように各スレッドで計算する行列積の更新領域が正方形に近くなる用に分割する。各ノードで更新を受け持つ更新領域は、正方形である。この領域の更新を各スレッドに分担して、かつ、性能劣化を引き起こさないようにすることを考える。
【0038】
このため、更新領域をできるだけ正方形に近い形に分割する。このことで更新部分の2次元目の大きさがかなり大きく取れ、行列積の計算で繰り返し参照される部分の参照をキャッシュ上に保持して有効利用することが比較的できるようになる。
【0039】
このために、以下の手順で行列積の更新の各スレッドでの分担を決めて並列計算する。
1)スレッドの総数#THRDの平方根を求める。
2)この値が整数でないとき、これを切り上げてnrowとする。
3)2次元目の分割数をnrowとする。
4)1次元目の分割数をncolを以下の条件を満たす最小の整数を見つける。ncol×nrow>=#THRD
5)if(ncol*nrow==#thrd)then
1次元目をncol等分、2次元目をnrow等分ncol*nrowに分割して各スレッドに更新を並列実行させる。
else
1次元目をncol等分、2次元目をnrow等分してncol*nrowに分割して(1、1)、(1、2)、(1、3)、・・・(2、1)、(2、2)、(2、3)・・・と#THRD個の部分を並列更新する。残りの領域は一般的に横に長い長方形となる。これを2次元目を均等に分割して全スレッドで負荷が均等になるように更新部分を分割して再度並列処理する。
endif
・ソルバー部分
図8は、対角部分以外の部分ブロックの更新について説明する図である。
【0040】
LU分解された結果は、各ノードに分散配置された形で保存されている。各ノードには比較的ブロック幅の小さなブロックがLU分解された状況で格納されている。
【0041】
この幅の小さなブロックに関して前進代入、後退代入を行って次のブロックのある隣のノードに処理を渡す。このとき解を更新した部分を隣のノードに転送する。
【0042】
実際の前進代入及び後退代入では細長いブロックで対角ブロック部分を除いた長方形部分を1次元目で均等にスレッド数で分割して並列更新を行う。
まず、一つスレッドでLD×BD=BDを解く。
【0043】
この情報を使って全スレッドで以下のようにBを並列に更新する。
Bi=Bi−Li×BD
この1サイクルの更新で変更された部分を隣のノードに転送する。
【0044】
前進代入が終わったら、今までの処理でノードに処理を渡してきたのとちょうど逆を辿るようにして後退代入を行う。
実際には、元の行列の各ノードに配置された部分をサイクリックに処理している。これは列ブロックを入れ替えて別の行列に変換していることに相当する。LU分解の過程でピボットをとる列は未分解部分のどの列を対象にしてもよいことに由来する。
APP-1x=b→y=P-1xと置いてyについて解くことに相当する。解いたyを並び変えることでxを求めることが出来る。
【0045】
図9〜図11は、行ブロックの更新処理を説明する図である。
列ブロックの計算が終わったら、今度計算された部分をもとの2次元目を分割した配置に戻す。ここで、2次元目を分割した形でのデータは各ノードに保持しておく。次に、行の入れ替え情報を元に、行の入れ替えを行ったあと、行ブロックを更新する。
【0046】
各ノードに存在する列ブロックの部分を計算と同時に隣のノードにリング状に送ることで順次更新を進めていく。バッファをもう一つ持つことで可能となる。この領域には各ノードに対角ブロックを冗長に保持しているが、これも一緒に転送する。対角ブロック以外の部分のデータの量が多く、また、計算と同時に転送を行うので、転送時間は見えない。
【0047】
図10によれば、バッファAからBへのデータ転送を行う。次のタイミングではバッファBからAへのノードのリングに沿ってデータを送る。このようにしてスイッチしてデータ送る。更に、図11において、更新が終わったら、列ブロックと行ブロックを除いた正方行列に対して大きさが縮小したもの対して同じ処理を繰り返す。
【0048】
図12〜図25は、本発明の実施形態のフローチャートである。
図12及び図13はサブルーチンpLUのフローである。このサブルーチンは、呼び出しプログラムであり、各ノードで1つのプロセスを生成してから呼び出すことで並列に処理を行う。
【0049】
まず、解くべき問題の大きさを、単位ブロック数をiblksunit、ノード数をnumnordとして、n=iblksunit×numnord×m(mは各ノードでの単位ブロック数)としたLU分解を行う。各ノードに係数行列Aの2次元目を均等に分割した共用メモリA(k、n/numnord)(k>=n)及び行の入れ替えの履歴を格納するip(n)を引数として受け取る。ステップS20において、nonordにプロセス番号(1〜ノード数)を設定し、numnordにノード数(全プロセス数)を設定する。ステップS21において、各ノードでスレッドを生成し、nothrdにスレッド番号(1〜スレッド数)及びnumthrdにスレッドの総数を設定する。ステップS22において、ブロック幅の設定であるiblksmacro=iblksunit×numnord、繰り返し回数であるloop=n/(iblksunit×numthrd)-1を計算し、更に、i=1、lenbufmax=(n-iblksmacro)/numnord+iblksmacroを設定する。
【0050】
ステップS23において、wlu1(lenbufmax, iblksmacro)、wlu2(lenbufmax, iblksmacro)、bufs(lenbufmax, iblksunit)、bufd(lenbufmax, iblksunit)の作業域を確保する。この領域をサブルーチンが実行の都度、実際の長さlenbufを計算して、必要な大きさだけ使う。
【0051】
ステップS24においては、i>=loopであるか否かを判断する。ステップS24の判断がYESの場合には、ステップS37に進む。ステップS24の判断がNOの場合には、ステップS25において、ノード間でバリア同期を取る。そして、ステップS26において、lenblks=(n-i×iblksmacro)/numnord+iblksmacroを計算する。ステップS27において、サブルーチンctobを呼び出し、各ノードにある幅iblksunitのi番目を対角ブロックと1次元目を均等分割した幅iblksmacroの部録を対角ブロックに結合し、ノードに持つ配置を変える。ステップS28では、ノード間でバリア同期を取る。ステップS29では、サブルーチンinterluを呼び出して、配列wlu1に格納され、分散再配置された、ブロックをLU分解する。行の入れ替えの情報は、is=(i-1)*iblksmacro+1,ie=i*iblksmacroとしてip(is:ie)に格納されている。
【0052】
ステップS30において、ノード間でバリア同期を取り、ステップS31において、サブルーチンbtocを呼び出して、再配置されたブロックでLU分解されたブロックを各ノードのもともと格納されていた場所に戻す。ステップS32においてノード間でバリア同期を取り、ステップS33において、サブルーチンexrwを呼び出して、行の入れ替え及び行ブロックの更新を行う。ステップS34においては、ノード間でバリア同期を取り、ステップS35において、サブルーチンmmcbtを呼び出して、各ノードにある列ブロックの部分(wlu1に格納されている)と行ブロックの部部との行列積で更新する。計算と同時に列ブロック部分をプロセッサ間をリングに沿って転送し、次の更新の準備を行いながら更新する。ステップS36においては、i=i+1として、ステップS24に戻る。
【0053】
ステップS37では、ノード間でバリア同期を取り、ステップS38において、生成したスレッドを消滅させる。ステップS39において、サブルーチンfbluを呼んで、最後のブロックのLU分解を行いながら更新する。ステップS40において、ノード間でバリア同期を取り、処理を終了する。
【0054】
図14及び図15は、サブルーチンctobのフローである。
ステップS45において、A(k、n/numnord)、wlu1(lenblks,iblksmacro)、bufs(lenblks,iblksunit)、bufd(lenblks,iblksunit)を引数で受けて、各ノードのi番目の幅iblksunitのブロックをnumnord個束ねたものの対角ブロック行列部分より下の部分をnumnord個に分割したものと対角ブロックを加えたものとを各ノードに分散配置したものに転送を利用して配置換えする。
【0055】
ステップS46においては、nbase=(i-1)*iblksmacro(iは呼び出し元のメインループの繰り返し回数)、ibs=nbase+1、ibe=nbase+iblksmacro、len=(n-ibe)/numnord、nbase2d=(i-1)*iblksunit、ibs2d=nbase2d+1、ibe2d=ibs2d+iblksunitを計算する。ここで、送信データ数はlensend=(len+iblksmacro)*iblksunitである。ステップS47においては、iy=1と設定し、ステップS48において、iy>numnordか否かを判断する。ステップS48の判断がYESの場合には、サブルーチンを抜ける。ステップS48の判断がNOの場合には、ステップS49において、送信する部分、受信する部分を決める。すなわち、idst=mod(nonord-1+iy-1,numnord)+1(送信先ノード番号)、isrs=mod(nonord-1+numnord-iy+1,numnord)+1(送信元ノード番号)を計算する。ステップS50においては、各ノードで自分に割り付いている幅iblksunitの対角ブロック部分と、その下部分のブロックの1次元目をnumnordで分割した部分で、再配置した時保持する部分(転送先のノード数番目のもの)をバッファの下の部分に格納する。すなわち、bufd(1:iblksmacro,1:iblksunit)←A(ibs:ibe,ibs2d:ibe2d)、icps=ibe+(idst-1)+len+1、icpe=isps+len-1、bufd(iblksmacro+1:len+iblksmacro,1:iblksunit)←A(icps:icpe,ibs2d:ibe2d)を演算する。このコピーは1次元目をスレッド数に分割して各スレッドで並列に処理する。
【0056】
ステップS51では、全ノードで送受信を行う。すなわち、bufdの内容おidst番目のノードに送り、bufsに受信する。ステップS52においては、送受信の完了を待つ。ステップS53では、バリア同期を取り、ステップS54において、wlu1の対応位置に、isrs番目のノードから受けたデータを格納する。すなわち、icp2ds=(isrs-1)*iblksunit+1,icp2de=icp2ds+iblksunit-1、wlu1(1:len+iblksmacr,,icp2ds:
icp2de)←bufs(1:len+iblksunit,1:blksunit)を演算する。すなわち、1次元目をスレッド数で分割して各スレッドで並列コピーする。ステップS55でiy=iy+1とし、ステップS48に戻る。
【0057】
図16及び図17は、サブルーチンinterLUのフローである。
ステップS60において、A(k、n/numnord)、wlu1(lenblks,iblksmacro)、wlumicro(ncash)を引数として受ける。ここで、wlumicroをL2キャッシュ(レベル2のキャッシュ)の大きさとし、各スレッドに確保されたものを受ける。wlu1にLUブロック分解する幅iblksmacroのブロックで対角ブロックとその下位ブロックを1次元目でnumnord個に分割した一つが各ノードの領域に格納されている。ピボットの検索と行の入れ替えに関してノード間転送を使いながら並列にLU分解する。本サブルーチンは、再帰的に呼び出される。呼び出しが深くなるにつれてLU分解したときのブロック幅は小さくなる。このブロックをスレッド並列してLU分解したとき、各スレッドで計算する部分がキャッシュの大きさ以下になるところで、LU分解をスレッド並列化する別のサブルーチンを呼び出す。
【0058】
スレッド並列は対象となる比較的幅の小さなブロックをこのブロックの対角行列部分を各スレッドで重複して持ち、対角ブロックより下位の部分を1次元目をスレッド数で均等分割して各スレッド(CPU)にキャッシュの大きさより小さな領域wlumicroで処理できるようにコピーして処理を行う。istmicroは小さなブロックの先頭位置であり、最初1に設定される。nwidthmicroは、小さなブロックの幅であり、最初は全体のブロック幅に設定される。iblksmicromaxは、小さなブロックの最大値であり、これ以上大きいときブロック幅を更に小さく(例えば、80列に)する。nothrdはスレッド番号、numthrdはスレッド数、各ノードで重複して持つ1次元配列ip(n)に行の入れ替え情報を入れる。
【0059】
ステップS61では、nwidthmicro<=iblksmicromaxであるか否かを判断する。ステップS61の判断がYESの場合には、ステップS61において、iblksmicro=nwidthmicroとし、各ノードに分担した領域にある対角ブロックと分割したブロックが格納されているwlu(lenmacro,iblksmacro)のwlu(istmicro:lenmacro,istmicro:iblksmicro+iblksmicro-1)の部分に関して対角部分wlu(istmicro:istmicro+iblksmicro-1,istmicro:istmicro+iblksmicro-1)を対角ブロックとする。また、irest=istmicro+iblksmicroとし、wlu(irest:lenmacro,istmicro:istmicro+iblksmicro-1)を1次元目でスレッド数で均等分割したものを対角ブロックと結合して、各スレッド毎の領域wlumicroにコピーする。すなわち、lenmicro=(lenmaro-irest+numthrd)/numthrdとし、wlumicro(lenmicro+iblksmicro,iblksmicro)にコピーし、lenblksmicro=lenmicro+iblksmicroとする。そして、ステップS63で、サブルーチンLUmicroを呼び出す。これにおいては、wlumicro(linmicro+iblksmicro,iblksmicro)を受け渡す。ステップS64では、wlumicroに分割していた部分を、対角部分は1つのスレッドから、他の部分は各スレッドのwlumicroからwluに元々あった部分に戻す。そして、サブルーチンを抜ける。
【0060】
ステップS61の判断がNOの場合には、ステップS65において、nwidthmicro>=3*iblksmicromaxまたは、nwidthmicro<=2*iblksmicromaxか否かを判断する。ステップS65の判断がYESの場合には、ステップS66において、nwidthmicro2=nwidthmicro/2、istmicro2=istmicro+nwidthmicro2、nwidthmicro3=nwidthmicro-nwidthmicro2とし、ステップS68に進む。ステップS65の判断がNOの場合には、ステップS67において、nwidthmicro2=nwidthmicro/3, istmicro2=istmicro+nwidthmicro2, nwidthmicro3=nwidthmicro-nwidthmicro2とし、ステップS68に進む。ステップS68では、istimicroは、そのまま、nwidthmicroとしてnwidthmicro2を渡してサブルーチンinterLUを呼び出す。
【0061】
ステップS69においては、wlu(istmicro:istmacro+nwidthmicro-1)の部分を更新する。これは、一つのスレッドで更新すれば充分である。これにwlu(istmicro:istmacro+nwidthmicro2-1,istmicro:istmacro+nwidthmicro2-1)の下三角行列の逆行列を左から乗じたもので更新する。ステップS70においては、wlu(istmicro2:lenmacro,istmicro2:istmicro2+nwidthmicro3-1)をwlu(istmicro2:lenmacro,istmicro:istmicro2-1)×wlu(istmmicro:istmacro+nwidthmicro2-1,istmacro+
nwidthmicro2:istmacro+nwidthmicro-1)を引いて更新する。このとき、1次元目をスレッド数で均等に分割して並列計算する。ステップS71においては、istmicroとして、istmicro2、nwidthmicroとしてnwidthmicro3を渡してサブルーチンinterLUを呼び出し、サブルーチンを終了する。
【0062】
図18及び図19は、サブルーチンLUmicroのフローである。
ステップS75において、A(k、n/numnord)、wlu1(lenblks,iblksmacro)、wlumicro(leniblksmicro,iblksmicro)を引数として受ける。ここで、wlumicroをL2キャッシュの大きさの各スレッドに確保されたものを受ける。本ルーチンでwlumicroに格納された部分のLU分解を行う。istは、LU分解するブロックの先頭位置で最初は、1とされる。nwidthは、ブロック幅であり、最初は全体のブロック幅である。iblksmaxは、ブロック最大値(8程度)であり、これ以上小さくしない。wlumicroはスレッド毎に引数として渡される。
【0063】
ステップS76においては、nwidth<=iblksmaxか否かを判断する。ステップS76の判断がNOの時は、ステップS88に進む。ステップS76の判断がYESの場合には、ステップS77において、i=istとして、ステップS78において、i<ist+nwidthか否かを判断する。ステップS78の判断がNOの場合には、サブルーチンを抜ける。ステップS78の判断がYESの場合には、ステップS79において、各スレッドでi列目の絶対値最大の要素を見つけ、共用メモリ領域にスレッド番号順に格納する。ステップS80においては、各ノードでのノード内の最大ピボットをこの中から見つけ、この要素とノード番号、位置をセットとして全ノードが各セットを持つように通信し、各ノードで全ノードでの最大ピボットを決定する。なお、各ノードで同じ方法で最大ピボットを決定する。
【0064】
ステップS81においては、このピボット位置が各ノードが持つ対角ブロックの中か判定する。ステップS81の判断がNOの場合には、ステップS85に進む。ステップS81の判断がYESの場合には、ステップS82において、最大ピボットの位置が各スレッドが重複して持つ対角ブロックの中かを判定する、ステップS82の判断がYESの場合には、ステップS83において、全ノードで保持する対角ブロック内での入れ替えで、かつ、全スレッドで重複して持つ対角部分内での入れ替えなので、スレッドで独立してピボットの入れ替えを行う。入れ替えた位置を配列ipに格納し、ステップS86に進む。ステップS82における判断がNOの場合には、ステップS84において、各ノードで独立にピボットとを交換する。交換すべきピボット行を共用域に格納して、各スレッドの対角ブロック部分と入れ替える。入れ替えた位置を配列ipに格納し、ステップS86に進む。
【0065】
ステップS85では、ノード間で通信して最大ピボットを有するノードから交換すべき行ベクトルをコピーする。その後ピボット行を入れ替える。ステップS86においては、行を更新し、ステップS87において、i列と行で更新部分を更新し、i=i+1として、ステップ78に戻る。
【0066】
ステップS88においては、nwidth>=3*iblksmaxあるいは、nwidth<=2*iblksmaxであるか否かを判断する。ステップS88の判断がYESの場合には、ステップS89において、nwidth=nwidth/2、ist2=ist+nwidth2とし、ステップS91に進む。ステップS88の判断がNOの場合には、ステップS90において、nwidth2=nwidth/3、ist2=ist+nwidth2、nwidth3=nwidth-nwidth2とし、ステップS91に進む。ステップS91では、istはそのまま、nwidthとしてnwidth2を引数として渡して、サブルーチンLUmicroを呼び出す。ステップS92では、wlumicro(istmicro:istmacro+nwidth2-1,istmicro+nwidth2:istmicro+nwidthmicro-1)の部分を更新する。wlumicro(istmicro:istmacro+nwidth2-1,istmicro:istmacro+nwidth2-1)の下三角行列の逆行列を左から乗したもので更新する。ステップS93では、wlumicro(istmicro2:lenmacro,istmicro2:istmicro2+nwidthmicro3-1)をwlumicro(istmicro2:lenmacro,istmicro:istmicro2-1)×wlumicro(istmicro:istmacro+nwidth2-1,ist+nwidth2:ist+nwidthmicro-1)を引いて更新する。ステップS94においてはistとしてist2、nwidthとしてnwidth3を引数として受け渡して、サブルーチンLUmicroを呼び出して、サブルーチンを抜ける。
【0067】
図20は、サブルーチンbtocのフローである。
ステップS100において、A(k、n/numnord)、wlu1(lenblks,iblksmacro)、bufs(lenblks,iblksunit)、bufd(lenblks,iblksunit)を引数で受けて、各ノードのi番目の幅iblksunitのブロックをnumnord個束ねたものの対角ブロック行列部分iblksmacro×iblksmacroより下の部分をnumnord個に分割したものと対角ブロックを加えたものを各ノードに分散配置したものに転送を利用して配置を変える。
【0068】
ステップS101では、nbase=(i-1)*iblksmacro(iは呼び出しもとのメインループの繰り返し回数)、ibs=nbase+1、ibe=nbase+iblksmacro、len=(n-ibe)/numnord、nbase2d=(i-1)*iblksunit、ibs2d=nbase2d+1、ibe2d=ibs2d+iblksunitとし、送信データ数は、lensend=(len+iblksmacro)*iblksunitとする。
【0069】
ステップS102において、iy=1とし、ステップS103において、iy>numnordか否かを判断する。ステップS103の判断がYESの場合、サブルーチンを抜ける。ステップS103の判断がNOの場合には、ステップS104において、送信する部分、受信する部分を決める。すなわち、idst=mod(nonord-1+iy-1,numnord)+1、isrs=mod(nonord-1+numnord-iy+1,numnord)+1とする。ステップS105においては、計算結果が格納されているwlu1から元の位置に配置を戻すための送信のためにバッファに格納する。idst番目のノードに対応部分を送る。すなわち、icp2ds=(idst-1)*iblksunit+1、icp2de=icp2ds+iblksunit-1、bufd(1:len+iblksunit,1:iblksunit)←wlu1(1:len+iblksmacro,icp2ds:icp2de)とする。1次元目をスレッド数で分割して各スレッドで並列コピーする。
【0070】
ステップS106では、全ノードで送受信する。bufdの内容をidst番目のノードに送り、bufsに受信する。ステップS107で送受信の完了を待ち、ステップS108において、バリア同期を取る。ステップS109では、各ノードで自分に割り付いている幅iblksunitの対角ブロック部分と、その下の部分のブロックの1次元目をnumnordで分割した部分で再配置したときの部分(転送先のノード数番目のもの)を元々あった部分に格納する。A(ibs:ibe,ibs2d:ibd2d)←bufs(1:iblksmacro,1:iblksunit)、icps=ibe+(isrs-1)*len+1、icpe=isps+len-1、A(icps:icpe,ibs2d:ibe2d)←bufs(iblksmacro+1:len+iblksmacro,1:iblksunit)とする。このコピーは1次元目をスレッド数に分割して各スレッドで列毎に処理する。
【0071】
ステップS110においては、iy=iy+1として、ステップS103に戻る。
図21は、サブルーチンexrwのフローである。
このサブルーチンは、行の入れ替え及び行ブロックの更新を行うものである。
【0072】
ステップS115においては、A(k、n/numnord)、wlu1(lenblks、iblksmacro)を引数として受ける。wlu1(1:iblksmacro,1:iblksmacro)には、LU分解された対角部分を全ノードが重複して持っている。nbdiag=(i-1)*iblksmacroとする。iは呼び出し元のサブルーチンpLUのメインループの繰り返し回数である。また、ピボットの入れ替えの情報が、ip(nbdiag+1:nbdiag+iblksmacro)に格納されている。
【0073】
ステップS116では、nbase=i*iblksunit(iは呼び出しもとのサブルーチンpLUのメインループの繰り返し回数)、irows=nbase+1、irowe=n/numnord、len=(irowe-irows+1)/numthrd、is=nbase+(nothrd-1)*len+1、ie=min(irowe,is+len-1)とする。ステップS117では、ix=isとする。
【0074】
ステップS118では、is<=ieであるか否かを判断する。ステップS118の判断がNOの場合には、ステップS125に進む。ステップS118の判断がYESの場合には、ステップS119において、nbdiag=(i-1)*iblksmacro、j=nbdag+1として、ステップS120において、j<=nbdiag+iblksmacroであるか否かを判断する。ステップS120の判断がNOの場合には、ステップS124に進む。ステップS120の判断がYESの場合には、ステップS121において、ip(j)>jか否かを判断する。ステップS121の判断がNOの場合には、ステップS123に進む。ステップS121の判断がYESの場合には、ステップS122において、A(j、ix)とA(ip(j),ix)を入れ替えて、ステップS123に進む。ステップS123においては、j=j+1として、ステップS120に戻る。
【0075】
ステップS124においては、ix=ix+1とし、ステップS118に戻る。
ステップS125においては、バリア同期(全ノード、全スレッド)を取る。ステップS126においては、A(nbdiag+1:nbdiag+iblksmacro,is:ie)←TRL(wlu1(i:iblksmacro,1:iblksmacro))-1×A(nbdiag+1:nbdiag+iblksmacro,is:ie)を全ノード、全スレッドで更新する。ここで、TRL(B)は、行列Bの下三角部分を示す。ステップS127では、バリア同期(全ノード、全スレッド)を取って、サブルーチンを抜ける。
【0076】
図22及び図23は、サブルーチンmmcbtのフローである。
ステップS130において、A(k、n/numnord)、wlu1(lenblks、iblksmacro)、wlu2(lenblks,iblksmacro)を引数として受ける。wlu1に、ブロック幅iblksmacroのブロックをLU分解した結果で、対角ブロックとその下位ブロックを1次元目でnumnord個に分割した一つが格納されている。分割した順にノード番号に対応し、ノードに再配置される。これをノードのリングに沿って転送しながら(計算と同時に行う)行列積を行いながら更新する。計算の裏で性能に影響を与えないので計算に直接使用しない対角ブロック部分も一緒に送る。
【0077】
ステップS131では、nbase=(i-1)*iblksmacro(iは呼び出しもとのサブルーチンpLUのメインループの繰り返し回数)、ibs=nbase+1、ibe=nbase+iblksmacro、len=(n-ibe)/numnord、nbase2d=(i-1)*iblksunit、ibs2d=nbase2d+1、ibe2d=ibs2d+iblksunit、n2d=n/numnord、lensend=len+iblksmacroとし、送信データ数は、nwlen=lensend*iblksmacroとする。
【0078】
ステップS132において、iy=1(初期値を設定)、idst=mod(nonord,numnord)+1(送り先ノード番号(隣ノード))、isrs=mod(nonord-1+numnord-1,numnord)+1(発信元ノード番号)、ibp=idstとする。
【0079】
ステップS133において、iy>numnordであるか否かを判断する。ステップS133の判断がYESの場合には、サブルーチンを抜ける。ステップS133の判断がNOの場合には、ステップS134において、iy=1か否かを判断する。ステップS134の判断がYESの場合には、ステップS136に進む。ステップS134の判断がNOの場合には、ステップS135において送受信の官僚を待つ。ステップS136では、iy=numnord(奇数の最後)であるか否かを判断する。ステップS136の判断がYESの場合には、ステップS138に進む。ステップS136の判断がNOの場合には、ステップS137において、送受信を行う。wlu1の内容を(対角ブロックも含めて)隣のノード(ノード番号idst)に送る。かつ、wlu2に(ノード番号isrsから)送られてくるデータを格納する。送受信データ長はnwlenとする。
【0080】
ステップS138において、wlu1のデータを使った更新のポジションを計算する。ibp=mod(ibp-1+numnord-1,numnord)+1、ncptr=nbe+(ibp-1)*len+1(1次元目の開始位置)とする。ステップS139では、行列積を計算するサブルーチンpmmを呼び出す。このときwlu1を引き渡す。ステップS140において、iy=numnord(最後の処理が終わった)か否かを判断する。ステップS140の判断がYESの場合には、サブルーチンを抜ける。ステップS140の判断がNOの場合には、ステップS141において、行列積演算と同時に行っている送受信の完了を待つ。ステップS142において、iy=numnord-1(偶数の最後)であるか否かを判断する。ステップS142の判断がNOの場合には、ステップS144に進む。ステップS142の判断がNOの場合には、ステップS143において、送受信を行う。すなわち、wlu2の内容を(対角ブロックも含めて)隣のノード(ノード番号idst)に送る。かつ、wlu1に(ノード番号isrsから)送られてくるデータを格納する。送受信データ長はnwlenとする。
【0081】
ステップS144では、wlu2のデータを使った更新のポジションを計算する。すなわち、ibp=mod(ibp-1+numnord-1,numnord)+1、ncptr=nbe+(ibp-1)*len+1(1次元目の開始位置)とする。
【0082】
ステップS145では、行列積を計算するサブルーチンpmmを呼び出す。このとき、wlu2を引き渡す。ステップS146において、iy=iy+2と、2を加えて、ステップS133に戻る。
【0083】
図24は、サブルーチンpmmのフローである。
ステップS150において、A(k、n/numnord)、wlu1(lenblks、iblksmacro)、もしくは、wlu2(lenblks,iblksmacro)をwlux(lenblks,iblksmacro)に受ける。呼び出し元から渡された1次元目の開始位置ncptrを使って正方形の領域を更新する。is2d=i*iblksunit+1、ie2d=n/numnord、len=ie2d-is2d+1、isld=ncptr、ield=nptr+len-1(iはサブルーチンpLUの繰り返し数)、A(isld:ield,is2d:ie2d)=A(isld:ield,is2d:ie2d)-wlu(iblksmacro+1:iblksmacro+len,1:iblksmacro)×A(isld-iblksmacro:isld-1,is2d:ie2d)(式1)とする。
【0084】
ステップS151において、並列に処理するスレッド数の平方根を求めて切り上げる。numroot=int(sqrt(numthrd))、もし、sqrt(numthrd)-numrootが0でないなら、numroot=numroot+1とする。ここで、intは小数点以下切り捨て、sqrtは、平方根である。ステップS152において、m1=numroot、m2=numroot、mx=m1とする。ステップS153において、m1=mx、mx=mx-1、mm=mx×m2とする。ステップS154において、mm<numthrdであるか否かを判断する。ステップS154の判断がNOの場合には、ステップS153に戻る。ステップS154の判断がYESの場合には、ステップS155において、更新する領域を1次元目をm1等分する。2次元目をm2等分して、m1×m2個の矩形にする。そのうち、numthrd個を各スレッドに割り当てて、(式1)の対応部分を並列に計算する。(1,1)、(1,2)、・・・(1,m2)、(2,1)・・・・と2次元目の方向に順番にスレッドを対応付けていく。
【0085】
ステップS156において、m1*m2-numthrd>0か否かを判断する。ステップS156の判断がYESの場合には、ステップS158に進む。ステップS156の判断がNOの場合には、ステップS157において、残りの矩形は最後の矩形の最後の行、1行の最後からm1*m2-numthrd個が更新されずに残っている。この矩形を結合して1つの矩形と考え、2次元目をスレッド数numthrdで分割して(式1)の対応部分を並列に計算する。そして、ステップS158において、バリア同期(スレッド間)をとって、サブルーチンを抜ける。
【0086】
図25は、サブルーチンfbluのフローである。
ステップS160において、A(k、n/numnord)、wlu1(iblksmacro、iblksmacro)、bufs(iblksmacro、iblksunit)、bufd(iblksmacro、iblksunit)を引数で受けて、各ノードの幅iblksunitの最後のブロックをnumnord個束ねたものを各ノードで重複して持つように利用不足部分を各ノードに送る。各ノードがiblksmacro×iblksmacroのブロックを重複して持った後、各ノードで同じ行列に対してLU分解を行う。LU分解が完了したら、各ノードに配置されていた部分をコピーバックする。
【0087】
ステップS161では、nbase=n-iblksmacro、ibs=nbase+1、ibe=n、len=iblksmacro、nbase2d=(i-1)*iblksunit、ibs2d=n/numnord-iblksunit+1、ibe2d=n/numnordとし、送信データ数はlensend=iblksmacro*iblksunitとし、iy=1とする。
【0088】
ステップS162においては、バッファへのコピーを行う。すなわち、bufd(1:iblksmacro,1:iblksunit)←A(ibs:ibe,ibs2d:ibe2d)とする。ステップS163においては、iy>numnordか否かを判断する。ステップS163の判断がYESの場合には、ステップS170に進む。ステップS163の判断がNOの場合には、ステップS164において、送信する部分、受信する部分を決定する。すなわち、idst=mod(nonord-1+iy-1,numnord)+1、isrs=mod(nonord-1+numnord-iy+1,numnord)+1とする。ステップS165では、全ノードで送受信する。bufdの内容をidst番目のノードに送る。ステップS166においては、bufsにデータを受信し、送受信の完了を待つ。ステップS167において、バリア同期を取り、ステップS168において、wlu1の対応位置にisrs番目のノードから来たデータを格納する。icp2ds=(isrs-1)*iblksunit+1、icp2de=icp2ds+iblksunit-1、wlu(1:iblksmacro,icp2ds:icp2de)←bufs(1:iblksunit,1:iblksunit)とする。ステップS169において、iy=iy+1とし、ステップS163に戻る。
【0089】
ステップS170では、バリア同期をとり、ステップS171では、wlu1の上でiblksmacro×iblksmacroのLU分解を各ノードで重複して行う。行交換の情報は、ipに格納する。LU分解が終了したら、自ノード分を最後のブロックにコピーバックする。すなわち、is=(nonord-1)*iblksunit+1、ie=is+iblksunit-1、A(ibs:ibe,ibs2d:ibe2d)←wlu1(1:iblksmacro,is:ie)として、サブルーチンを抜ける。
(付記1)複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理方法であって、
ノード毎にサイクリックに割り付けられた行列の部分の列ブロックの1巻き分を、該1巻き分をまとめたものを対象にして処理するために、各ノードに一つずつ分散して配置する第1の配置ステップと、
該1巻き分を結合したブロックに対して対角部分と該対角ブロックの下側にある列ブロックと他のブロックに分離する分離ステップと、
該対角ブロックを各ノードに冗長に配置すると共に、該列ブロックを1次元目で分割することによって得られるブロックを該複数のノードに、共に並列通信して一つずつ配置する第2の配置ステップと、
該対角ブロックと配置されたブロックを、各ノード間で通信しながら、各ノードで並列にLU分解するLU分解ステップと、
LU分解されたブロックを用いて、行列の他のブロックを更新する更新ステップと、
を備えることを特徴とする行列処理方法を情報装置に実現させるプログラム。
【0090】
(付記2)前記LU分解は、再帰的手続きにより、各ノードの各プロセッサで並列的に行われることを特徴とする付記1に記載のプログラム。
(付記3)前記更新ステップにおいては、各ノードが、列ブロックを計算している間に、計算し終わった部分のデータであって、他のブロックの更新に必要なデータを該計算と平行して他のノードに転送することを特徴とする付記1に記載のプログラム。
【0091】
(付記4)前記並列計算機は、SMP(SymmetricMultiProcessor)を各ノードとするSMPノード分散メモリ型並列計算機であることを特徴とする付記1に記載のプログラム。
【0092】
(付記5)複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理装置であって、
ノード毎にサイクリックに割り付けられた行列の部分の列ブロックの1巻き分を、該1巻き分をまとめたものを対象にして処理するために、各ノードに一つずつ分散して配置する第1の配置手段と、
該1巻き分を結合したブロックに対して対角部分と該対角ブロックの下側にある列ブロックと他のブロックに分離する分離手段と、
該対角ブロックを各ノードに冗長に配置すると共に、該列ブロックを1次元目で分割することによって得られるブロックを該複数のノードに、共に並列通信して一つずつ配置する第2の配置手段と、
該対角ブロックと配置されたブロックを、各ノード間で通信しながら、各ノードで並列にLU分解するLU分解手段と、
LU分解されたブロックを用いて、行列の他のブロックを更新する更新手段と、
を備えることを特徴とする行列処理装置。
【0093】
(付記6)複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理方法であって、
ノード毎にサイクリックに割り付けられた行列の部分の列ブロックの1巻き分を、該1巻き分をまとめたものを対象にして処理するために、各ノードに一つずつ分散して配置する第1の配置ステップと、
該1巻き分を結合したブロックに対して対角部分と該対角ブロックの下側にある列ブロックと他のブロックに分離する分離ステップと、
該対角ブロックを各ノードに冗長に配置すると共に、該列ブロックを1次元目で分割することによって得られるブロックを該複数のノードに、共に並列通信して一つずつ配置する第2の配置ステップと、
該対角ブロックと配置されたブロックを、各ノード間で通信しながら、各ノードで並列にLU分解するLU分解ステップと、
LU分解されたブロックを用いて、行列の他のブロックを更新する更新ステップと、
を備えることを特徴とする行列処理方法。
【0094】
(付記7)複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理方法であって、
ノード毎にサイクリックに割り付けられた行列の部分の列ブロックの1巻き分を、該1巻き分をまとめたものを対象にして処理するために、各ノードに一つずつ分散して配置する第1の配置ステップと、
該1巻き分を結合したブロックに対して対角部分と該対角ブロックの下側にある列ブロックと他のブロックに分離する分離ステップと、
該対角ブロックを各ノードに冗長に配置すると共に、該列ブロックを1次元目で分割することによって得られるブロックを該複数のノードに、共に並列通信して一つずつ配置する第2の配置ステップと、
該対角ブロックと配置されたブロックを、各ノード間で通信しながら、各ノードで並列にLU分解するLU分解ステップと、
LU分解されたブロックを用いて、行列の他のブロックを更新する更新ステップと、
を備えることを特徴とする行列処理方法を情報装置に実現させるプログラムを格納する、情報装置読み取り可能な記録媒体。
【0095】
【発明の効果】
ブロックを動的に1次元目の分割にして処理し、分解した後の各ノードの情報を使って更新し、転送は計算と同時に行える。このため更新部分は負荷はノード間で完全に均等になり、転送量はノード数分の1に削減できる。
【0096】
ブロック幅を大きくすると負荷のバランスが崩れる従来の方法に対し負荷が均等になるため並列化効率が10%程度向上する。また、転送量が減ることで3%程度の並列化率の向上に寄与でき、転送スピードがSMPノードの計算性能に比べて遅くなっても影響は受けにくい。
【0097】
ブロック部分のLU分解をノード間で並列計算することによって、ブロック幅を大きくしたとき並列化出来ない部分の割合が増加するため並列化効率が落ちる部分をキャンセルできて約10%の並列化効率の向上が見込める。また、ブロックLU分解を、ミクロなブロックをベースにした再帰的プログラミングを使うことで、対角ブロックも含めてSMPの並列化ができてSMPでの並列処理での性能劣化を抑えることができる。
【図面の簡単な説明】
【図1】本発明の実施形態が適用されるSMPノード分散メモリ型並列計算機の概略全体構成を示す図である。
【図2】本発明の実施形態に従った全体の処理フローチャートである。
【図3】本発明の実施形態の一般概念図である。
【図4】比較的ブロック幅の小さなブロックをサイクリックに配置した状態を説明する図(その1)である。
【図5】比較的ブロック幅の小さなブロックをサイクリックに配置した状態を説明する図(その2)である。
【図6】図4及び図5で配置されたブロックの更新処理を説明する図である。
【図7】再帰的なLU分解の手順を説明する図である。
【図8】対角部分以外の部分ブロックの更新について説明する図である。
【図9】行ブロックの更新処理を説明する図(その1)である。
【図10】行ブロックの更新処理を説明する図(その2)である。
【図11】行ブロックの更新処理を説明する図(その3)である。
【図12】本発明の実施形態のフローチャート(その1)である。
【図13】本発明の実施形態のフローチャート(その2)である。
【図14】本発明の実施形態のフローチャート(その3)である。
【図15】本発明の実施形態のフローチャート(その4)である。
【図16】本発明の実施形態のフローチャート(その5)である。
【図17】本発明の実施形態のフローチャート(その6)である。
【図18】本発明の実施形態のフローチャート(その7)である。
【図19】本発明の実施形態のフローチャート(その8)である。
【図20】本発明の実施形態のフローチャート(その9)である。
【図21】本発明の実施形態のフローチャート(その10)である。
【図22】本発明の実施形態のフローチャート(その11)である。
【図23】本発明の実施形態のフローチャート(その12)である。
【図24】本発明の実施形態のフローチャート(その13)である。
【図25】本発明の実施形態のフローチャート(その14)である。
【図26】スーパスカラ並列計算機用LU分解法のアルゴリズムを概略説明する図である。
【符号の説明】
10 相互結合網(バス)
11−1〜11−n メモリモジュール
12−1〜12−m キャッシュ
13−1〜13−m プロセッサ
14 データ通信用ハード(DTU)
Claims (5)
- 複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理方法であって、
処理すべき行列を格納した配列A(1:k、1:k)をノード数nで分割し、それぞれ、A(1:k/n、1:k)、・・・、A(k(n−1)/n:k、1:)とし、そのうちの一つの配列を整数mで更に幅の狭いブロックに分割し、該配列内の更に分割した幅の狭いブロックの第1番目を第1番目のノードに、第2番目を第2番目のノードに、・・・、第m番目を第 mod (m−1、n)+1番目のノードに配置するように、各ノードがメモリからデータを読み出し、取得する第1の配置ステップと、
各ノードにおいて、該第1の配置ステップで各ノードに配置されたブロックのデータから行列の対角ブロックA( nbase : nbase +m、 nbase : nbase +m)( nbase 、mは整数)に対応するデータを取り除く除去ステップと、
該ノードにおいて除去された該対角ブロックの同じデータを各ノードに共通に配置する第2の配置ステップと、
各ノードにおいて、該対角ブロックと配置されたブロックをLU分解するLU分解ステップと、
各ノードにおいて、LU分解されたブロックを用いて、行列のまだLU分解されていないブロックを更新する更新ステップと、
を実行することを特徴とする行列処理方法。 - 前記LU分解は、再帰的手続きにより、各ノードの各プロセッサで並列的に行われることを特徴とする請求項1に記載の行列処理方法。
- 前記更新ステップにおいては、各ノードが、列ブロックを計算している間に、計算し終わった部分のデータであって、他のブロックの更新に必要なデータを該計算と平行して他のノードに転送することを特徴とする請求項1に記載の行列処理方法。
- 前記並列計算機は、SMP(SymmetricMultiProcessor)を各ノードとするSMPノード分散メモリ型並列計算機であることを特徴とする請求項1に記載の行列処理方法。
- 複数のプロセッサとメモリを含む複数のノードをネットワークで接続した並列計算機における行列処理装置であって、
処理すべき行列を格納した配列A(1:k、1:k)をノード数nで分割し、それぞれ、A(1:k/n、1:k)、・・・、A(k(n−1)/n:k、1:)とし、そのうちの一つの配列を整数mで更に幅の狭いブロックに分割し、該配列内の更に分割した幅の狭いブロックの第1番目を第1番目のノードに、第2番目を第2番目のノードに、・・・、第m番目を第 mod (m−1、n)+1番目のノードに配置するように、各ノードにメモリからデータを読み出し、取得させる第1の配置手段と、
各ノードにおいて、該第1の配置ステップで各ノードに配置されたブロックのデータから行列の対角ブロックA( nbase : nbase +m、 nbase : nbase +m)( nbase 、mは整数)に対応するデータを取り除く除去手段と、
該ノードにおいて除去された該対角ブロックの同じデータを各ノードに共通に配置させる第2の配置手段と、
該対角ブロックと配置されたブロックをLU分解するLU分解手段と、
LU分解されたブロックを用いて、行列のまだLU分解されていないブロックを更新する更新手段と、
を備えることを特徴とする行列処理装置。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003095720A JP3983193B2 (ja) | 2003-03-31 | 2003-03-31 | 行列処理方法及び装置 |
US10/798,287 US20040193841A1 (en) | 2003-03-31 | 2004-03-12 | Matrix processing device in SMP node distributed memory type parallel computer |
DE102004015599A DE102004015599A1 (de) | 2003-03-31 | 2004-03-30 | Matrizenverarbeitungsvorrichtung in einem Parallelrechner vom SMP-knotenverteilten Speichertyp |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003095720A JP3983193B2 (ja) | 2003-03-31 | 2003-03-31 | 行列処理方法及び装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2004302928A JP2004302928A (ja) | 2004-10-28 |
JP3983193B2 true JP3983193B2 (ja) | 2007-09-26 |
Family
ID=32985471
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003095720A Expired - Fee Related JP3983193B2 (ja) | 2003-03-31 | 2003-03-31 | 行列処理方法及び装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20040193841A1 (ja) |
JP (1) | JP3983193B2 (ja) |
DE (1) | DE102004015599A1 (ja) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7792895B1 (en) * | 2006-06-16 | 2010-09-07 | Nvidia Corporation | Efficient matrix multiplication on a parallel processing device |
US7912889B1 (en) * | 2006-06-16 | 2011-03-22 | Nvidia Corporation | Mapping the threads of a CTA to the elements of a tile for efficient matrix multiplication |
US8316360B2 (en) * | 2006-09-29 | 2012-11-20 | Intel Corporation | Methods and apparatus to optimize the parallel execution of software processes |
WO2008136047A1 (ja) * | 2007-04-19 | 2008-11-13 | Fujitsu Limited | Smpノードからなるメモリ分散型並列計算機システム向けlu分解の並列処理方法 |
US8966461B2 (en) * | 2011-09-29 | 2015-02-24 | Advanced Micro Devices, Inc. | Vector width-aware synchronization-elision for vector processors |
US9298707B1 (en) * | 2011-09-30 | 2016-03-29 | Veritas Us Ip Holdings Llc | Efficient data storage and retrieval for backup systems |
US10949200B2 (en) | 2013-06-16 | 2021-03-16 | President And Fellows Of Harvard College | Methods and apparatus for executing data-dependent threads in parallel |
JP6503902B2 (ja) * | 2015-06-02 | 2019-04-24 | 富士通株式会社 | 並列計算機システム、並列計算方法及びプログラム |
CN105045565A (zh) * | 2015-07-14 | 2015-11-11 | 郑州航空工业管理学院 | 适合分布式并行计算的PBiCOR方法 |
US9846623B2 (en) * | 2015-08-20 | 2017-12-19 | Qsigma, Inc. | Simultaneous multi-processor apparatus applicable to acheiving exascale performance for algorithms and program systems |
JP6607078B2 (ja) * | 2016-02-23 | 2019-11-20 | 富士通株式会社 | 並列計算機、並列lu分解方法及び並列lu分解プログラム |
JP6610350B2 (ja) * | 2016-03-11 | 2019-11-27 | 富士通株式会社 | 計算機、行列分解方法、及び行列分解プログラム |
JP6666548B2 (ja) | 2016-03-14 | 2020-03-18 | 富士通株式会社 | 並列計算機、fft演算プログラムおよびfft演算方法 |
CN107273339A (zh) * | 2017-06-21 | 2017-10-20 | 郑州云海信息技术有限公司 | 一种任务处理方法及装置 |
CN107301155A (zh) * | 2017-06-27 | 2017-10-27 | 郑州云海信息技术有限公司 | 一种数据处理方法及处理装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4493048A (en) * | 1982-02-26 | 1985-01-08 | Carnegie-Mellon University | Systolic array apparatuses for matrix computations |
JP3639323B2 (ja) * | 1994-03-31 | 2005-04-20 | 富士通株式会社 | メモリ分散型並列計算機による連立1次方程式計算処理方法および計算機 |
JP3639206B2 (ja) * | 2000-11-24 | 2005-04-20 | 富士通株式会社 | 共有メモリ型スカラ並列計算機における並列行列処理方法、及び記録媒体 |
US7236998B2 (en) * | 2003-09-25 | 2007-06-26 | International Business Machines Corporation | System and method for solving a large system of dense linear equations |
-
2003
- 2003-03-31 JP JP2003095720A patent/JP3983193B2/ja not_active Expired - Fee Related
-
2004
- 2004-03-12 US US10/798,287 patent/US20040193841A1/en not_active Abandoned
- 2004-03-30 DE DE102004015599A patent/DE102004015599A1/de not_active Withdrawn
Also Published As
Publication number | Publication date |
---|---|
DE102004015599A1 (de) | 2004-10-28 |
US20040193841A1 (en) | 2004-09-30 |
JP2004302928A (ja) | 2004-10-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3983193B2 (ja) | 行列処理方法及び装置 | |
US5887186A (en) | Method of solving simultaneous linear equations in a memory-distributed parallel computer | |
Hinrichs et al. | An architecture for optimal all-to-all personalized communication | |
Kumar et al. | Optimization of all-to-all communication on the blue gene/l supercomputer | |
EP0388794A3 (en) | Method and apparatus for optimizing element placement and deciding the optimal element placement | |
CN113344172A (zh) | 将卷积映射到通道卷积引擎 | |
Selvitopi et al. | A novel method for scaling iterative solvers: Avoiding latency overhead of parallel sparse-matrix vector multiplies | |
US20190130274A1 (en) | Apparatus and methods for backward propagation in neural networks supporting discrete data | |
CN112712457B (zh) | 数据处理方法以及人工智能处理器 | |
US11748287B2 (en) | Networked computer with multiple embedded rings | |
JP6503902B2 (ja) | 並列計算機システム、並列計算方法及びプログラム | |
JP2006085619A (ja) | 帯係数行列を持つ連立1次方程式の解法プログラム | |
Jacquelin et al. | Enhancing scalability and load balancing of parallel selected inversion via tree-based asynchronous communication | |
JP3638411B2 (ja) | メモリ分散型並列計算機による連立一次方程式の計算処理方法および並列計算機 | |
JP6666548B2 (ja) | 並列計算機、fft演算プログラムおよびfft演算方法 | |
Gupta et al. | Performance analysis of a synchronous, circuit-switched interconnection cached network | |
US11995554B2 (en) | Apparatus and methods for backward propagation in neural networks supporting discrete data | |
JP6511937B2 (ja) | 並列計算機システム、演算方法、演算プログラム、及び情報処理装置 | |
Johnsson et al. | Optimal all-to-all personalized communication with minimum span on boolean cubes | |
JP2005504394A (ja) | デジタル信号処理でコンボリューション演算を効率的に行うプログラマブルアレイ | |
Ding et al. | Matrix transpose on meshes with wormhole and XY routing | |
JP4037303B2 (ja) | 共有メモリ型スカラ並列計算機用固有値問題の並列処理方法 | |
US11907725B2 (en) | Communication in a computer having multiple processors | |
Bourgeois et al. | Constant time fault tolerant algorithms for a linear array with a reconfigurable pipelined bus system | |
Wang | An efficient O (1) time 3D all nearest neighbor algorithm from image processing perspective |
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 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070420 |
|
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 |
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 |
|
LAPS | Cancellation because of no payment of annual fees |