next up previous contents
Next: Маркеры нижней и верхней Up: Производные типы данных Previous: Конструкторы типа данных   Contents

Адресные функции и функции экстентов

Смещения в универсальном типе данных задаются относительно начального буферного адреса. Этот начальный ``нулевой адрес'' отмечается константой 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; это общий размер данных в сообщении, которое было бы создано с этим типом данных. Элементы, которые появляются в типе данных несколько раз, подсчитываются с учетом их кратности.


next up previous contents
Next: Маркеры нижней и верхней Up: Производные типы данных Previous: Конструкторы типа данных   Contents
Alex Otwagin 2002-12-10