отправка нескольких mpi без блокировки отправки-сохранит ли он отправленный заказ

скажем, у меня есть 3 неблокирующих отправки, как это

  1. MPI_Isend ();
  2. MPI_Isend ();
  3. MPI_Isend ();

и 3 соответствующих получает

  1. MPI_Recv ();
  2. MPI_Recv ();
  3. MPI_Recv ();

теперь предположим, что 2nd Isend не отправляет, так как его не блокирует 3rd будет отправлен. Теперь функции MPI_Recv получат предназначенные ?

Я имею в виду 1-й MPI_ISend отправить данные на 1-й и 2-й MPI_ISent на 2-й MPI_Recv и так далее.

1 ответов


Обновлено: Иеремия Уиллкок ниже в комментариях, я думаю, правильно, и этот ответ был неправильным.

Если три ISends вызываются последовательно, и получает все совпадают с ними, то не имеет значения, является ли одна операция отправки больше, или быстрее, или что-то еще; гарантия отсутствия обгона MPI говорит вам, что сообщения прибудут (и, таким образом, будут доступны для Recv) в порядке, в котором были сделаны Isends.

Если вызов чтобы ISend был отложен, как я изначально интерпретировал вопрос, или если вызов не удался, как было предложено (но обратите внимание, что у вас будут другие проблемы позже, если вызов не удался), то исходный ответ выполняется: если результат соответствует любой все Isends, и вызов чтобы второй ISend как-то задержался, тогда 1-й MPI_Recv() получит первый Isend, второй Recv получит третий Isend, а третий будет висеть до этого второго Isend происходит.

Если вы хотите убедиться, что первый MPI_Recv получает определенное сообщение, вы должны использовать теги, чтобы различать различные сообщения, и получить указать этот тег.