| |
Ключи атрибута могут быть распределены на одном языке и освобождены в
другом. Аналогично, значения атрибута могут быть установлены на одном языке
и доступны в другом. Чтобы достигнуть этого, ключи атрибута будут
распределены в целочисленном диапазоне, который является действительным во
всех языках. Те же условия хранения истинны для значений определенных системой
атрибутов (типа 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 для предопределенных атрибутов, и гарантирует, что информация не будет потеряна, когда атрибуты передаются из языка в язык. []
Совет разработчикам: Реализации должны пометить атрибуты или как атрибуты ссылки или как целочисленные атрибуты, согласно тому, были ли они установлены в Си или в ФОРТРАН. Таким образом, правильный выбор может быть сделан, когда атрибут восстановлен. []
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |