Согласно документации, MPI_Ssend
и MPI_Issend
- это блокирующие и неблокирующие операции отправки, обе синхронные. В спецификации MPI сказано, что синхронная отправка завершается, когда получатель начал получать сообщение, и после этого можно безопасно обновить буфер отправки:
Функции MPI_WAIT и MPI_TEST используются для завершения неблокирующей связи. Завершение операции отправки указывает на то, что отправитель теперь может обновлять местоположения в буфере отправки (сама операция отправки оставляет содержимое буфера отправки без изменений). Это не означает, что сообщение было получено, скорее, оно могло быть помещено в буфер подсистемой связи. Однако, если использовалась отправка в режиме синхронный , завершение операции отправки указывает, что соответствующий прием был инициирован, и что сообщение в конечном итоге будет получено этим совпадающим приемом.
Принимая во внимание, что отправка синхронная считается завершенной, когда она только начинает приниматься, я не уверен в следующем:
- Возможно, что только часть данных была прочитана из буфера отправки в момент, когда
MPI_Ssend
или MPI_Issend
сигнализируют о завершении отправки? Например, первые N байтов были отправлены и получены, в то время как следующие M байтов все еще отправляются. - Как вызывающий может быть в безопасности, изменяя данные, пока не будет получено все сообщение? Значит ли это, что данные обязательно копируются в системный буфер? Насколько я понимаю, стандарт MPI разрешает использование системного буфера, но не требует этого. Более того, из здесь я прочитал, что
MPI_Issend()
не никогда не буферизует данные локально.