В рассматриваемой программе после входной стадии каждый процессор выполняет по существу те же самые команды до заключительной стадии суммирования. Поэтому, если функция дополнительно не усложнена (т. е. не требует значительной работы для оценки интеграла по некоторым частям отрезка ), то эта часть программы распределяет среди процессоров одинаковую нагрузку. В заключительной стадии суммирования процесс 0 еще раз получает непропорциональное количество работы. Здесь также можно распределить работу вычисления суммы среди процессоров по структуре дерева следующим образом:
"Общая сумма", которую нужно вычислить представляет собой пример общего класса коллективных операций коммуникации, называемых операциями редукции. В глобальной операции редукции, все процессы (в коммуникаторе) передают данные, которые объединяются с использованием бинарных операций. Типичные бинарные операции - суммирование, максимум и минимум, логические и т.д. MPI содержит специальную функцию для выполнения операции редукции:
MPI_Datatype datatype, MPI_Op op, int root,
MPI_Comm comm)
Аргумент op может принимать фиксированные значения, указанные в табл. 10:
Название операции | Смысл |
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_Reduce(&integral, &total, 1, MPI_FLOAT,
MPI_SUM, 0, MPI_COMM_WORLD);
/* Вывод результата */