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