next up previous contents
Next: Дополнительное состояние Up: Способность языка к взаимодействию Previous: Скрытые объекты MPI   Contents

Атрибуты

Ключи атрибута могут быть распределены на одном языке и освобождены в другом. Аналогично, значения атрибута могут быть установлены на одном языке и доступны в другом. Чтобы достигнуть этого, ключи атрибута будут распределены в целочисленном диапазоне, который является действительным во всех языках. Те же условия хранения истинны для значений определенных системой атрибутов (типа MPI_TAG_UB, MPI_WTIME_IS_GLOBAL и т.д.)

Ключи атрибута, объявленные на одном языке, связаны с функциями копировать и удалить на том же языке (функции, предусмотренные вызовом MPI_{TYPE,COMM,WIN}_CREATE_KEYVAL). Когда коммуникатор или тип данных дублированы, для каждого атрибута вызывается соответствующая функция копирования, используя правильное соглашение о вызовах для языка этой функции; точно так же и для удаляющей функции повторного вызова.

Совет разработчикам: Необходимо, чтобы атрибуты были отмечены или как ``Си'', ``С++'' или ``ФОРТРАН'', и чтобы идентификатор языка был проверен, чтобы использовать правильное соглашение о вызовах для функции повторного вызова. []

Функции манипуляции атрибута, описанные в Разделе 5.7 стандарта MPI-1, определяют аргументы атрибутов как тип void* в Си, и как тип INTEGER в языке ФОРТРАН. На некоторых системах INTEGER будут иметь 32 бита, в то время как указатели языка Си/С++ будут иметь 64 бита. Это - проблема, если атрибуты коммуникатора используются, чтобы переместить информацию из вызывающей программы языка ФОРТРАН в вызывающую программу языка Си/С++, или наоборот.

MPI сохраняет внутри атрибуты размера адреса. Если INTEGER языка ФОРТРАН являются маленькими, то функция ФОРТРАНА MPI_ATTR_GET возвратит самую младшую часть слова атрибута; функция ФОРТРАНА MPI_ATTR_PUT установит самую младшую часть слова атрибута, которая будет расширена до полного слова. (Эти две функции могут быть вызваны явно кодом пользователя, или неявно атрибутом, копирующим функции повторного вызова.)

Что касается адресов, новые функции предназначены для управления атрибутами размера адреса языка ФОРТРАН, и имеют те же самые функциональные возможности, как и старые функции в Си/С++. Эти функции описаны в Разделе 8.8, стр. 198. Пользователям рекомендуется использовать эти новые функции.

MPI поддерживает два типа атрибутов: адрес-значимые атрибуты (указатель), и целочисленные атрибуты. Атрибутивные функции Си и С++ помещают и получают адрес-размерные атрибуты. Атрибутивные функции ФОРТРАНА помещают и получают целочисленно-размерные атрибуты. Когда к целочисленно-размерному атрибуту обращаются из Си или С++, тогда MPI_xxx_get_attr возвратит адрес (указатель на) целочисленно-размерного атрибута. Когда к адрес-значимому атрибуту обращаются из ФОРТРАНА, тогда MPI_xxx_GET_ATTR преобразует адрес в целое число и возвратит результат этого преобразования. Это преобразование произойдет без потерь, если используются новый стиль атрибутивных функций (MPI-2), и возвратится целое число вида MPI_ADDRESS_KIND. Преобразование может вызвать усечение, если используется старый стиль (MPI-1) атрибутивных функций.

Пример 4.13

A. Из Си в ФОРТРАН

Код Си static int i = 5; void *p; p = &i; MPI_Comm_put_attr(..., p); . . . Код ФОРТРАНа INTEGER(kind = MPI_ADDRESS_KIND) val CALL MPI_COMM_GET_ATTR(..., val, ...) IF(val.NE.5) THEN CALL ERROR

B. Из ФОРТРАНА в Си

Код ФОРТРАНа INTEGER(kind=MPI_ADDRESS_KIND) val val = 55555 CALL MPI_COMM_PUT_ATTR(..., val, ierr) Код Си int *p; MPI_Comm_get_attr(..., &p, ...); if (*p != 55555) error();

Предопределенные атрибуты MPI могут быть целочисленными или адресными. Предопределенные целочисленные атрибуты, типа MPI_TAG_UB, ведут себя, как будто они были установлены вызовом ФОРТРАН. То есть в языке ФОРТРАН, MPI_COMM_GET_ATTR(MPI_COMM_WORLD, MPI_TAG_UB, val, flag, ierr) возвратит в val верхнюю границу значения идентификатора; в Си
MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &p, &flag) возвратит в p указатель на int, содержащий верхнюю границу значения идентификатора.

Адресные предопределенные атрибуты, типа MPI_WIN_BASE ведут себя, как будто они были установлены вызовом Си. То есть в языке ФОРТРАН, MPI_WIN_GET_ATTR(win,MPI_WIN_BASE,val,flag,ierror) возвратит в val базовый адрес окна, преобразованный к целому числу. В Си,
MPI_Win_get_attr(win, MPI_WIN_BASE, &p, &flag) возвратит в p указатель на основание окна, приведенное к (void *).

Объяснение: Оформление совместимо с поведением, указанным в MPI-1 для предопределенных атрибутов, и гарантирует, что информация не будет потеряна, когда атрибуты передаются из языка в язык. []

Совет разработчикам: Реализации должны пометить атрибуты или как атрибуты ссылки или как целочисленные атрибуты, согласно тому, были ли они установлены в Си или в ФОРТРАН. Таким образом, правильный выбор может быть сделан, когда атрибут восстановлен. []



Alex Otwagin 2002-12-10