Смещения в универсальном типе данных задаются относительно начального буферного адреса. Этот начальный ``нулевой адрес'' отмечается константой MPI_BOTTOM. Поэтому тип данных может описывать абсолютный адрес элементов в коммуникационном буфере, в этом случае аргумент buf получает значение MPI_BOTTOM.
Адрес ячейки памяти может быть найден путем использования функции MPI_ADDRES.
Синтаксис функции MPI_ADDRESS представлен ниже.
MPI_TYPE_HINDEXED(count, array_of_blocklengths,
array_of_displacements, oldtype, newtype)
IN | count | число блоков (неотрицательное целое) | |
IN | array_of_blocklengths | число элементов в каждом блоке (массив неотри-цательных целых) | |
IN | array_of_displacements | смещение каждого блока в байтах (массив целых) | |
IN | oldtype | старый тип данных (дескриптор) | |
OUT | newtype | новый тип данных (дескриптор) |
int MPI_Type_hindexed(int count, int *array_of_blocklengths,
MPI_Aint *array_of_displacements, MPI_Datatype oldtype,
MPI_Datatype *newtype)
MPI_TYPE_HINDEXED(COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS,
OLDTYPE, NEWTYPE, IERROR)
INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), ARRAY_OF_DISPLACEMENTS(*),
OLDTYPE, NEWTYPE, IERROR
Функция MPI_ADDRESS возвращает байтовый адрес ячейки.
Пример 3.25 Использование MPI_ADDRESS для массива.
REAL A(100,100)
INTEGER I1, I2, DIFF
CALL MPI_ADDRESS(A(1,1), I1, IERROR)
CALL MPI_ADDRESS(A(10,10), I2, IERROR)
DIFF = I2 - I1
! Значение DIFF есть 909*sizeofreal; значение I1 и I2 зависят от
! реализации.
Совет пользователям: Пользователи языка Си иногда стараются избежать использования MPI_ADDRESS, надеясь на доступность адресного оператора &. Заметим, однако, что & - выражение - это указатель (pointer), а не адрес. ANSI Си не требует, чтобы значение указателя было абсолютным адресом объекта, хотя это общий случай. Более того, ссылка может не иметь уникального определения на машине с сегментным адресным пространством. Использование MPI_ADDRESS в языке Си гарантирует также мобильность для таких машин.[]
Совет пользователям: Чтобы предупредить проблему с копированием аргументов и оптимизацией регистров, выполняемую компиляторами языка ФОРТРАН, следует обратить внимание на раздел 10.2.2 в стандарте MPI-2.[]
Следующая вспомогательная функция обеспечивает полезную информацию о производных типах данных.
Синтаксис функции MPI_TYPE_EXTENT представлен ниже.
MPI_TYPE_EXTENT(datatype, extent)
IN | datatype | тип данных (дескриптор) | |
OUT | extent | экстент типа данных (целое) |
int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent)
MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERROR)
INTEGER DATATYPE, EXTENT, IERROR
Функция MPI_TYPE_EXTENT возвращает экстент типа данных, где экстент определяется так, как описано в разделе 3.12.3.
Синтаксис функции MPI_TYPE_SIZE представлен ниже.
MPI_TYPE_SIZE (datatype, size)
IN | datatype | тип данных (дескриптор) | |
OUT | size | размер типа данных (целое) |
int MPI_Type_size(MPI_Datatype datatype, int *size)
MPI_TYPE_SIZE(DATATYPE, SIZE, IERROR)
INTEGER DATATYPE, SIZE, IERROR
int MPI::Datatype::Get_size() const
Функция MPI_TYPE_SIZE возвращает общий размер в байтах элементов в сигнатуре типа, связанной с datatype; это общий размер данных в сообщении, которое было бы создано с этим типом данных. Элементы, которые появляются в типе данных несколько раз, подсчитываются с учетом их кратности.