Ответ 1
Оба MPI_Isend()
и MPI_Issend()
возвращаются немедленно, но в обоих случаях вы не можете сразу использовать буфер отправки.
Подумайте о различии между MPI_Send()
и MPI_Ssend()
:
-
MPI_Send()
может быть буферизирован или может быть синхронным, если буфер тоже для буферизации локально, и в этом случае он ждет завершения отправки данных в соответствующую операцию приема. -
MPI_Ssend()
всегда синхронно: он всегда ждет завершения отправки данных к соответствующей операции приема.
Внутренняя работа соответствующих "I" -операций очень похожа, за исключением того факта, что они оба не блокируют (немедленно возвращаются): разница заключается только в том, что библиотека MPI сигнализирует программе пользователя, что вы можете используйте send-buffer (то есть: MPI_Wait()
возвращает или MPI_Test()
возвращает true
- так называемую операцию send-complete неблокирующей отправки):
-
с
MPI_Isend()
это может произойти, когда данные были скопированы локально в буфере, принадлежащем библиотеке MPI, если ниже "синхронного порога" или когда данные были фактически перенесены в задачу сестры: операция отправки-завершения может быть локальной, в случае буферизации базовой операции отправки. -
С
MPI_Issend()
MPI никогда не хранит данные локально, и условие "без буфера" возвращается только после того, как данные были фактически переданы (и, вероятно, были найдены на низком уровне): send -полная операция нелокальная.
стандартный документ MPI довольно педантичен по этим аспектам. См. Раздел 3.7 "Неблокирующая связь".