一个看似愚蠢的问题,但我似乎无法找到一种确定的答案.
基本问题是我需要为MPI :: Isend提供相应的MPI :: Irecv吗?
也就是说,即使消息发送是非阻塞的,只要我在重新发送缓冲区之前等待发送完成,我是否需要使用非阻塞接收和等待接收发送的缓冲区?
我的观点是,我希望在发送消息时使用非阻塞发送来"执行其他操作"但接收器进程将立即使用缓冲区,因此我希望它们阻塞直到真正接收到缓冲区.
看起来我应该能够接收到MPI :: Recv的消息,即使它们是用MPI :: Isend发送的,但我想知道我是否遗漏了什么?
一点简单的伪代码
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 …Run Code Online (Sandbox Code Playgroud)