一見ばかげた質問ですが、どちらにしても決定的な答えを見つけることができないようです。
基本的な質問は、MPI::Isendに対応するMPI::Irecvが必要ですか?
つまり、メッセージの送信が非ブロッキングであっても、送信が完了するのを待ってから送信バッファーを再利用する限り、非ブロッキングの受信を使用して、送信されたバッファーを受信するのを待つ必要がありますか?
私のポイントは、メッセージの送信中に「他のことを行う」ために非ブロッキング送信を使用したいのですが、受信者プロセスはすぐにバッファーを使用するので、バッファーが実際に受信されるまでブロックしてもらいたいということです。
MPI :: Isendで送信されたにもかかわらず、MPI :: Recvでメッセージを受信できるはずですが、何かが足りないのではないかと思います。
簡単な擬似コード
if( rank == 0 ){
int r;
for ( int i = 0; i < n; i++ ){
// DO SOME STUFF HERE...
request.Wait(status);
request2.Wait(status);
request3.Wait(status);
r = i;
memcpy( key, fromKey(i), ...);
memcpy( trace, fromTrace(i), ...);
request = MPI::COMM_WORLD.Isend( &r, 1, MPI::INT, node, tag );
request2 = MPI::COMM_WORLD.Isend( key, 10, MPI::INT, node, tag );
request3 = MPI::COMM_WORLD.Isend( trace, nBytesTotal, MPI::BYTE, node, tag );
// DO SOME MORE STUFF HERE.
}
r = -1;
request = MPI::COMM_WORLD.Isend( &r, 1, MPI::INT, node, tag );
// Carry on ...
} else {
int r = -1;
MPI::COMM_WORLD.Recv( &r, 1, MPI::INT, 0, tag, status );
while( r >= 0 ){
MPI::COMM_WORLD.Recv( &key, 10, MPI::INT, 0, tag, status );
memcpy( saveKey, key, ...);
MPI::COMM_WORLD.Recv( &trace, nBytesTotal, MPI::BYTE, 0, tag, status );
memcpy( saveTrace, trace, ...);
MPI::COMM_WORLD.Recv( &r, 1, MPI::INT, 0, tag, status );
}