Векторный способ конструирования

Непрерывный способ конструирования

Способы конструирования производных типов данных

Для снижения сложности в MPI предусмотрено несколько различных способов конструирования производных типов:

· непрерывный способ позволяет определить непрерывный набор элементов существующего типа как новый производный тип;

· векторный способ обеспечивает создание нового производного типа как набора элементов существующего типа, между элементами которого имеются регулярные промежутки по памяти. При этом размер промежутков задается в числе элементов исходного типа, в то время как в варианте H-векторного способа этот размер указывается в байтах;

· индексный способ отличается от векторного метода тем, что промежутки между элементами исходного типа могут иметь нерегулярный характер (имеется и H-индексный способ, отличающийся способом задания промежутков);

· структурный способ обеспечивает самое общее описание производного типа через явное указание карты создаваемого типа данных.

Далее перечисленные способы конструирования производных типов данных будут рассмотрены более подробно.

При непрерывном способе конструирования производного типа данных в MPI используется функция:

int MPI_Type_contiguous(int count, MPI_Data_type oldtype, MPI_Datatype *newtype),

где

· count — количество элементов исходного типа;

· oldtype — исходный тип данных;

· newtype — новый определяемый тип данных.

Как следует из описания, новый тип newtype создается как count элементов исходного типа oldtype. Например, если исходный тип данных имеет карту типа

{(MPI_INT, 0), (MPI_DOUBLE, 8)},

то вызов функции MPI_Type_contiguous с параметрами

MPI_Type_contiguous(2, oldtype, &newtype);

приведет к созданию типа данных с картой типа

{(MPI_INT, 0), (MPI_DOUBLE, 8), (MPI_INT, 16), (MPI_DOUBLE, 24)}.

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

При векторном способе конструирования производного типа данных в MPI применяются функции

int MPI_Type_vector(int count, int blocklen, int stride, MPI_Data_type oldtype, MPI_Datatype *newtype) иint MPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Data_type oldtype, MPI_Datatype *newtype),

где

· count — количество блоков;

· blocklen — размер каждого блока;

· stride — количество элементов, расположенных между двумя соседними блоками;

· oldtype — исходный тип данных;

· newtype — новый определяемый тип данных.

Отличие способа конструирования, определяемого функцией MPI_Type_hvector, состоит лишь в том, что параметр stride для определения интервала между блоками задается в байтах, а не в элементах исходного типа данных.

Как следует из описания, при векторном способе новый производный тип создается как набор блоков из элементов исходного типа, при этом между блоками могут иметься регулярные промежутки по памяти. Приведем несколько примеров использования данного способа конструирования типов:

· конструирование типа для выделения половины (только четных или только нечетных) строк матрицы размером n×n:

MPI_Type_vector(n / 2, n, 2 * n, &StripRowType, &ElemType),

· конструирование типа для выделения столбца матрицы размером n×n:

MPI_Type_vector(n, 1, n, &ColumnType, &ElemType),

· конструирование типа для выделения главной диагонали матрицы размером n×n:

MPI_Type_vector(n, 1, n + 1, &DiagonalType, &ElemType).

С учетом характера приводимых примеров можно упомянуть имеющуюся в MPI возможность создания производных типов для описания подмассивов многомерных массивов при помощи функции (данная функция предусматривается стандартом MPI-2):

int MPI_Type_create_subarray(int ndims, int *sizes, int *subsizes, int *starts, int order, MPI_Data_type oldtype, MPI_Datatype *newtype),

где

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

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

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

· starts — индексы начальных элементов в каждой размерности определяемого подмассива;

· order — параметр для указания необходимости переупорядочения;

· oldtype — тип данных элементов исходного массива;

· newtype — новый тип данных для описания подмассива.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: