Архив документации OpenNet.ru /
Раздел "Программирование в Linux" /
Индекс
Next: Другие функции для коллективных
Up: Коллективные коммуникации
Previous: Широковещательные посылки
Contents
В рассматриваемой программе после входной стадии каждый процессор
выполняет по существу те же самые команды до заключительной стадии
суммирования. Поэтому, если функция
дополнительно не усложнена
(т. е. не требует значительной работы для оценки интеграла
по некоторым частям отрезка
), то эта часть программы распределяет
среди процессоров одинаковую нагрузку. В заключительной стадии суммирования
процесс 0 еще раз получает непропорциональное количество работы.
Здесь также можно распределить работу вычисления суммы среди процессоров
по структуре дерева следующим образом:
- Процесс 1 посылает результат процессу 0, процесс 3 посылает результат
процессу 2, процесс 5 посылает результат процессу 4, процесс 7 посылает
результат процессу 6.
- Процесс 0 суммирует результат с процессом 1, процесс 2 суммирует результат
с процессом 3, и т.д.
- Процесс 2 посылает результат процессу 0, процесс 6 посылает результат
процессу 4.
- Процесс 0 суммирует результат с процессом 2, процесс 4 суммирует результат
с процессом 6.
- Процесс 4 посылает результат процессу 0
- Процесс 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
2004-06-22
Архив документации на OpenNet.ru