Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 9 Томский политехнический университет.

Презентация:



Advertisements
Похожие презентации
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 8 Томский политехнический университет.
Advertisements

Кафедра ЮНЕСКО по НИТ1 Производные типы данных Параллельное программирование.
КОЛЛЕКТИВНЫЕ ВЗАИМОДЕЙСТВИЯ ПРОЦЕССОВ Барьерная синхронизация всех процессов группы. Широковещательная передача (broadcast) от одного процесса всем остальным.
Основы параллельного программирования с использованием MPI Лекция 5 Немнюгин Сергей Андреевич Санкт-Петербургский государственный университет физический.
Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Кафедра ЮНЕСКО по НИТ1 Коллективные коммуникационные операции. Редукционные операции параллельное программирование Часть2.
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 4 Томский политехнический университет.
Библиотека MPI Message Passing Interface. История MPI Стандарт MPI год, MPI год. Определяет API (варианты для Си, C++, Fortran, Java).
Библиотека MPI Message Passing Interface.
Коллективные взаимодействия процессов. MPI предоставляет ряд функций для коллективного взаимодейстия процессов. Эти функции называют коллективными, поскольку.
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 8 Методы разработки параллельных программ при использования интерфейса передачи.
Введение в параллельные вычисления. Технология программирования MPI (день пятый) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Кафедра ЮНЕСКО по НИТ1 Коллективные коммуникационные операции параллельное программирование.
Точечные взаимодействия. Назначение точечных взаимодействий.
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 7 Томский политехнический университет.
Интерфейс передачи сообщений: MPI. Базовые архитектуры Массивно-параллельные системы (MPP) Симметричные мультипроцессорные системы (SMP) Системы с неоднородным.
Кафедра ЮНЕСКО по НИТ1 Передача упакованных данных Параллельное программирование.
Параллельные аппаратные архитектуры и модели программирования Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные.
Лекция 14 Динамические данные. Виды памяти Существует три вида памяти: статическая, стековая и динамическая. Статическая память выделяется еще до начала.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
Транксрипт:

Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 9 Томский политехнический университет 1 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

Функция MPI_Reduce() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 2 Функция MPI_Reduce() объединяет элементы входного буфера каждого процесса в группе, используя операцию op, и возвращает объединенное значение в выходной буфер процесса с номером root. int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) Входsendbuf: Адрес посылающего буфера Выход recvbuf: Адрес принимающего буфера Вход count:Количество элементов в посылающем буфере Входdatatype:Тип данных элементов посылающего буфера Входop:Операция редукции Входroot:Номер корневого процесса Входcomm:Коммуникатор

Предопределенные операции редукции Параллельное программирование с использованием технологии MPI Аксёнов С.В. 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_Reduce() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 4 int main (int argc, char *argv[]) { int *sendbuf, *recvbuf, i, n, rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); n = 5; sendbuf = malloc(5*sizeof(int)); recvbuf = malloc(5*sizeof(int)); srand(rank); for (i=0; i

Функция MPI_Allreduce() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 5 MPI имеет варианты каждой из операций редукции, где результат возвращается всем процессам группы. MPI требует, чтобы все процессы, участвующие в этих операциях, получили идентичные результаты. Функция MPI_Allreduce() отличается от MPI_Reduce() тем, что результат появляется в принимающем буфере всех членов группы. int MPI_Allreduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) Входsendbuf: Адрес посылающего буфера Выход recvbuf: Адрес принимающего буфера Вход count:Количество элементов в посылающем буфере Входdatatype:Тип данных элементов посылающего буфера Входop:Операция редукции Входcomm:Коммуникатор

Функция MPI_Reduce_scatter() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 6 Функция MPI_Reduce_scatter() сначала производит поэлементную редукцию вектора из элементов в посылающем буфере. Далее полученный вектор результатов разделяется на n непересекающихся сегментов, где n – число членов в группе. int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входsendbuf: Адрес посылающего буфера Выход recvbuf: Адрес принимающего буфера Вход recvcounts:Целочисленный массив, определяющий количество элементов результата, распределенных каждому процессу. Входdatatype:Тип данных элементов посылающего буфера Входop:Операция редукции Входcomm:Коммуникатор

Функция MPI_Scan() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 7 Функция MPI_Scan() используется, чтобы выполнить префиксную редукцию данных, распределенных в группе. Операция возвращает в приемный буфер процесса i редукцию значений в посылающих буферах процессов с номерами 0,..., i (включительно). int MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Входsendbuf: Адрес посылающего буфера Выход recvbuf: Адрес принимающего буфера Вход count:Количество элементов в принимающем буфере Входdatatype:Тип данных элементов посылающего буфера Входop:Операция редукции Входcomm:Коммуникатор

Пользовательские операции приведения Параллельное программирование с использованием технологии MPI Аксёнов С.В. 8 Допускается определение собственных операций приведения. Для этого используется подпрограмма MPI_Op_create (). Описание типа пользовательской функции выглядит следующим образом: typedef void (MPI_User_function) (void *a, void *b, int *len, MPI_Datatype *dtype int MPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op) Входfunction: Пользовательская функция Вход commute: Флаг, которому присваивается значение «истина», если операция коммутативна Выходop:Операция редукции После завершения операций приведения пользовательская функция должна быть удалена: int MPI_Op_free(MPI_Op *op)

Конструктор MPI_Type_contiguous() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 9 int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype &newtype) Входcount:Число повторений Входoldtype:Старый тип Вход/Выходnewtype:Новый тип Функция MPI_Type_contiguous() позволяет копировать тип данных в смежные области. Новый тип newtype есть тип, полученный конкатенацией (сцеплением) count копий старого типа oldtype.

Конструктор MPI_Type_vector() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 10 int MPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype &newtype) Входcount:Число блоков Входblocklength:Число элементов в каждом блоке Входstride:Число элементов между началами каждого блока Входoldtype:Старый тип Вход/Выходnewtype:Новый тип Функция MPI_Type_vector() является универсальным конструктором, который позволяет реплицировать типы данных в области, которые состоят из блоков равного объема. Каждый блок получается как конкатенация некоторого количества копий старого типа. Пространство между блоками кратно размеру oldtype.

Конструктор MPI_Type_hvector() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 11 int MPI_Type_hvector(int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype &newtype) Входcount:Число блоков Входblocklength:Число элементов в каждом блоке Входstride:Число байтов между началами каждого блока Входoldtype:Старый тип Вход/Выходnewtype:Новый тип Функция MPI_Type_hvector() идентична MPI_Type_vector() за исключением того, что страйд задается в байтах, а не в элементах.

Конструктор MPI_Type_indexed() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 12 int MPI_Type_indexed(int count, int *array_of_blocklength, int *array_of_displacement, MPI_Datatype oldtype, MPI_Datatype *newtype) Входcount:Число блоков Входarray_of_blocklength:Число элементов в каждом блоке Входarray_of_displacements :Смещение для каждого блока Входoldtype:Старый тип Вход/Выходnewtype:Новый тип Функция MPI_Type_indexed() позволяет реплицировать старый тип oldtype в последовательность блоков (каждый блок есть конкатенация oldtype), где каждый блок может содержать различное число копий и иметь различное смещение. Все смещения блоков кратны длине старого блока oldtype.

Конструктор MPI_Type_hindexed() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 13 int MPI_Type_indexed(int count, int *array_of_blocklength, MPI_Aint *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype) Входcount:Число блоков Входarray_of_blocklength:Число элементов в каждом блоке Входarray_of_displacements :Смещение для каждого блока Входoldtype:Старый тип Вход/Выходnewtype:Новый тип Функция MPI_Type_hindexed() идентична MPI_Type_indexed() за исключением того, что смещения блоков в массиве array_of_displacements задаются в байтах, а не в кратностях ширины старого типа oldtype.

Конструктор MPI_Type_struct() Параллельное программирование с использованием технологии MPI Аксёнов С.В. 14 int MPI_Type_struct(int count, int *array_of_blocklength, MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype *newtype) Входcount:Число блоков Входarray_of_blocklength:Число элементов в каждом блоке Входarray_of_displacements :Смещение для каждого блока Входarray_of_types:Массив типов Вход/Выходnewtype:Новый тип Функция MPI_Type_hindexed() идентична MPI_Type_indexed() за исключением того, что смещения блоков в массиве array_of_displacements задаются в байтах, а не в кратностях ширины старого типа oldtype.

Объявление объектов типа данных Параллельное программирование с использованием технологии MPI Аксёнов С.В. 15 Объекты типов данных должны быть объявлены перед их использованием в коммуникации. Объявленный тип данных может быть использован как аргумент в конструкторах типов данных. Базисные типы данных объявлять не нужно, поскольку они предопределены. Функция MPI_Type_commit() объявляет тип данных, то есть формально описывает коммуникационный буфер, но не содержимое этого буфера. Поэтому после того, как тип данных объявлен, он может быть многократно использован, чтобы передавать изменяемое содержимое буфера или различных буферов с различными стартовыми адресами. int MPI_Type_commit(MPI_Datatype datatype) Входdatatype:Объявленный тип данных

Удаление объектов типа данных Параллельное программирование с использованием технологии MPI Аксёнов С.В. 16 Функция MPI_Type_free() маркирует объекты типа данных, связанные с datatype для удаления и установки типа данных в MPI_DATATYPE_NULL. Удаление типа данных не воздействует на другой тип, который был построен от удаленного типа. Система ведет себя как если бы аргументы входного типа данных были переданы конструктору производного типа данных по значению. int MPI_Type_free(MPI_Datatype datatype) Входdatatype:Тип данных, который освобождается

Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В. 17 #include mpi.h #include typedef struct { double real, img; } complex; typedef void complexproduct(complex *a, complex *b, int *len, MPI_Datatype *dptr) { int i; complex c; for (i=0; ireal*a->real - b->img*a->img; c.img = b->real*a->img + b->img*a->real; *b = ; a++; b++ }

Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В. 18 int main (int argc, char *argv[]) { complex sendbuf[5]; complex recvbuf[5], int i, n, rank; MPI_Datatype ctype; MPI_Op complexop; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); srand(rank); MPI_Type_contiguous(2,MPI_DOUBLE, &ctype); MPI_Type_commit(&ctype); MPI_Op_create(complexproduct, 1, &complexop) for (i=0; i

Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В. 19 for (i=0; i