next up previous contents
Next: Другие функции для коллективных Up: Коллективные коммуникации Previous: Широковещательные посылки   Contents

Редукция

В рассматриваемой программе после входной стадии каждый процессор выполняет по существу те же самые команды до заключительной стадии суммирования. Поэтому, если функция $f(x)$ дополнительно не усложнена (т. е. не требует значительной работы для оценки интеграла по некоторым частям отрезка $[a;b]$), то эта часть программы распределяет среди процессоров одинаковую нагрузку. В заключительной стадии суммирования процесс 0 еще раз получает непропорциональное количество работы. Здесь также можно распределить работу вычисления суммы среди процессоров по структуре дерева следующим образом:

  1. Процесс 1 посылает результат процессу 0, процесс 3 посылает результат процессу 2, процесс 5 посылает результат процессу 4, процесс 7 посылает результат процессу 6.
  2. Процесс 0 суммирует результат с процессом 1, процесс 2 суммирует результат с процессом 3, и т.д.
  3. Процесс 2 посылает результат процессу 0, процесс 6 посылает результат процессу 4.
  4. Процесс 0 суммирует результат с процессом 2, процесс 4 суммирует результат с процессом 6.
  5. Процесс 4 посылает результат процессу 0
  6. Процесс 0 суммирует результат с процессом 4
Возможны также варианты организации передач, как и в случае рассылки входных данных. Поэтому следует использовать другие механизмы, более оптимизированные для этой цели.

"Общая сумма", которую нужно вычислить представляет собой пример общего класса коллективных операций коммуникации, называемых операциями редукции. В глобальной операции редукции, все процессы (в коммуникаторе) передают данные, которые объединяются с использованием бинарных операций. Типичные бинарные операции - суммирование, максимум и минимум, логические и т.д. MPI содержит специальную функцию для выполнения операции редукции:

int MPI_Reduce(void* operand, void* result, int count,

    MPI_Datatype datatype, MPI_Op op, int root,

    MPI_Comm comm)

MPI_Reduce() объединяет операнды, сохраненные в *operand, используя оператор op и сохраняет результат в переменной *result корневого процесса root. И операнд, и результат ссылаются на count ячеек памяти с типом datatype. MPI_Reduce() должны вызывать все процессы в коммуникаторе comm. При вызове значения count, datatype и op должны быть одинаковыми в каждом процессе.

Аргумент op может принимать фиксированные значения, указанные в табл. 10:


Таблица 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); 

/* Вывод результата */

Следует отметить, что каждый процессор вызывает MPI_Reduce() с одинаковыми аргументами. Например, если total имеет значение только для процесса 0, каждый процесс тем не менее использует этот аргумент.


next up previous contents
Next: Другие функции для коллективных Up: Коллективные коммуникации Previous: Широковещательные посылки   Contents
2004-06-22