Параллельное программирование с использованием технологии MPI презентация

Содержание

Функция MPI_Reduce() Параллельное программирование с использованием технологии MPI Аксёнов С.В. Функция MPI_Reduce() объединяет элементы входного буфера каждого процесса в группе, используя операцию op, и возвращает объединенное значение в выходной буфер процесса

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

9
Томский политехнический университет

Параллельное программирование с использованием технологии MPI Аксёнов С.В.


Слайд 2Функция MPI_Reduce()
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
Функция 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 Аксёнов С.В.


Слайд 4Пример MPI_Reduce()
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
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 sendbuf[i]=rand()%100;
for (i=0; i printf("Процесс № %d Значение элемента sendbuf на позиции %d равно %d",rank,
i,sendbuf[i]);
MPI_Reduce(sendbuf,recvbuf,n,MPI_INT,MPI_MAX,0,MPI_COMM_WORLD);
if (rank==0)
for (i=0; i<5; i++)
printf(Процесс № %d Максимальное значение элементов sendbuf на позиции %d
равно %d",rank,i,recvbuf[i]
MPI_Finalize();
return 0:
}

Слайд 5Функция MPI_Allreduce()
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
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 Аксёнов С.В.
Функция 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 Аксёнов С.В.
Функция 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 Аксёнов С.В.
Допускается определение

собственных операций приведения. Для этого используется подпрограмма 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 Аксёнов С.В.
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 Аксёнов С.В.
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 Аксёнов С.В.
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 Аксёнов С.В.
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 Аксёнов С.В.
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 Аксёнов С.В.
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 Аксёнов С.В.
Объекты

типов данных должны быть объявлены перед их использованием в коммуникации. Объявленный тип данных может быть использован как аргумент в конструкторах типов данных. Базисные типы данных объявлять не нужно, поскольку они предопределены.

Функция MPI_Type_commit() объявляет тип данных, то есть формально описывает коммуникационный буфер, но не содержимое этого буфера. Поэтому после того, как тип данных объявлен, он может быть многократно использован, чтобы передавать изменяемое содержимое буфера или различных буферов с различными стартовыми адресами.

int MPI_Type_commit(MPI_Datatype datatype)

Вход datatype: Объявленный тип данных


Слайд 16Удаление объектов типа данных
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
Функция

MPI_Type_free() маркирует объекты типа данных, связанные с datatype для удаления и установки типа данных в MPI_DATATYPE_NULL. Удаление типа данных не воздействует на другой тип, который был построен от удаленного типа. Система ведет себя как если бы аргументы входного типа данных были переданы конструктору производного типа данных по значению.

int MPI_Type_free(MPI_Datatype datatype)

Вход datatype: Тип данных, который освобождается


Слайд 17Пример
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
#include “mpi.h”
#include
#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; i<*len; i++)
{
c.real = b->real*a->real - b->img*a->img;
c.img = b->real*a->img + b->img*a->real;
*b = ;
a++;
b++
}
}

Слайд 18Пример
Параллельное программирование с использованием технологии MPI Аксёнов С.В.
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<5; i++)
{
sendbuf[i].real = rand()%10;
sendbuf[i].img = rand()%10;
}



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

printf("Процесс № %d Значение элемента sendbuf на позиции %d равно %d + %d *i",rank,i,sendbuf[i].real,
sendbuf[i].img);

MPI_Reduce(sendbuf,recvbuf,n,ctype,complexop,0,MPI_COMM_WORLD);

if (rank==0)
for (i=0; i printf("Процесс № %d Значение элемента sendbuf на позиции %d равно %d + %d *i",rank,i,sendbuf[i].real,
sendbuf[i].img);
MPI_Op_free(&complexop);
MPI_Type_free(&ctype);
MPI_Finalize();
return 0:
}



Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика