Параллельное программирование: Учебное пособие, страница 122

·  indices — смещение каждого блока в байтах (массив);

·  oldtypes — тип элементов в каждом блоке (массив).

Выходной параметр — идентификатор производного типа newtype. Схема расположения данных в структурном типе представлена на рис. 6.11. Данную подпрограмму можно использовать рекурсивно.

Базовые типы
Структурный тип

Рисунок 6.11. Схема структурного типа данных

MPI_Aint представляет собой скалярный тип, длина которого имеет размер, одинаковый с указателем.

Пример создания структурного производного типа:

blen[0] = 1;

indices[0] = 0;

oldtypes[0] = MPI_INT;

blen[1] = 1;

indices[1] = &data.b — &data;

oldtypes[1] = MPI_CHAR;

blen[2] = 1;

indices[2] = sizeof(data);

oldtypes[2] = MPI_FLOAT;

MPI_Type_struct(3, blen, indices, oldtypes, &newtype);

В этом фрагменте новый структурный производный тип newtype состоит из трех сегментов, включающих по одному элементу базовых типов (MPI_INT, MPI_CHAR,MPI_FLOAT), которые смещены друг от друга на расстояния, определяемые вычислением, в первом случае, и некоторой функцией – во втором случае.

При создании индексированного типа блоки располагаются по адресам с разным смещением и его можно считать обобщением векторного типа. Конструктором индексированного типа является подпрограмма MPI_Type_indexed:

intMPI_Type_indexed(intcount, intblocklens[],

int indices[], MPI_Datatype oldtype,

MPI_Datatype *newtype)

Ее параметры:

·  count — количество блоков, одновременно задающее длины массивов  indices  и blocklens;

·  blocklens — количество элементов в каждом блоке;

·  indices — целочисленный массив с числами смещений, которые определяют количество ячеек базового типа в каждом блоке;

·  oldtype — базовый тип;

·  newtype— идентификатор производного типа, являющийся выходным параметром.

Конструктором индексированного типа является подпрограмма MPI_Type_hindexed, в которой смещения indices задаются в байтах:

int MPI_Type_hindexed(int count, int blocklens[],

MPI_Aint indices[], MPI_Datatype oldtype,

MPI_Datatype *newtype)

Подпрограмма MPI_Type_contiguous используется для создания типа данных с непрерывным расположением элементов:

int MPI_Type_contiguous(int count,

     MPI_Datatype oldtype, MPI_Datatype *newtype)

Ее входные параметры:

·  count — счетчик повторений;

·  oldtype — базовый тип.

Выходной параметр newtype — идентификатор нового типа. Эта подпрограмма фактически создает описание массива. Приведем фрагмент программы с ее использованием:

MPI_Datatypea;

floatb[10];

. . .

MPI_Type_contiguous(10, MPI_REAL, &а);

MPI_Type_commit(&a);

MPI_Send(b, 1, а,...);

MPI_Type_free(&a);

Подпрограмма MPI_Type_create_indexed_block используется для создания индексированного типа с блоками постоянного размера:

int MPI_Type_create_indexed_block(int count,

         int blocklength, int displacements[],

           MPI_Datatype oldtype, MPI_Datatype *newtype)

Ее входные параметры:

·  count — количество блоков, одновременно задающее длины массивов  indices  и blocklens;

·  blocklength — количество элементов в каждом блоке;

·  displacements — целочисленный массив смещений, указанных для каждого блока в единицах длины, установленной для типа oldtype;

·  oldtype — базовый тип.

Идентификатор производного типа newtype является выходным параметром этой подпрограммы.

Тип данных, соответствующий подмассиву многомерного массива, можно создать подпрограммойMPI_Type_create_subarray:

int MPI_Type_create_subarray(int ndims,

int *sizes, int *subsizes, int *starts,

int order, MPI_Datatype oldtype,

MPI_Datatype *newtype)

Входные параметры:

·  ndims — размерность массива;

·  sizes — количество элементов типа oldtype в каждом измерении полного массива;

·  subsizes — количество элементов типа oldtype в каждом измерении подмассива;

·  starts — стартовые координаты подмассива в каждом измерении;