То, будет ли MPI_Send
возвращен или MPI_Isend
запрос завершен (flag==true
), не обязательно зависит от того, был ли отправлен соответствующий ответ. В обоих случаях это только означает, что буфер отправки можно использовать повторно.
Хотя условия аналогичны, ваша реализация MPI может просто решить буферизовать в одном случае, а не буферизовать в другом. Или это может буферизовать при полнолунии по средам. Вы не можете предполагать что-либо об этом.
Если вам по какой-то причине требуется возврат функции или завершение операции, чтобы указать, что сообщение действительно было получено, вам необходимо использовать вызовы в синхронном режиме, т.е. MPI_Ssend
или MPI_Issend
.
Цитировать стандарт для MPI_Send
(3.4)
При отправке вызова, описанной в разделе 3.2.1, используется стандартный режим связи. В
В этом режиме MPI решает, буферизуются ли исходящие сообщения. MPI может буферизовать исходящие сообщения. В таком случае отправка вызова может завершиться до того, как будет вызван соответствующий прием. С другой стороны, буферное пространство может быть недоступно, или MPI может не буферизовать исходящие сообщения по соображениям производительности. В этом случае отправка вызова не будет завершена до тех пор, пока не будет опубликован соответствующий прием и данные не будут перемещены в получатель.
Если вы вместо этого хотите убедиться, что ваша программа может продолжить работу, несмотря на то, что сообщение не получено, вы продолжаете использовать MPI_Isend
и убедитесь, что буфер и запрос не затронуты до тех пор, пока завершение не будет указано MPI_Test
.
Для MPI_Isend
/ MPI_Test
(3.7.3)
Завершение операции отправки означает, что отправитель теперь может свободно обновлять
местоположения в буфере отправки (сама операция отправки оставляет содержимое буфера отправки без изменений). Это не означает, что сообщение было получено, скорее, оно могло быть буферизовано подсистемой связи.
P.S. Если ваш ранг получателя равен dead , то ваша программа MPI, скорее всего, неверна.