Теория и практика параллельных вычислений

       

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


При векторном способе конструирования производного типа данных в 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 — новый тип данных для описания подмассива.



Содержание раздела