· 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 — стартовые координаты подмассива в каждом измерении;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.