кафедра ЮНЕСКО по НИТ1 Коллективные коммуникационные операции. Редукционные операции параллельное программирование Часть2
кафедра ЮНЕСКО по НИТ2 MPI – Глобальные вычислительные операции Редукционные операции – математические операции над блоками данных, распределённых по процессам группы Как и коллективные операции, операция редукции вызывается одна на всех процессах группы –данные с процесса с номером скалярная переменная вектор – = ассоциативная операция –Примеры: глобальное суммирование или произведение глобальный минимум или максимум глобальная, определенная пользователем, операция
MPI_Reduce MPI_Reduce - глобальная вычислительная операция с сохранением результата на в адресном пространстве одного процесса
кафедра ЮНЕСКО по НИТ4 sendbuf адрес начала входного буфера count число элементов во входном буфере datatype тип пересылаемых элементов op ассоциативная операция root номер процесса-получателя результата операции comm коммуникатор области связи int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) Входные параметры: Выходные параметры: recvbuf адрес начала буфера приема MPI_Reduce
кафедра ЮНЕСКО по НИТ5 Глобальные операции НазваниеОперацияРазрешенные типы MPI_MAX MPI_MIN Максимум Минимум integer, floating point MPI_SUM MPI_PROD Сумма Произведение integer, floating point MPI_LAND MPI_LOR MPI_LXOR Логическое AND Логическое OR Логическое исключающее OR integer MPI_BAND MPI_BOR MPI_BXOR Поразрядное AND Поразрядное OR Поразрядное исключающее OR integer, byte MPI_MAXLOC MPI_MINLOC Максимальное значение и его индекс Минимальное значение и его индекс Специальные типы для этих функций integer: MPI_INT, MPI_LONG, MPI_SHORT, MPI_UNSIGNED_SHORT, MPI_UNSIGNED, MPI_UNSIGNED_LONG Floating point:MPI_FLOAT, MPI_DOUBLE, MPI_LONG_DOUBLE byte:MPI_BYTE
кафедра ЮНЕСКО по НИТ6 MPI_Allreduce MPI_Allreduce - глобальная вычислительная операция с сохранением результата на в адресном пространстве всех процессов
кафедра ЮНЕСКО по НИТ7 MPI_Allreduce sendbuf адрес начала входного буфера count число элементов во входном буфере datatype тип пересылаемых элементов op ассоциативная операция comm коммуникатор области связи int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входные параметры: Выходные параметры: recvbuf адрес начала буфера приема
кафедра ЮНЕСКО по НИТ8 MPI_Reduce_scatter int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Функция MPI_Reduce_scatter отличается от MPI_Allreduce тем, что результат операции разрезается на непересекающиеся части по числу процессов в группе, i-ая часть посылается i-ому процессу в его буфер приема. Длины этих частей задает третий параметр, являющийся массивом.
кафедра ЮНЕСКО по НИТ9 MPI_Reduce_scatter sendbuf адрес начала входного буфера recvcount массив, в котором задаются размеры блоков, посылаемых процессам datatype тип пересылаемых элементов op ассоциативная операция comm коммуникатор области связи int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входные параметры: Выходные параметры: recvbuf адрес начала буфера приема
кафедра ЮНЕСКО по НИТ10 MPI_Scan int MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) MPI_Scan – операция префиксной редукции. Операция пересылает в буфер приёма i-го процесса редукцию значений из входных буферов процессов с номерами 0, …, i включительно.
кафедра ЮНЕСКО по НИТ11 MPI_Scan sendbuf адрес начала входного буфера count число элементов во входном буфере datatype тип пересылаемых элементов op ассоциативная операция comm коммуникатор области связи int MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входные параметры: Выходные параметры: recvbuf адрес начала буфера приема
Задание1 Написать программу суммирования чисел от 0 до N. Требования: Каждый процесс получает свою частичную сумму После суммирования все частичные суммы собираются в единую сумму на 1-ом процессе. Программа должна быть масштабируемой по числу процессоров.
Задание 2. Написать программу, выполняющую умножение матрицы на вектор. Требования: каждый процесс хранит по одной строке матрицы A. Вектор b хранится на всех процессах. Итоговый вектор c собирается на 1-ом процессе.
Задание 3. Написать программу, реализующую алгоритм суммирования ряда N чисел. Требования: Нулевой процесс рассылает исходный массив (ряд чисел) по всем процессам при помощи MPI_Bcast. Все процессы определяют свою порцию массива (индексы начала и конца) и выполняют MPI_Allreduce. Таким образом, результат сохраняется в адресном пространстве всех процессов.