複数の MPI コミュニケーターを使用する BLACS/Scalapack (C インターフェイス、Intel MKL バージョン) でいくつかのテストを行おうとしています。特に、取得しようとしているのは、(1 対 1) に対応する BLACS コンテキスト/グリッドのセットです。 (互いに素な) MPI コミュニケーターのセット。単一の「グローバル」コミュニケーター ( MPI_COMM_WORLD
) を使用する場合は問題ありませんが、複数のコミュニケーターの場合は問題があります。次の問題について、いくつかのヒントを教えていただければ幸いです。
への呼び出し後の BLACS コンテキスト変数値の更新について少し混乱しています。コミュニケーターCblacs_gridinit
に対応する「グローバル」コンテキストから始めるとしましょうMPI_COMM_WORLD
。次の呼び出しで、対応する BLACS コンテキストを取得できます。
MPI_Comm globalCommunicator(MPI_COMM_WORLD);
MKL_INT globalContext(Csys2blacs_handle(globalCommunicator));
その上にグリッドを作成します
Cblacs_gridinit(&globalContext,
&c_blacsGridOrdering,
MKL_INT i_nTaskRow,
MKL_INT i_nTaskCol);
たとえば、char c_blacsGridOrdering('R')
.
この場合の globalContext 値は 0 です。
6 つの MPI タスクを使用している私のコードのある時点で、localCommunicator
ID を持つ 4 つのタスクのグループに対応する MPI コミュニケーター ( )が作成されています。この時点で、このための新しい BLACS コンテキスト ( )[0;3]
を作成したいと思います。localContext
「ローカル」コミュニケーターとその上のローカル グリッド。私はコードでそれを行うことができます
MKL_INT localContext(Csys2blacs_handle(localCommunicator));
Cblacs_gridinit(&localContext,
&c_blacsGridOrdering,
MKL_INT i_nTaskRowLocal,
MKL_INT i_nTaskColLocal);
ここで、上記の関数呼び出しシーケンスは、ローカル コミュニケーターに含まれるタスクによってのみ実行されます。
の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 に期待されるものですか? ご支援いただきありがとうございます。