私はMPI送受信操作に関する質問があります。MPI質問を送受信します。
メッセージを互いに送信しようとする2つのMPIスレッドがあるとします。
まず( '送信' と '受信' ブロック):それをやって3つのコードスニペットは次のとおり
...
int data = ...;
...
MPI_Send(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD);
MPI_Status status;
MPI_Recv(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status);
...
は、第二( '送信' ノンブロッキングが、 '受信' ブロック):
...
int data = ...;
...
MPI_Request request;
MPI_Isend(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request);
MPI_Status status;
MPI_Recv(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status);
// Synchronize sender & receiver
MPI_Wait(&request, &status);
...
サード(ノンブロッキング「送信」ブロックと「受信」):
...
int data = ...;
...
MPI_Request request;
MPI_Irecv(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request);
MPI_Send(&data, sizeof(int), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD);
MPI_Status status;
// Synchronize sender & receiver
MPI_Wait(&request, &status);
...
私が持つ潜在的な問題があると思います私はあなたの意見を欲しいです。だから、私は次の質問を持っています:
上記の3つのコードの(潜在的な)問題(もしあれば)は何ですか?
すべてのMPI実装で動作するように、上記3つのコードのどれが有効/正当なMPI規格を考慮していますか?
これを行うには最良の方法はありますか?
3番目のコードでは、MPI_Irecv呼び出しとMPI_Send呼び出しの順序を変更するとどうなりますか?
PS:ところで、私はScali MPIを使用してそれらを実行しようとしました、そして、それらのすべてが機能しました!
また、データが受信されるまでブロックする必要があるブロッキング受信があるため、2番目の実装についても懐疑的です。だから、その場合MPI_Wait()は必要ありませんか? – usman
@ user600029この場合、デッドロックの危険性はありません。どちらのプロセスも受信時にブロックする前に送信操作を既に開始しているためです。 – Francesco
@ user600029しかし、すべての実装で、アドレスが送信操作と受信操作の両方に与えられている1つのデータしか割り当てられていないことに気付きました。この結果は、第2および第3の実装では予測できません。両方のプロセスで 'data'の値を本当に交換したいのであれば、少なくとも1つのストレージに複製を作成する必要があります(ただし、非同期通信方式を採用すると – Francesco