Использует ли MPI_Ssend / MPI_Issend системный буфер? - PullRequest
1 голос
/ 02 августа 2020

Согласно документации, MPI_Ssend и MPI_Issend - это блокирующие и неблокирующие операции отправки, обе синхронные. В спецификации MPI сказано, что синхронная отправка завершается, когда получатель начал получать сообщение, и после этого можно безопасно обновить буфер отправки:

Функции MPI_WAIT и MPI_TEST используются для завершения неблокирующей связи. Завершение операции отправки указывает на то, что отправитель теперь может обновлять местоположения в буфере отправки (сама операция отправки оставляет содержимое буфера отправки без изменений). Это не означает, что сообщение было получено, скорее, оно могло быть помещено в буфер подсистемой связи. Однако, если использовалась отправка в режиме синхронный , завершение операции отправки указывает, что соответствующий прием был инициирован, и что сообщение в конечном итоге будет получено этим совпадающим приемом.

Принимая во внимание, что отправка синхронная считается завершенной, когда она только начинает приниматься, я не уверен в следующем:

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

1 Ответ

2 голосов
/ 02 августа 2020

MPI_Ssend() (или MPI_Wait(), связанный с MPI_Issend()) возвращается, когда:

  1. получатель начал получать сообщение
  2. и буфер отправки можно повторно использовать

второе условие выполняется, если сообщение было полностью получено, или библиотека MPI буферизует данные локально.

Я не читал, что MPI стандарт запрещает буферизацию данных.

Из стандарта MPI 3.1 chpt 3.4 стр. 37

Отправка, в которой используется синхронный режим, может быть запущена независимо от того, было ли отправлено соответствующее получение. Однако отправка будет успешно завершена только в том случае, если соответствующий прием отправлен, и операция приема началась для получения сообщения, отправленного синхронной отправкой. Таким образом, завершение синхронной отправки не только указывает на то, что буфер отправки может быть повторно использован, но также указывает, что получатель достиг определенной точки в своем выполнении, а именно, что он начал выполнение соответствующего приема. Если и отправка, и получение являются блокирующими операциями, то использование синхронного режима обеспечивает семантику синхронной связи: обмен данными не завершается ни на одном из концов до того, как оба процесса встретятся при обмене данными. Отправка, выполняемая в этом режиме, не является локальной.

...