При индексном способе конструирования производного типа данных в MPI используются функции:
int MPI_Type_indexed(int count, int blocklens[], int indices[], MPI_Data_type oldtype, MPI_Datatype *newtype) и int MPI_Type_hindexed(int count, int blocklens[], MPI_Aint indices[], MPI_Data_type oldtype, MPI_Datatype *newtype),
где
Как следует из описания, при индексном способе новый производный тип создается как набор блоков разного размера из элементов исходного типа, при этом между блоками могут иметься разные промежутки по памяти. Для пояснения данного способа можно привести пример конструирования типа для описания верхней треугольной матрицы размером n?n:
// Конструирование типа для описания верхней треугольной матрицы for ( i = 0, i < n; i++ ) { blocklens[i] = n - i; indices [i] = i * n + i; } MPI_Type_indexed(n, blocklens, indices, &UTMatrixType, &ElemType).
Как и ранее, способ конструирования, определяемый функцией MPI_Type_hindexed, отличается тем, что элементы indices для определения интервалов между блоками задаются в байтах, а не в элементах исходного типа данных.
Следует отметить, что существует еще одна дополнительная функция MPI_Type_create_indexed_block индексного способа конструирования для определения типов с блоками одинакового размера (данная функция предусматривается стандартом MPI-2).