Объявление производных типов и их удаление

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

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

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

где

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

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

· indices — смещение каждого блока от начала типа;

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

· 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).

Как отмечалось ранее, структурный способ является самым общим методом конструирования производного типа данных при явном задании соответствующей карты типа. Использование такого способа производится при помощи функции:

int MPI_Type_struct(int count, int blocklens[], MPI_Aint indices[], MPI_Data_type oldtypes[], MPI_Datatype *newtype),

где

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

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

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

· oldtypes — исходные типы данных в каждом блоке в отдельности;

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

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

Рассмотренные в предыдущем пункте функции конструирования позволяют определить производный тип данных. Дополнительно перед использованием созданный тип должен быть объявлен при помощи функции:

int MPI_Type_commit(MPI_Datatype *type),

где

· type – объявляемый тип данных.

При завершении использования производный тип должен быть аннулирован при помощи функции:

int MPI_Type_free(MPI_Datatype *type),

где

· type – аннулируемый тип данных.


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



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