2017-05-31 20 views
0

私はMPIポイントツーポイントブロッキングモードについてちょっと混乱します。
今私は次のコードを持っています。 MPI_RECVとしてブロックされます
MPI:ポイントツーポイントブロッキング(MPI_Send&MPI_Recv)

y = id; 
j = id - 1; 
if(j<0) j = p -1; 

k = id + 1; 
if(k>p-1) k = 0; 

MPI_Recv(&x, 1, MPI_INT, k, 0, MPI_COMM_WORLD, &status); 
MPI_Send(&y, 1, MPI_INT, j, 0, MPI_COMM_WORLD); 

z = x + y; 

は、ブロッキング機能ですが、私はMPI_Send関数を呼び出す順序を変更する際に最初にすべてがOKになり、私はその理由を知りません。
ありがとう、私の英語のために申し訳ありません。

答えて

2

MPI_Send()送信バッファを再使用できるまでブロックします。

実用的な観点からは、MPI_Send()は、メッセージが十分に短ければimmediatlyを返し、それ以外の場合は一致するまでブロックします。MPI_Recv()が投稿されます。 これは一般的な動作ですが、それに頼るべきではありません。この場合

、あなたの最良のオプションは、他のオプションが MPI_Irecv(); MPI_Send(); MPI_Wait();

+0

にあるのrecvが

を呼び出し、送信/単一MPI_Sendrecv()コールの代わりに、ブロック2を使用することで、今okが、なぜプログラムが正常に実行されないでしょうあなたが 'MPI_Recv()'を最初に実行した場合、私は注文を変更するとブロックされ、MPI_Sendはただちに – AHM200

+0

を返します。あなたのプログラムは永遠にハングします。 'MPI_Send()'が最初にあり、メッセージが十分短い場合、それが送信され、一致する 'MPI_Recv()'が完了します。 は意味がありますか? –

+0

はい、ありがとうございます。 – AHM200

関連する問題