問題タブ [scalapack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - BLACS コンテキスト値と複数の MPI コミュニケーター
複数の MPI コミュニケーターを使用する BLACS/Scalapack (C インターフェイス、Intel MKL バージョン) でいくつかのテストを行おうとしています。特に、取得しようとしているのは、(1 対 1) に対応する BLACS コンテキスト/グリッドのセットです。 (互いに素な) MPI コミュニケーターのセット。単一の「グローバル」コミュニケーター ( MPI_COMM_WORLD
) を使用する場合は問題ありませんが、複数のコミュニケーターの場合は問題があります。次の問題について、いくつかのヒントを教えていただければ幸いです。
への呼び出し後の BLACS コンテキスト変数値の更新について少し混乱しています。コミュニケーターCblacs_gridinit
に対応する「グローバル」コンテキストから始めるとしましょうMPI_COMM_WORLD
。次の呼び出しで、対応する BLACS コンテキストを取得できます。
その上にグリッドを作成します
たとえば、char c_blacsGridOrdering('R')
.
この場合の globalContext 値は 0 です。
6 つの MPI タスクを使用している私のコードのある時点で、localCommunicator
ID を持つ 4 つのタスクのグループに対応する MPI コミュニケーター ( )が作成されています。この時点で、このための新しい BLACS コンテキスト ( )[0;3]
を作成したいと思います。localContext
「ローカル」コミュニケーターとその上のローカル グリッド。私はコードでそれを行うことができます
ここで、上記の関数呼び出しシーケンスは、ローカル コミュニケーターに含まれるタスクによってのみ実行されます。
のlocalContext
呼び出し後の値はCsys2blacs_handle
(ローカル コミュニケーターの各タスクに対して) 1 ですが、その後の の呼び出しによって変更され、0 に設定されCblacs_gridinit
ます。
明らかに、これはコードの残りの部分でいくつかの問題を引き起こします。たとえば、 へlocalContext
の呼び出しで に対応する MPI コミュニケーターを取得しようとCblacs2sys_handle
すると、初期の に対応する 6 つのタスク コミュニケーターが取得されるからglobalCommunicator
です。
ほとんどの場合、非常にばかげたエラー (いくつかの BLACS 関数の呼び出しが欠落している??) を行っているか、複数の MPI コミュニケーターと BLACS コンテキスト/グリッド間の相互作用が明確ではありませんが、コードの何が問題なのかを見つけることができません。
上記の問題に関して何か提案はありますか?助けてくれて本当にありがとうございます!
更新 1
観察された問題の解決策または少なくとも説明を見つけるのに役立つ可能性のある私の質問の更新があります。利用可能なすべての MPI タスクが含まれるようなサイズのタスク グリッド (たとえば、MKL_INT i_nTaskRow(1)
および など) MKL_INT i_nTaskCol(MPI_COMM_WORLD size)
。この動作は BLACS に期待されるものですか? ご支援いただきありがとうございます。
c++ - MKL ScaLapack の問題
http://acts.nersc.gov/scalapack/hands-on/etc/pddttrdrv/pddttrdrv.c.htmlから単純な Hello World (MKL) ScaLapack の例を実行しようとしていますが、問題に遭遇しました (使用していますMPICH2 で、私の OS は Windows です)。
MPI フラグを指定してコードを実行すると
-localonly 2
私は得る:
と
PDDTTRF, D&C alg.: only 1 block per proc
パラメータを再確認し、オンライン参照と比較して、値が正しいかどうかを確認しましたが、問題は見つからなかったようです.
コードは次のとおりです。
optimization - ScaLapack の操作、単語数とメッセージ数
Scalapackルーチンが実行する操作の数、特に送信するメッセージの数と単語の数をカウントする論文またはワーキングノートを誰かが知っているかどうか疑問に思っていました.
操作カウントに関しては、Golub と Van Loan の優れた Matrix Computations を参照するか、Lapack の LAWN 41 をチェックして、ScaLapack であまり変化しないと仮定することができますが、メッセージと単語のカウントについては何も見つけることができず、これは最終手段です。コードを調べます。
parallel-processing - プロセッサー数によって変化する scalapack を使用した線形システムの結果
Jonathanのコードを使用して A*X=B を解こうとしましたが、プロセッサの数によって結果が変わります。誰でもこの点で私を助けてくれませんか。
行列 A と B は scalapack の例です。それらをバイナリ形式で書き直しただけです。したがって、それらは上記のプログラムで使用できます。
とB
たとえば、1 つのプロセッサの場合:
mpirun -np 1 ./array 9 A.dat B.dat
および 2 プロセッサの場合
6 プロセッサの場合、エラーが表示されます
mpirun -np 6 ./a.out 9 A.dat B.dat
これは、scalapack の例では発生しません。
matrix - 分散下・上三角行列の上・下部分のインプレース復元
三角行列を一般的な行列に戻す、つまり下部/上部を上部/下部にコピーする Scalapack ルーチンが存在するかどうか疑問に思っていますが、まだ見つかりませんでした。対角線を操作して p?geadd を使用する簡単な回避策があることは知っていますが、それは理論的に必要なメモリの 2 倍のメモリを消費するので、その余裕はありません...だから、Scalapack/PBLAS がこの比較的単純な問題を解決するルーチンを提供しないでください。私より詳しい人がいたら教えてください!
-ありがとう