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

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

Объекты типов данных должны быть объявлены (committed) перед их использованием в коммуникациях. Объявленный тип данных может быть использован как аргумент в конструкторах типов данных. Базисные типы данных объявлять не нужно, поскольку они ``предобъявлены'' (``pre-committed'').

Синтаксис функции MPI_TYPE_COMMIT представлен ниже.

MPI_TYPE_COMMIT(datatype)

INOUT datatype тип данных, который объявляется (дескриптор)

int MPI_Type_commit(MPI_Datatype *datatype) MPI_TYPE_COMMIT(DATATYPE, IERROR) INTEGER DATATYPE, IERROR void MPI::Datatype::Commit()

Операция commit объявляет тип данных, то есть формально описывает коммуникационный буфер, но не содержимое этого буфера. Поэтому после того, как тип данных объявлен, он может быть многократно использован, чтобы передавать изменяемое содержимое буфера или различных буферов с различными стартовыми адресами.

Совет разработчикам: Система может во время объявления ``компилировать'' внутреннее представление для типа данных, которое облегчает коммуникации, например, перейти от компактного представления типа данных к прямому, и выбирать наиболее удобный механизм передачи.[]

Синтаксис функции MPI_TYPE_FREE представлен ниже.

MPI_TYPE_FREE(datatype)

INOUT datatype тип данных, который удаляется (дескриптор)

int MPI_Type_free(MPI_Datatype *datatype) MPI_TYPE_FREE (DATATYPE, IERROR) INTEGER DATATYPE, IERROR void MPI::Datatype::Free()

Функция MPI_TYPE_FREE маркирует объекты типа данных, связанные с datatype для удаления и установки типа данных в MPI_DATATYPE_NULL. Любой обмен, который использует этот тип данных, будет завершен нормально. Производные типы данных, которые произошли от удаленного типа, не меняются.

Пример 3.27 Следующий фрагмент кода дает пример использования MPI_TYPE_COMMIT.

INTEGER type1, type2 CALL MPI_TYPE_CONTIGUOUS(5, MPI_REAL, type1, ierr) ! создан новый объект типа данных CALL MPI_TYPE_COMMIT(type1, ierr) ! теперь type1 может быть использован для обмена type2 = type1 ! type2 может быть использован для обмена ! (это дескриптор к такому же объекту как type1) CALL MPI_TYPE_VECTOR(3, 5, 4, MPI_REAL, type1, ierr) ! создан новый необъявленный объект типа CALL MPI_TYPE_COMMIT(type1, ierr) ! теперь type1 может быть использован снова для обмена

Удаление типа данных не воздействует на другой тип, который является производным от удаленного типа. Система ведет себя, как если бы аргументы входного типа данных были переданы конструктору производного типа данных по значению.

Совет разработчикам: Реализация может вести подсчет активных коммуникаций, которые используют некоторый тип данных, чтобы решить, когда удалить его. Кроме того, можно реализовать конструкторы производных типов так, чтобы они хранили указатели на аргументы их типа данных, а не копировали их. В этом случае нужно хранить трек активных ссылок на определения типа данных, чтобы знать, когда объект типа данных может быть освобожден.[]



Alex Otwagin 2002-12-10