
2.4.
Связь посредством сообщений 135
как сообщение скопировано, отправитель продолжает работу. Локальная испол-
няющая система MPI удалит сообщение из буфера и примет меры по его переда-
че получателю сразу же, как только получатель запустит примитив, отвечающий
за прием.
Также существует и операция передачи с блокировкой, которая называется
MPI_sencl. Ее семантика зависит от реализации. Примитив MPI_send может блоки-
ровать отправителя как на время копирования сообщения в исполняющую систе-
му MPI на стороне отправителя, так и до момента инициирования получателем
операции приема. Первый случай соответствует асинхронной связи, показанной
на рис. 2.21, г, второй ~ на рис. 2.21, д.
Синхронная связь, при которой отправитель блокируется до передачи сооб-
щения на дальнейшую обработку, как показано на рис. 2.21, Э, поддерживается
при помощи примитива MPI_ssencl.
И наконец, наиболее жесткая форма синхронных коммуникаций показана на
рис.
2.21, е. Когда отправитель вызывает примитив MPI_sendrecv, он посылает по-
лучателю сообщерп1е и блокируется до получения ответа. В основе работы этого
примитива лежит обычный механизм RFC.
Примитивы MPI_senci и MPI_ssend имеют варианты, исключающею необходи-
мость копирования сообщения из буфера пользователя во внутренний буфер ло-
кальной исполняющей системы MPI. Эти варианты соответствуют асинхронной
связи. При помощи примитива MR_1send отправитель передает указатель на со-
общение, после чего исполняющая система MPI начинает взаимодействие. От-
правитель немедленно продолжает свою работу. Чтобы избежать изменения
сообщения до момента окончания связи, MPI предоставляет примитивы для про-
верки завершения передачи или, при необходимости, блокировки. Как и в случае
MRsend, вопрос о том, нужно ли реально передавать сообщение или достаточно
копирования в локальный буфер исполняющей системы MPI, оставлен на ус-
мотрение разработчиков.
В случае вызова примитива MRJssend отправитель также передает исполняю-
щей системе MPI только указатель. Когда исполняющая система показывает, что
она обработала сообщение, отправитель удостоверяется, что получатель получил
сообщение и в настоящее время работает с ним.
Операция MPI_recv вызывается для приема сообщения и блокирует запустив-
ший процесс до прихода сообщения. Существует также и асинхронный вариант
этой операции под именем MPI_1recv, вызовом которого получатель показывает,
что он готов к приему сообщений. Получатель может проверить, имеются ли при-
шедшие сообщения, или заблокироваться в ожидании таковых.
Семантика коммуникационных примитивов MPI не всегда проста, и иногда
замена различных примитивов никак не влияет на правильность программы.
Официальная причина поддержки такого разнообразия вариантов взаимодейст-
вия состоит в том, что разработчики систем MPI должны иметь все возможности
для оптимизации производительности. Циники могут сказать, что комитет, как
всегда, не нашел в себе сил хорошенько подумать. Интерфейс MPI был разрабо-
тан для высокопроизводительных параллельных приложений, что упрощает по-
нимание причин подобного разнообразия коммуникационных примитивов.