Рассмотренная в п. 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. Общая схема операции редукции с получением частичных результатов обработки данных