MPI_Gather(array, 100, MPI_INT, rbuf, 100, MPI_INT, root, comm);
В данном примере общее количество процессов помещается в переменную proc_count, после чего выделяется динамическая память под proc_count блоков, каждый из которых содержит 100 элементов типа int. Затем данный массив заполняется с помощью функции MPI_Gather.
Работа функции MPI_Gather иллюстрируется следующим рисунком:
Отметим, что при использовании функции MPI_Gather сборка данных осуществляется только на одном процессе. Для получения всех собираемых данных на каждом из процессов коммуникатора необходимо использовать функцию сбора и рассылки:
Int MPI_Allgather
(void *sbuf, int scount, MPI_Datatype stype,
void *rbuf, int rcount, MPI_Datatype rtype,
MPI_Comm comm).
Если размеры передаваемых процессами сообщений различны, выполнение операции сбора данных обеспечивается при помощи функций MPI_Gatherv и MPI_Allgatherv. Студентам предлагается самостоятельно изучить данные функции по документации к библиотеке MPI и материалам в сети Интернет.
Передача данных от всех процессов всем процессам
Наиболее общей операцией передачи данных является передача данных от всех процессов всем процессам. Выполнение данной операции может быть обеспечено при помощи функции:
Int MPI_Alltoall
(void *sbuf, int scount, MPI_Datatype stype,
void *rbuf, int rcount, MPI_Datatype rtype,
MPI_Comm comm),
где
sbuf, scount, stype – параметры передаваемых сообщений;
rbuf, rcount, rtype – параметры принимаемых сообщений;
comm – коммуникатор, в рамках которого выполняется передача данных.
При выполнении функции MPI_Alltoall каждый процесс в коммуникаторе передает данные из scount элементов каждому процессу (общий размер отправляемых сообщений в процессах должен быть равен scount*p элементов, где p есть количество процессов в коммуникаторе comm) и принимает сообщения от каждого процесса. Вызов функции MPI_Alltoall при выполнении операции общего обмена данными должен быть выполнен в каждом процессе коммуникатора. Работу данной функции иллюстрирует следующий рисунок:
Существует вариант операции общего обмена данных, когда размеры передаваемых процессами сообщений могут быть различны. Для этого используется функция MPI_Alltoallv, которую студентам предлагается освоить самостоятельно.
Лекция 10
Редукция данных
Под термином «редукция» здесь понимается процесс автоматического сбора данных от всех процессов с последующей их обработкой. Предположим, что все процессы подготовили некоторый массив данных, и задачей ведущего процесса является формирование такого массива, в котором каждый элемент был бы равен сумме соответствующих элементов массивов всех процессов (включая свой массив). Данная задача может быть решена алгоритмическим путем с использованием операций MPI_Send и MPI_Recv, однако такой способ будет достаточно трудоемким и малоэффективным. Для наилучшего выполнения действий, связанных с редукцией данных, в MPI предусмотрена функция MPI_Reduce:
int MPI_Reduce (void *sendbuf, void *recvbuf,
Дата добавления: 2016-02-02; просмотров: 1129;