7

MPI_Isend に関して、MPI 標準は次のように述べています。 " ( http://www.mpi-forum.org/docs/mpi-11-html/node46.html )

別の送信呼び出しで送信バッファーを参照しても問題ありませんか、それとも「送信バッファーの任意の部分にアクセスする」に含まれていますか?

つまり、次の送信者の C コードは正しいでしょうか。

MPI_Request req[2];
MPI_Status statuses[2];
...
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]);
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]);
MPI_Waitall(2, req, statuses);
4

2 に答える 2

3

MPI 3.0 標準を参照したところ、次の情報が見つかりました。

非ブロック送信呼び出しは、システムが送信バッファーからデータのコピーを開始できることを示します。非ブロッキング送信操作が呼び出された後、送信が完了するまで、送信者は送信バッファのどの部分も変更しないでください。

しかし、私はごく最近、標準の開発者の何人かによって提供された MPI 3.0 のチュートリアルに参加し、MPI の実装 (MPICH、LAM など) によっては、MPI で使用されるバッファーにアクセスするのは安全ではない可能性があると述べました。送信が完了する前に Isend プロシージャからバッファが変更される可能性があるため、ノンブロッキング通信呼び出し。つまり、2 番目の MPI_Isend のバッファーが最初の送信のバッファーと同じであるとは限りません。これを確実に理解するために、実装のソースコードを調べます。

于 2013-06-14T18:04:26.583 に答える