1

MPI_Wait (または MPI_Waitall、MPII_Waitsome などの他のバリアント) を呼び出すタイミングについて少し混乱しています。以下の状況を考慮してください: (注: 疑似コード)

ケース (1)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Irecv (recv_buffer, recv_req);
// wait for msgs to finish
MPI_Wait (recv_req);   // <--- Is this needed?
MPI_Wait (send_req);   // <--- How about this?

MPI_Probeしたがって、私の混乱はこの場合に由来します。これはブロッキング コールなので、メッセージが受信されるまで発信者をブロックすることを本質的に意味するのではないでしょうか? だとしたら、ここでは MPI_Waits は不要だと思います。

次の場合はどうでしょうか。

ケース (2)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Recv (recv_buffer);
// wait for msgs to finish
MPI_Wait (send_req);   // <--- Is this necessary?

最初のケースに似ていMPI_Irecvますが、ブロッキング バージョンに置き換えられます。この場合、メッセージはMPI_Wait呼び出されるまでに確実に受信されます。つまりMPI_Isend、終了している必要があります...

MPI_Probeまた別の質問として、ブロッキングとはどういう意味ですか? プロセスがすべてのメッセージを受信するまでブロックしますか、それとも「メタデータ」(メッセージ サイズ、送信者ランクなど) を受信するまでのみブロックしますか? 言い換えれば、 + は+MPI_ProbeよりMPI_Irecvも優れていますか?MPI_ProbeMPI_Recv

4

1 に答える 1

0

非同期でデータを受信したい場合にのみ、「MPI_Wait」関数を使用するか、さまざまな非同期読み取りを開始した場合は MPI_Waitall を使用する必要があります。問題は、MPI_Wait がブロッキング呼び出しであることです。ノンブロッキングが必要な場合は、MPI_Test を使用して関数の完了を確認する必要があります。

あなたの場合、MPI_Probe はメッセージが受信されるまでブロックされます。したがって、あなたの場合、MPI_Probe への呼び出しは必要ないと思います。

于 2013-09-27T11:22:25.677 に答える