В рассмотренной программе суммирования числовых значений имеющаяся процедура сбора и последующего суммирования данных является примером часто выполняемой коллективной операции передачи данных от всех процессов одному процессу. В этой операции над собираемыми значениями осуществляется та или иная обработка данных (для подчеркивания последнего момента данная операция еще именуется операцией редукции данных). Как и ранее, реализация операции редукции при помощи обычных парных операций передачи данных является неэффективной и достаточно трудоемкой. Для наилучшего выполнения действий, связанных с редукцией данных, в MPI предусмотрена функция:
int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm),
где
В качестве операций редукции данных могут быть использованы предопределенные в MPI операции – см. табл. 5.2.
Помимо данного стандартного набора операций могут быть определены и новые дополнительные операции непосредственно самим пользователем библиотеки MPI – см., например, [[4], [40] – [42], [57]].
Общая схема выполнения операции сбора и обработки данных на одном процессе показана на табл. 5.2. Элементы получаемого сообщения на процессе root представляют собой результаты обработки соответствующих элементов передаваемых процессами сообщений, т.е.:
где есть операция, задаваемая при вызове функции MPI_Reduce (для пояснения на рис. 5.3 показан пример выполнения функции редукции данных).
Следует отметить:
MPI_MAX | Определение максимального значения |
MPI_MIN | Определение минимального значения |
MPI_SUM | Определение суммы значений |
MPI_PROD | Определение произведения значений |
MPI_LAND | Выполнение логической операции "И" над значениями сообщений |
MPI_BAND | Выполнение битовой операции "И" над значениями сообщений |
MPI_LOR | Выполнение логической операции "ИЛИ" над значениями сообщений |
MPI_BOR | Выполнение битовой операции "ИЛИ" над значениями сообщений |
MPI_LXOR | Выполнение логической операции исключающего "ИЛИ" над значениями сообщений |
MPI_BXOR | Выполнение битовой операции исключающего "ИЛИ" над значениями сообщений |
MPI_MAXLOC | Определение максимальных значений и их индексов |
MPI_MINLOC | Определение минимальных значений и их индексов |
MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD | Целый, вещественный |
MPI_LAND, MPI_LOR, MPI_LXOR | Целый |
MPI_BAND, MPI_BOR, MPI_BXOR | Целый, байтовый |
MPI_MINLOC, MPI_MAXLOC | Целый, вещественный |