10

一个看似愚蠢的问题,但我似乎无法以某种方式找到明确的答案。

基本问题是我是否需要为 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 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 );
  }
4

3 回答 3

19

不,您可以在通信两端自由混合阻塞和非阻塞 MPI 操作。阻塞与 MPI 调用何时将控制权返回给您的代码有关,而不是与正在传输的消息的内容有关。

每个 MPI 消息都带有一个“信封”,其中包含它的源、目标、标签和通信器。要成功接收消息,您的接收操作应该只匹配它的信封。信封绝不指定消息发送的准确程度——是通过阻塞,是通过非阻塞操作,是同步发送(MPI_Ssend)还是缓冲发送( MPI_Bsend)。唯一的例外是所谓的“就绪模式”发送,它启动MPI_Rsend()MPI_Irsend()要求匹配的接收操作已经发布,否则消息将不会被传递。

这就是为什么在整个 MPI 标准中使用术语“匹配接收操作”而不是类似于“相应接收功能”的原因。

于 2012-05-18T16:54:41.460 回答
2

是的,这很好。不要求发送/接收“种类”(或您想称呼它们的任何东西)匹配。

于 2012-05-18T16:39:58.753 回答
0

这与您使用什么发送/接收无关;但实施很重要。您必须注意代码中的阻塞点。例如,在使用阻塞通信时,您必须关心发送和接收呼叫,例如查看此代码

 if(rank==0)
 {
 MPI_Send(x to process 1)
 MPI_Recv(y from process 1)
 }
 if(rank==1)
 {
 MPI_Send(y to process 0);
 MPI_Recv(x from process 0);
 }

在这种情况下会发生什么?进程0将x发送到进程1并阻塞直到进程1接收到x,进程0将y发送到进程0并阻塞直到进程0接收到y,但是进程0被阻塞所以进程1无限阻塞直到你杀死2个进程

于 2012-05-22T13:11:26.977 回答