Параллельное программирование: Учебное пособие, страница 113

Каждый процесс в коммуникаторе comm пересылает содержимое буфера передачи sendbuf процессу с рангом root. Процесс root выполняет операцию конкатенации полученных данных в буфере приема. Порядок склейки определяется рангами процессов, т. е. в результирующем наборе после данных от процесса 0 следуют данные от процесса 1, затем данные от процесса 2 и т. д. Аргументы rcvbuf, rcvcount и rcvtype играют роль только на стороне корневого (главного) процесса. Аргумент rcvcount указывает количество элементов данных, полученных от каждого процесса (но не суммарное их количество). При вызове подпрограмм MPI_Scatter и MPI_Gather из разных процессов следует использовать общий корневой (главный) процесс.

Подпрограммы MPI_Scatterv и MPI_Gatherv являются векторными версиями подпрограмм MPI_Scatter и MPI_Gather. Они пересылают разным процессам или собирают от них разное количество элементов данных (векторов). Аргумент displs задает расстояние между элементами. Пересылаемые элементы в памяти главного процесса могут располагаться и не непрерывно, что представляется полезным при пересылке частей массивов.

int MPI_Scatterv(void *sendbuf, int *sendcounts,

int *displs, MPI_Datatype sendtype,

void *rcvbuf, int rcvcount,

MPI_Datatype rcvtype, int root,

MPI_Commcomm)

Входные параметры:

·  sendbuf — адрес буфера передачи;

·  sendcounts — целочисленный одномерный массив, содержащий количество элементов, передаваемых каждому процессу (индекс равен рангу адресата). Его длина равна количеству процессов в коммуникаторе;

·  displs — целочисленный массив, длина которого равна количеству процессов в коммуникаторе. Элемент с индексом i задает смещение относительно начала буфера передачи. Ранг адресата равен значению индекса i;

·  sendtype — тип данных в буфере передачи;

·  rcvcount — количество элементов в буфере приема;

·  rcvtype — тип данных в буфере приема;

·  root — ранг передающего процесса;

·  comm — коммуникатор.

Выходной параметр:

·  rcvbuf — адрес буфера приема

Подпрограмма MPI_Gatherv используется для сбора данных от всех процессов в заданном коммуникаторе и записи их в буфер приема с указанным смещением:

int MPI_Gatherv(void *sendbuf, int sendcount,

MPI_Datatype sendtype, void *recvbuf,

int *recvcounts, int *displs,

MPI_Datatype recvtype, int root,

MPI_Commcomm)

Список параметров у этой подпрограммы аналогичен списоку параметров подпрограммы MPI_Scatterv.

Входные параметры:

·  sendbuf — адрес буфера передачи;

·  sendcounts — целочисленный одномерный массив, содержащий количество элементов, посылаемых каждому процессу (индекс равен рангу адресата). Его длина равна количеству процессов в коммуникаторе;

·  displs — целочисленный массив, длина которого равна количеству процессов в коммуникаторе. Элемент с индексом i задает смещение относительно начала буфера передачи. Ранг адресата равен значению индекса i;

·  sendtype — тип данных в буфере передачи;

·  rcvcount — количество элементов в буфере приема;

·  rcvtype — тип данных в буфере приема;

·  root — ранг передающего процесса;

·  comm — коммуникатор.

Выходной параметр:

·  rcvbuf — адрес буфера приема

В обменах, выполняемых подпрограммами MPI_Allgather и MPI_Alltoall, нет главного процесса. Детали отправки и приема важны для всех процессов, участвующих в обмене. MPI_Allgather собирает данные от всех процессов и распределяет их всем процессам (рис. 6.4). Действие этой подпрограммы равносильно действию последовательности вызовов подпрограммы MPI_Gather, в каждом из которых в качестве главного используются разные процессы. Прием выполняется во всех задачах. Буфер приема последовательно заполняется сообщениями от всех процессов-отправителей.


Рисунок 6.4. Схема передачи данных для подпрограммы MPI_Allgather

int MPI_Allgather(void *sendbuf, int sendcount,

             MPI_Datatype sendtype, void *rcvbuf,

                 int rcvcount, MPI_Datatype rcvtype,

                              MPI_Commcomm)