Нужно ли иметь соответствующий MPI::Irecv для MPI::Isend?

Казалось бы, глупый вопрос, но я не могу найти однозначного ответа так или иначе.

Основные вопросы: нужно ли мне иметь соответствующий MPI::Irecv для MPI::Isend?

То есть, даже если отправка сообщения не блокируется, пока я жду завершения отправки перед повторным использованием буферов отправки, нужно ли мне использовать неблокирующие приемы и ожидания для получения отправленных буферов?

Суть в том, что я хочу использовать неблокирующие отправки, чтобы «делать другие вещи» во время отправки сообщения, но процесс-получатель будет использовать буферы немедленно, поэтому я хочу, чтобы они блокировались до тех пор, пока буфер не будет действительно получен.

Похоже, я должен иметь возможность получать сообщения с помощью 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 );
  }
7
задан solvingPuzzles 8 September 2012 в 04:05
поделиться