MPI-блокировка получения семантики - PullRequest
2 голосов
/ 03 февраля 2012

Я запутался, когда читал о блокировке отправки и получения в MPI.Как указано в стандарте MPI 2.2, раздел 3.4 Режимы связи:

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

Может кто-нибудь объяснить мне какблокирующий прием может завершиться до того, как завершится соответствующая отправка ?Насколько я понимаю, блокирующий прием (MPI_recv) возвращается, когда данные готовы для использования в приемном буфере (т.е. данные были получены полностью).Разве это не так?

Ответы [ 2 ]

5 голосов
/ 03 февраля 2012

Ваше понимание верно.

Описанный случай (получение завершается до завершения отправки) в стандарте говорит вам не полагаться на порядок вызовов библиотеки.Это не обязательно должно иметь место на конкретной машине / реализации.

Если вы думаете о синхронной отправке и блокировке приема крошечного сообщения.Синхронная отправка может быть завершена только после того, как начался соответствующий прием, что, возможно, обозначено как «подтверждающее сообщение (ACK)».Фактическая передача сообщения может быть полностью передана (получение может быть возвращено) до того, как ACK прибудет к отправителю (отправка может вернуться).Пожалуйста, имейте в виду, что это очень зависит от реализации / машины.

1 голос
/ 04 февраля 2012

Может кто-нибудь объяснить мне, как блокирующий прием может завершиться до того, как завершится соответствующая отправка?

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

В некоторых случаях необходимо, чтобы recv завершил (и вернулся), прежде чем можно было безопасно изменить буфер отправки.Например, подтверждение должно быть отправлено со стороны recv на сторону отправки, чтобы указать, что безопасно изменять буфер отправки (обычно в передачах протокола RDMA rendezvous).

Насколько я понимаю, блокирующий прием (MPI_recv) возвращается, когда данные готовы для использования в буфере приема (т.е. данные были получены полностью).Разве это не так?

Это правильно.

...