Каждый процесс в коммуникаторе 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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.