Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Processes - Metodicka (edited) with MPI - last....doc
Скачиваний:
59
Добавлен:
22.12.2018
Размер:
1.59 Mб
Скачать

Прием сообщений в блокирующем режиме.

Прием сообщений в блокирующем режиме осуществляется функцией MPI_Recv():

#include <mpi.h>

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);

Она имеет следующие аргументы:

buf – указатель на буфер, в котором нужно разместить тело принимаемого сообщения

count – максимальное количество элементов заданного типа, которое может уместиться в буфере

datatype – тип элементов в теле получаемого сообщения

dest – уникальный номер ветви-отправителя. С помощью этого параметра процесс получатель может указать конкретного отправителя, от которого он желает получить сообщение, либо сообщить о том, что он хочет получить сообщение от любой ветви данного коммуникатора – в этом случае в качестве значения параметра указывается константа MPI_ANY_SOURCE

tag – тэг (бирка) сообщения. Ветвь-получатель может инициировать прием сообщения с конкретным значением тэга, либо указать в этом параметре константу MPI_ANY_TAG для получения сообщения с любым значением тэга.

comm – коммуникатор, описывающий коммуникационный контекст, в котором принимается сообщение

status – указатель на структуру типа MPI_Status, поля которой будут заполнены функцией MPI_Recv(). Используя эту структуру, ветвь-получатель может узнать дополнительную информацию о сообщении, такую как, например, его фактический размер, а также фактические значения тэга и отправителя в том случае, если использовались константы MPI_ANY_SOURCE и MPI_ANY_TAG.

Если в момент вызова MPI_Recv() нет ни одного сообщения, удовлетворяющего заданным критериям (т.е. посланного через заданный коммуникатор и имеющего нужного отправителя и тэг, в случае, если были заданы их конкретные значения), то выполнение ветви блокируется до момента поступления такого сообщения. В любом случае, управление возвращается процессу лишь тогда, когда сообщение будет получено, и его данные будут записаны в буфер buf и структуру status.

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

#include <mpi.h>

int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count);

Этой функции передаются в качестве параметров указатель на структуру типа MPI_Status, которая была заполнена в момент вызова функции приема сообщения, а также тип данных, образующих тело принятого сообщения. Параметр count представляет собой указатель на переменную целого типа, в которую будет записано количество элементов типа datatype, образующих тело принятого сообщения.

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

#include <mpi.h>

int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status);

Параметры этой функции аналогичны последним 4-м параметрам функции MPI_Recv(). Функция MPI_Probe(), как и MPI_Recv(), возвращает управление только при появлении сообщения, удовлетворяющего переданным параметрам, и заполняет информацией о сообщении структуру типа MPI_Status, указатель на которую передается в последнем параметре. Однако, в отличие от MPI_Recv(), вызов MPI_Probe() не осуществляет собственно прием сообщения. После возврата из MPI_Probe() сообщение остается во входящей очереди и может быть впоследствии получено одним из вызовов приема данных, в частности, MPI_Recv().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]