Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемwww.parallel.ru
1 Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных информационных технологий НИВЦ МГУ
2 MPI Сообщение – массив однотипных данных, расположенных в последовательных ячейках памяти. Для пересылки разнотипных данных можно использовать: Производные типы данных Упаковку данных
3 MPI Производные типы данных создаются во время выполнения программы с помощью подпрограмм-конструкторов. Создание типа: Конструирование типа Регистрация типа
4 MPI Производный тип данных характеризуется последовательностью базовых типов и набором значений смещения относительно начала буфера обмена. Смещения могут быть как положительными, так и отрицательными, не требуется их упорядоченность.
5 MPI MPI_TYPE_CONTIGUOUS(COUNT, TYPE, NEWTYPE, IERR) INTEGER COUNT, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT последовательно расположенных элементов базового типа данных TYPE.
6 MPI MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLEN элементов базового типа данных TYPE. Следующий блок начинается через STRIDE элементов после начала предыдущего.
7 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)}
8 MPI MPI_TYPE_HVECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLEN элементов базового типа данных TYPE. Следующий блок начинается через STRIDE байт после начала предыдущего.
9 MPI MPI_TYPE_INDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLENS(I) элементов базового типа данных. I -й блок начинается через DISPLS(I) элементов с начала буфера.
10 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) Создание нового типа данных для описания нижнедиагональной матрицы.
11 MPI MPI_TYPE_HINDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERR Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLENS(I) элементов базового типа данных. I -й блок начинается через DISPLS(I) байт с начала буфера.
12 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) байт.
13 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)}
14 MPI MPI_TYPE_COMMIT(DATATYPE, IERR) INTEGER DATATYPE, IERR Регистрация созданного производного типа данных DATATYPE. После регистрации этот тип данных можно использовать в операциях обмена.
15 MPI MPI_TYPE_FREE(DATATYPE, IERR) INTEGER DATATYPE, IERR Аннулирование производного типа данных DATATYPE. DATATYPE устанавливается в значение MPI_DATATYPE_NULL. Производные от DATATYPE типы данных остаются. Предопределенные типы данных не могут быть аннулированы.
16 MPI MPI_TYPE_SIZE(DATATYPE, SIZE, IERR) INTEGER DATATYPE, SIZE, IERR Определение размера типа DATATYPE в байтах (объема памяти, занимаемого одним элементом данного типа).
17 MPI MPI_TYPE_LB(DATATYPE, DISPL, IERR) INTEGER DATATYPE, DISPL, IERR Определение смещения DISPL в байтах нижней границы элемента типа данных DATATYPE от базового адреса.
18 MPI MPI_TYPE_UB(DATATYPE, DISPL, IERR) INTEGER DATATYPE, DISPL, IERR Определение смещения DISPL в байтах верхней границы элемента типа данных DATATYPE от базового адреса.
19 MPI MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERR) INTEGER DATATYPE, EXTENT, IERR Определение диапазона типа DATATYPE в байтах (разницы между верхней и нижней границами элемента данного типа).
20 MPI MPI_ADDRESS(LOCATION, ADDRESS, IERR) LOCATION(*) INTEGER ADDRESS, IERR Определение абсолютного байт-адреса ADDRESS размещения массива LOCATION в оперативной памяти. Адрес отсчитывается от базового адреса, значение которого содержится в константе MPI_BOTTOM.
21 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)
22 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 байт.
23 MPI Параметр POSITION увеличивается на число байт, равное размеру записи. Параметр COMM указывает на коммуникатор, в котором в дальнейшем будет пересылаться сообщение.
24 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.
25 MPI MPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERR) INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERR Определение необходимого объема памяти (в байтах) для упаковки INCOUNT элементов типа DATATYPE.
26 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)
27 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
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.