MPI_SSEND: как это гарантирует повторное использование буфера отправителя? - PullRequest
0 голосов
/ 27 марта 2020

Я понимаю, что MPI_Bsend сохранит буфер отправителя в локальном буфере, управляемом библиотекой MPI, поэтому можно безопасно использовать буфер отправителя для других целей. Я не понимаю, как MPI_Ssend гарантирует это?

Отправка в синхронном режиме.

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

Как указано выше, MPI_Ssend вернется (ie разрешить дальнейшее выполнение программы), если соответствующий прием был опубликован, и он начал получать сообщение, отправленное синхронной отправкой. Рассмотрим следующий случай:

Я отправляю огромный массив данных int скажем data[1 million] через MPI_Ssend. Другой процесс начинает получать его (но, возможно, не сделал это полностью), что позволяет MPI_Ssend возвращать и выполнять следующий программный оператор. Следующий оператор вносит изменения в буфер в самом конце data[1 million] = \*new value*\. Затем MPI_Ssend наконец достигает конца буфера и отправляет это новое значение, которое было не тем, что я хотел.

Чего мне не хватает на этом рисунке?

TIA

1 Ответ

0 голосов
/ 27 марта 2020

MPI_Ssend() является одновременно блокирующим и синхронным .

Из стандарта MPI 3.1 (глава 3.4, стр. 37)

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

...