Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.

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



Advertisements
Похожие презентации
Кафедра ЮНЕСКО по НИТ1 Передача упакованных данных Параллельное программирование.
Advertisements

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

Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных информационных технологий НИВЦ МГУ

MPI Сообщение – массив однотипных данных, расположенных в последовательных ячейках памяти. Для пересылки разнотипных данных можно использовать: Производные типы данных Упаковку данных

MPI Производные типы данных создаются во время выполнения программы с помощью подпрограмм-конструкторов. Создание типа: Конструирование типа Регистрация типа

MPI Производный тип данных характеризуется последовательностью базовых типов и набором значений смещения относительно начала буфера обмена. Смещения могут быть как положительными, так и отрицательными, не требуется их упорядоченность.

MPI MPI_TYPE_CONTIGUOUS(COUNT, TYPE, NEWTYPE, IERR) INTEGER COUNT, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT последовательно расположенных элементов базового типа данных TYPE.

MPI MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLEN элементов базового типа данных TYPE. Следующий блок начинается через STRIDE элементов после начала предыдущего.

MPI count=2 blocklen=3 stride=5 call MPI_TYPE_VECTOR(count, blocklen, & stride, MPI_DOUBLE_PRECISION, & newtype, ierr) Создание нового типа данных (тип элемента, количество элементов от начала буфера): {( MPI_DOUBLE, 0), ( MPI_DOUBLE, 1), ( MPI_DOUBLE, 2), ( MPI_DOUBLE, 5), ( MPI_DOUBLE, 6), ( MPI_DOUBLE, 7)}

MPI MPI_TYPE_HVECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLEN элементов базового типа данных TYPE. Следующий блок начинается через STRIDE байт после начала предыдущего.

MPI MPI_TYPE_INDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLENS(I) элементов базового типа данных. I -й блок начинается через DISPLS(I) элементов с начала буфера.

MPI do i=1,N blocklens(i)=N-i+1 displs(i)=N*(i-1)+i-1 end do call MPI_TYPE_INDEXED(N, blocklens, & displs, MPI_DOUBLE_PRECISION, & newtype, ierr) Создание нового типа данных для описания нижнедиагональной матрицы.

MPI MPI_TYPE_HINDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLENS(I) элементов базового типа данных. I -й блок начинается через DISPLS(I) байт с начала буфера.

MPI MPI_TYPE_STRUCT(COUNT, BLOCKLENS, DISPLS, TYPES, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPES(*), NEWTYPE, IERR Создание структурного типа данных из COUNT блоков по BLOCKLENS(I) элементов типа TYPES(I). I -й блок начинается через DISPLS(I) байт.

MPI blocklens(1)=3 blocklens(2)=2 types(1)=MPI_DOUBLE_PRECISION types(2)=MPI_CHAR displs(1)=0 displs(2)=24 call MPI_TYPE_STRUCT(2, blocklens, & displs, types, newtype, ierr) Создание нового типа данных (тип элемента, количество байт от начала буфера): {( MPI_DOUBLE, 0), ( MPI_DOUBLE, 8), ( MPI_DOUBLE, 16), ( MPI_CHAR, 24), ( MPI_CHAR, 25)}

MPI MPI_TYPE_COMMIT(DATATYPE, IERR) INTEGER DATATYPE, IERR Регистрация созданного производного типа данных DATATYPE. После регистрации этот тип данных можно использовать в операциях обмена.

MPI MPI_TYPE_FREE(DATATYPE, IERR) INTEGER DATATYPE, IERR Аннулирование производного типа данных DATATYPE. DATATYPE устанавливается в значение MPI_DATATYPE_NULL. Производные от DATATYPE типы данных остаются. Предопределенные типы данных не могут быть аннулированы.

MPI MPI_TYPE_SIZE(DATATYPE, SIZE, IERR) INTEGER DATATYPE, SIZE, IERR Определение размера типа DATATYPE в байтах (объема памяти, занимаемого одним элементом данного типа).

MPI MPI_TYPE_LB(DATATYPE, DISPL, IERR) INTEGER DATATYPE, DISPL, IERR Определение смещения DISPL в байтах нижней границы элемента типа данных DATATYPE от базового адреса.

MPI MPI_TYPE_UB(DATATYPE, DISPL, IERR) INTEGER DATATYPE, DISPL, IERR Определение смещения DISPL в байтах верхней границы элемента типа данных DATATYPE от базового адреса.

MPI MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERR) INTEGER DATATYPE, EXTENT, IERR Определение диапазона типа DATATYPE в байтах (разницы между верхней и нижней границами элемента данного типа).

MPI MPI_ADDRESS(LOCATION, ADDRESS, IERR) LOCATION(*) INTEGER ADDRESS, IERR Определение абсолютного байт-адреса ADDRESS размещения массива LOCATION в оперативной памяти. Адрес отсчитывается от базового адреса, значение которого содержится в константе MPI_BOTTOM.

MPI blocklens(1)=1 blocklens(2)=1 types(1)=MPI_DOUBLE_PRECISION types(2)=MPI_CHAR call MPI_ADDRESS(dat1, address(1), ierr) displs(1)=address(1) call MPI_ADDRESS(dat2, address(2), ierr) displs(2)=address(2) call MPI_TYPE_STRUCT(2, blocklens, & displs, types, newtype, ierr) call MPI_TYPE_COMMIT(newtype, ierr) call MPI_SEND(MPI_BOTTOM, 1, newtype, & dest, tag, MPI_COMM_WORLD, ierr)

MPI MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE, POSITION, COMM, IERR) INBUF(*), OUTBUF(*) INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, IERR Упаковка INCOUNT элементов типа DATATYPE из массива INBUF в массив OUTBUF со сдвигом POSITION байт. OUTBUF должен содержать OUTSIZE байт.

MPI Параметр POSITION увеличивается на число байт, равное размеру записи. Параметр COMM указывает на коммуникатор, в котором в дальнейшем будет пересылаться сообщение.

MPI MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE, COMM, IERR) INBUF(*), OUTBUF(*) INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, IERR Распаковка из массива INBUF со сдвигом POSITION байт в массив OUTBUF OUTCOUNT элементов типа DATATYPE.

MPI MPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERR) INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERR Определение необходимого объема памяти (в байтах) для упаковки INCOUNT элементов типа DATATYPE.

MPI real a(10) character b(10), buf(100) position=0 if(rank.eq. 0) then call MPI_PACK(a, 10, MPI_REAL, buf, 100, & position, MPI_COMM_WORLD, ierr) call MPI_PACK(b, 10, MPI_CHAR, buf, 100, & position, MPI_COMM_WORLD, ierr) call MPI_BCAST(buf, 100, & MPI_PACKED, 0,MPI_COMM_WORLD, ierr)

MPI else call MPI_BCAST(buf, 100, MPI_PACKED, 0, & MPI_COMM_WORLD, ierr) position=0 call MPI_UNPACK(buf, 100, position, a, & 10, MPI_REAL, MPI_COMM_WORLD, ierr) call MPI_UNPACK(buf, 100, position, b, & 10, MPI_CHAR, MPI_COMM_WORLD, ierr) end if