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_Probe
MPI_Recv