buf | начальный адрес буфера процесса-получателя (альтернатива) |
count | число элементов в принимаемом сообщении (целое) |
datatype | тип данных каждого элемента сообщения (дескриптор) |
source | номер процесса-отправителя (целое) |
tag | тэг сообщения (целое) |
comm | коммуникатор (дескриптор) |
status | параметры принятого сообщения (статус) |
Буфер получения состоит из накопителя, содержащего последовательность элементов, размещенных по адресу buf.
Тип элементов указан в поле datatype. Длина получаемого сообщения должна быть равна или меньше длины буфера получения, в противном случае будет иметь место ошибка переполнения. Если сообщение меньше размера буфера получения, то в нем модифицируются только ячейки, соответствующие длине сообщения.
Прием сообщения осуществляется, если его атрибуты соответствуют значениям источника, тэга и коммуникатора, которые указаны в операции приема. Процесс-получатель может задавать значение MPI_ANY_SOURCE для отправителя и/или значение MPI_ANY_TAG для тэга, определяя, что любой отправитель и/или тэг разрешен. Нельзя задать произвольное значение для comm. Следовательно, сообщение может быть принято, если оно адресовано данному получателю и имеет соответствующий коммуникатор.
|
|
Тэг сообщения задается аргументом tag операции приема. Аргумент отправителя, если он отличен от MPI_ANY_SOURCE, задается как номер внутри группы процессов, связанной с тем же самым коммуникатором. Следовательно, диапазон значений для аргумента отправителя есть {0,...,n-1}U{MPI_ANY_SOURCE}, где n есть количество процессов в этой группе.
Отметим ассиметрию между операциями посылки и приема. Операция приема допускает получение сообщения от произвольного отправителя, в то время как в операции посылки должен быть указан уникальный получатель.
Допускается ситуация, когда имена источника и получателя совпадают, то есть процесс может посылать сообщение самому себе.
Возвращаемая статусная информация
Источник или тэг принимаемого сообщения могут быть неизвестны, если в операции приема были использованы значения типа ANY.
Иногда может потребоваться возвратить различные коды ошибок для каждого запроса. Эта информация возвращается с помощью аргумента status операции MPI_RECV.
Тип аргумента status определяется MPI. Статусные переменные размещаются пользователем явно, то есть они не являются системными объектами.
В языке С status есть структура, которая содержит три поля, называемые MPI_SOURCE, MPI_TAG и MPI_ERROR. Следовательно, status.MPI_SOURCE, status.MPI_TAG и status.MPI_ERROR содержат источник, тэг и код ошибки принятого сообщения.
Вызовы передачи сообщений не модифицируют значения полей кода ошибки статусных переменных. Статусный аргумент также возвращает информацию о длине принятого сообщения. Эта информация не является доступной непосредственно, как поле статусной переменной, и требуется вызов MPI_GET_COUNT, чтобы «декодировать» эту информацию.