Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемГригорий Недоквасов
1 Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 9 Томский политехнический университет 1 Параллельное программирование с использованием технологии MPI Аксёнов С.В.
2 Функция 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:Коммуникатор
3 Предопределенные операции редукции Параллельное программирование с использованием технологии 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Минимальное значение и местонахождения
4 Пример 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
5 Функция 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:Коммуникатор
6 Функция 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:Коммуникатор
7 Функция 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:Коммуникатор
8 Пользовательские операции приведения Параллельное программирование с использованием технологии 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)
9 Конструктор 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.
10 Конструктор 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.
11 Конструктор 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() за исключением того, что страйд задается в байтах, а не в элементах.
12 Конструктор 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.
13 Конструктор 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.
14 Конструктор 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.
15 Объявление объектов типа данных Параллельное программирование с использованием технологии MPI Аксёнов С.В. 15 Объекты типов данных должны быть объявлены перед их использованием в коммуникации. Объявленный тип данных может быть использован как аргумент в конструкторах типов данных. Базисные типы данных объявлять не нужно, поскольку они предопределены. Функция MPI_Type_commit() объявляет тип данных, то есть формально описывает коммуникационный буфер, но не содержимое этого буфера. Поэтому после того, как тип данных объявлен, он может быть многократно использован, чтобы передавать изменяемое содержимое буфера или различных буферов с различными стартовыми адресами. int MPI_Type_commit(MPI_Datatype datatype) Входdatatype:Объявленный тип данных
16 Удаление объектов типа данных Параллельное программирование с использованием технологии MPI Аксёнов С.В. 16 Функция MPI_Type_free() маркирует объекты типа данных, связанные с datatype для удаления и установки типа данных в MPI_DATATYPE_NULL. Удаление типа данных не воздействует на другой тип, который был построен от удаленного типа. Система ведет себя как если бы аргументы входного типа данных были переданы конструктору производного типа данных по значению. int MPI_Type_free(MPI_Datatype datatype) Входdatatype:Тип данных, который освобождается
17 Пример Параллельное программирование с использованием технологии 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++ }
18 Пример Параллельное программирование с использованием технологии 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
19 Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В. 19 for (i=0; i
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.