Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_MPI_OpenMP.doc
Скачиваний:
4
Добавлен:
16.11.2019
Размер:
1.09 Mб
Скачать

4. Рассылка данных

MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);

IN sendbuf адрес буфера рассылки (исп-ся только корневым проц.)

IN sendcount кол-во эл-ов, посылаемых каждому процессу (исп-ся корневым проц.)

IN sendtype тип данных элементов в буфере посылки (исп-ся корневым проц.)

OUT recvbuf адрес буфера процесса-получателя

IN recvcount количество элементов в буфере корневого процесса (целое)

IN recvtype тип данных элементов приемного буфера

IN root номер процесса-получателя (целое)

IN comm коммуникатор (дескриптор)

MPI_Scatter – обратная функция по отношению к MPI_Gather. Результат ее выполнения таков, как если бы корневой процесс выполнил n операций посылки: MPI_Send(senbuf + i * extent(sendtype), sendcount, sendtype, i, …), и каждый процесс выполнит прием: MPI_Recv(recvbuf, recvcount, recvtype, i, …).

Значения sendcount[i], sendtype на главном процессе, должны быть теми же, что и recvcount, recvtype на процессе i. Количество посланных и полученных данных должно совпадать для всех процессов. Процесс, который выполняет рассылку использует все аргументы функции, принимающие процессы используют только аргументы recvbuf, recvcount, recvtype, root, comm. Аргументы root и comm должны быть одинаковыми во всех процессах.

Сбор данных на всех процессах

MPI_Allgather( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)

IN sendbuf начальный адрес посылающего буфера

IN sendcount количество элементов в буфере (целое)

IN sendtype тип данных элементов в посылающем буфере

OUT recvbuf адрес принимающего буфера

IN recvcount кол-во элементов, полученных от любого процесса (целое)

IN recvtype тип данных элементов принимающего буфера

IN comm коммуникатор

Функцию MPI_Allgather можно представить как MPI_Gather, где результат принимают все процессы. Блок данных, посланный j-м процессом принимается каждым процессом и помещается в j-й блок буфера recvbuf.

MPI_Allgather можно представить как MPI_Gatherv, где результат получают все процессы. j-й блок данных, посланный каждым процессом, принимается каждым процессом и помещается в j-й блок буфера recvbuf. Эти блоки могут быть разного размера.

MPI_Allgatherv( sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm)

IN sendbuf начальный адрес посылающего буфера

IN sendcount количество элементов в посылающем буфере (целое)

IN sendtype тип данных элементов в посылающем буфере

OUT recvbuf адрес принимающего буфера

IN recvcounts целочисл. массив (gsize), содерж.кол-во эл-ов, получ. от каждого процесса

IN displs целочисл. массив (gsize), элемент i – смещение (относит. recvbuf), куда помещаются принимаемые данные от процесса i

IN recvtype тип данных элементов принимающего буфера

IN comm коммуникатор

Значения sendcount, sendtype в процессе j должны быть такими же, как recvcounts[j], recvtype в любом другом процессе.

Результат вызова MPI_Allgatherv (...) такой же, как если бы все процессы выполнили n вызовов: MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs,recvtype, root, comm), для root = 0, …, n-1.

Функция MPI_Alltoall – расширение функции MPI_Allgather для случая, когда каждый процесс посылает данные каждому процессу. При этом j-й блок, посланный процессом i, принимается процессом j и помещается в i-й блок буфера recvbuf.

MPI_ Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)

IN sendbuf начальный адрес посылающего буфера

IN sendcount количество элементов посылаемых в каждый процесс (целое)

IN sendtype тип данных элементов посылающего буфера

OUT recvbuf адрес принимающего буфера

IN recvcount количество элементов, принятых от какого-либо процесса (целое)

IN recvtype тип данных элементов принимающего буфера

IN comm коммуникатор

Результат выполнения функции MPI_Alltoall такой же, как если бы каждый процесс выполнил посылку данных каждому процессу (включая себя) вызовом: MPI_Send(sendbuf + i * sendcount * extent(sendtype), sendcount, sendtype, i, ...), и принял данные от всех остальных процессов путем вызова: MPI_Recv(recvbuf + i* recvcount* extent(recvtype), recvcount, i,…).

Значения sendcount, sendtype в каждом процессе должны быть одинаковыми. Т.е. количество посланных данных должно быть равно количеству полученных данных между каждой парой процессов. Все аргументы используются всеми процессами.

MPI_Alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,recvcounts, rdispls, recvtype, comm)

IN sendbuf начальный адрес посылающего буфера (альтернатива)

IN sendcounts целочисл. массив (gsize), опред-ет кол-во посыл. кажд. процессу элементов

IN sdispls целочисл. массив (gsize). Эл-нт j содержит смещение области (относит. sendbuf), из которой берутся данные для процесса j

IN sendtype тип данных элементов посылающего буфера

OUT recvbuf адрес принимающего буфера

IN recvcounts целочисл. массив (gsize), содержит число эл-ов, которые могут быть приняты от каждого процесса

IN rdispls целочисл. массив (gsize). Эл-нт i определяет смещение области (относительно recvbuf), в которой размещаются данные, получаемые из процесса i

IN recvtype тип данных элементов принимающего буфера

IN comm коммуникатор