30
MPI_Send и MPI_Recv. Для этой цели могут использоваться два
протокола: Eager и Rendezvous.
Eager. При посылке данных MPI вместе с адресом буфера должен
включить информацию пользователя о тэге, коммуникаторе, длине,
источнике и получателе сообщения. Эту дополнительную информа-
цию называют оболочкой (envelope). Посылаемое сообщение состоит
из оболочки, которая следует за данными. Метод посылки данных
вместе с оболочкой называется eager («жадным») протоколом.
Когда сообщение прибывает, возможны два случая: либо соответ-
ствующая приемная процедура запущена, либо нет. В первом случае
предоставляется место для приходящих данных. Во втором случае си-
туация много сложнее. Принимающий процесс должен помнить, что
сообщение прибыло, и где-то его сохранить. Первое требование вы-
полнить относительно легко, отслеживая очередь поступивших сооб-
щений. Когда программа выполняет MPI_Recv, она прежде всего
проверяет эту очередь. Если сообщение прибыло, операция выполня-
ется и завершается. Но с данными может быть проблема. Что, напри-
мер, будет, если множество подчиненных процессов почти одновре-
менно пошлют главному процессу свои длинные сообщения (напри-
мер, по 100 МВ каждое) и места в памяти главного процесса для их
размещения не хватит? Похожая ситуация возникает, например, при
умножении матриц. Стандарт MPI
требует, чтобы в этой ситуации
прием данных выполнялся, а не выдавался отказ. Это и приводит к
буферизации.
Rendezvous. Чтобы решить проблему доставки большого объема
данных по назначению, нужно контролировать, как много и когда эти
данные прибывают на процесс-получатель. Одно простое решение со-
стоит в том, чтобы послать процессу-получателю только оболочку.
Когда процесс-получатель потребует данные (и имеет место для их
размещения), он посылает отправителю сообщение, в котором гово-
рится: “теперь посылай данные”. Отправитель затем пошлет данные,
будучи уверен, что они будут приняты. Этот метод называется прото-
колом “рандеву”. В этом случае получатель должен отводить память
только для хранения оболочек, имеющих очень небольшой размер, а
не для хранения самих данных.
Причина для разработки многих вариаций режимов передачи те-
перь довольно ясны. Каждый режим может быть реализован с помо-
щью комбинации “жадного” и “рандеву” протоколов. Некоторые ва-
рианты представлены в таб. 2.1.