Дополнительные операции редукции данных

Рассмотренная в п. 5.2.3.2 функция MPI_Reduce обеспечивает получение результатов редукции данных только на одном процессе. Для получения результатов редукции данных на каждом из процессов коммуникатора необходимо использовать функцию редукции и рассылки:

int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, MPI_Comm comm),

где

· sendbuf — буфер памяти с отправляемым сообщением;

· recvbuf — буфер памяти для результирующего сообщения;

· count — количество элементов в сообщениях;

· type — тип элементов сообщений;

· op — операция, которая должна быть выполнена над данными;

· comm — коммуникатор, в рамках которого выполняется операция.

Функция MPI_Allreduce выполняет рассылку между процессами всех результатов операции редукции. Возможность управления распределением этих данных между процессами предоставляется функций MPI_Reduce_scatter.

И еще один вариант операции сбора и обработки данных, при котором обеспечивается получение всех частичных результатов редуцирования, может быть реализован при помощи функции:

int MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, MPI_Comm comm),

где

· sendbuf — буфер памяти с отправляемым сообщением;

· recvbuf — буфер памяти для результирующего сообщения;

· count — количество элементов в сообщениях;

· type — тип элементов сообщений;

· op — операция, которая должна быть выполнена над данными;

· comm — коммуникатор, в рамках которого выполняется операция.

Общая схема выполнения функции MPI_Scan показана на рис. 5.7. Элементы получаемых сообщений представляют собой результаты обработки соответствующих элементов передаваемых процессами сообщений, при этом для получения результатов на процессе с рангом i, 0i<n, используются данные от процессов, ранг которых меньше или равен i, т.е.

где есть операция, задаваемая при вызове функции MPI_Scan.


Рис. 5.7. Общая схема операции редукции с получением частичных результатов обработки данных


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: