| |
Если не сказать иначе, скрытые объекты ``одинаковы'' на всех языках: они несут ту же самую информацию, и имеют то же самое значение на обоих языках. Механизм, описанный в предыдущем разделе, может использоваться, чтобы передать ссылки к объектам MPI из языка в язык. К объекту, созданному на одном языке можно обращаться, изменяться или освобождать на другом языке.
Ниже мы исследуем, более подробно, проблемы, которые возникают для каждого типа объекта MPI.
Типы данных
Типы данных кодируют ту же самую информацию на всех языках. Например,
средство доступа к типу данных, подобное MPI_TYPE_GET_EXTENT
,
возвратит ту же самую информацию на всех языках. Если тип данных,
определенный на одном языке, используется для вызова связи на другом языке,
то посланное сообщение будет идентично сообщению, которое было бы послано
из первого языка: обращение идет к тому же самому буферу связей, и выполняется
то же самое преобразование представления, если необходимо. Все
предопределенные типы данных могут использоваться в конструкторах типа
данных на любом языке. Если тип данных фиксирован, он может использоваться
для связи на любом языке.
Функция MPI_GET_ADDRESS
возвращает то же самое значение на всех
языках. Обратите внимание, что мы не требуем, чтобы константа
MPI_BOTTOM
имела то же самое значение на всех языках (см. 4.12.9, стр.
59).
Пример 4.12
! КОД Фортрана REAL R(5) INTEGER TYPE, IERR INTEGER (KIND=MPI_ADDRESS_KIND) ADDR ! Создать абсолютный тип данных для массива R CALL MPI_GET_ADDRESS(R, ADDR, IERR) CALL MPI_TYPE_CREATE_STRUCT(1, 5, ADDR, MPI_REAL, TYPE, IERR) CALL C_ROUTINE (TYPE) /* Код Си */ void C_ROUTINE (MPI_Fint *ftype) { int count = 5; int lens[2] = {1,1}; MPI_Aint displs[2]; MPI_Datatype types[2], newtype; /* создать абсолютный тип данных для буфера, который состоит */ /* из индекса, сопровождаемого R(5) */ MPI_Get_address(&count, &displs[0]); displs[1] = 0; types[0] = MPI_INT; types[1] = MPI_Type_f2c (*ftype); MPI_Type_create_struct (2, lens, displs, типы, &newtype); MPI_Type_commit(&newtype); MPI_Send (MPI_BOTTOM, 1, newtype, 1, 0, MPI_COMM_WORLD); /* посланное сообщение содержит индекс int 5, следуемый за */ /* 5 REAL составляющими массива языка Фортран. */ }
Совет разработчикам:
Может использоваться следующая реализация: адреса MPI, возвращенные
MPI_GET_ADDRESS
, будут иметь то же самое значение на всех языках.
Один из очевидных вариантов - адреса MPI идентичны регулярным адресам.
Адрес сохраняется в типе данных, когда создаются типы данных с абсолютными
адресами. Когда выполняется операция послать или получить, то
адреса, сохраненные в типе данных, интерпретируются как смещения, которые
увеличиваются на базовый адрес. Этот базовый адрес является (адресом)
buf
, или нуль, если buf = MPI_BOTTOM
. Таким образом, если
MPI_BOTTOM
нулевой, тогда вызов послать или получить с
buf = MPI_BOTTOM
осуществляется также, как вызов с обычным буферным
аргументом: в обоих случаях базовый адрес - buf
. С другой стороны, если
MPI_BOTTOM
- не нуль, то реализация должна быть слегка различна.
Выполняется проверка, равен ли buf = MPI_BOTTOM
. Если это так, то базовый
адрес нулевой, иначе он равен buf
. В частности, если MPI_BOTTOM
не имеет того же самого значения в языке ФОРТРАН и Си/С++, то
дополнительная проверка для buf = MPI_BOTTOM
необходима по крайней
мере на одном из языков.
Желательно использовать значение, отличное от нуля для MPI_BOTTOM
даже на Си/С++, чтобы отличить его от указателя NULL
. Если
MPI_BOTTOM = c
, то можно все еще избежать проверки buf = MPI_BOTTOM
,
используя смещение из MPI_BOTTOM
, то есть,
регулярный адрес - c, как адрес MPI, возвращенный
MPI_GET_ADDRESS
и сохраненный в абсолютных типах данных. []
Функции повторного вызова
Вызовы MPI могут сопоставить функции повторного вызова с объектами MPI: обработчики ошибок связаны с коммуникаторами и файлами, атрибуты копирующих и удаляющих функций связаны с ключами атрибута, операции преобразования связаны с объектами операции, и т.д. В многоязычной среде функция, переданная в вызове MPI в одном языке, может быть использована вызовом MPI в другом языке. Реализации MPI должны удостовериться, что такое обращение будет использовать соглашение о вызовах языка, к которому привязана функция.
Совет разработчикам: Функции повторного вызова должны иметь идентификатор языка. Этот идентификатор установлен, когда в функцию повторного вызова передают аргументы в соответствии с библиотечной функцией (которая, возможно, является различной для каждого языка), и используется, чтобы генерировать правильную вызывающую последовательность, когда используется функция повторного вызова. []
Обработчики ошибки
Совет разработчикам:
Обработчики ошибки в Си и С++ имеют список
параметров ``stdargs
''. Было бы полезно обеспечить указатель информацией
среды языка, где произошла ошибка. []
Операции преобразования
Совет пользователям: Операции преобразования получают в качестве одного из аргументов тип данных операндов. Таким образом, можно определять ``полиморфные'' операции преобразования, которые работают для типов данных языков Си, С++ и ФОРТРАН. []
Адреса
Некоторые из средств доступа типа данных и конструкторов имеют аргументы
типа MPI_Aint
(в Си) или MPI::Aint
в С++, чтобы хранить
адреса. Соответствующие аргументы в языке ФОРТРАН имеют тип INTEGER
.
Это заставляет ФОРТРАН и Си/С++ быть несовместимыми в среде, где
адреса имеют 64 бита, а INTEGER
ФОРТРАН языка имеют 32 бита.
Это - проблема, независимая от межъязыковых проблем. Предположим, что
процесс ФОРТРАН имеет адресное пространство 4 Гб. Каким должно быть
значение, возвращенное в ФОРТРАН MPI_ADDRESS
, для переменной с
адресом более чем ? Описанное здесь оформление устраняет этот вопрос,
при поддержании совместимости с текущими кодами языка ФОРТРАН.
Константа MPI_ADDRESS_KIND
определена так, чтобы в ФОРТРАН90
тип переменной
INTEGER(KIND=MPI_ADDRESS_KIND)
был
целочисленным типом размера адреса (обычно, но не обязательно, размер
INTEGER(KIND=MPI_ADDRESS_KIND)
равен 4 на 32 разрядных
машинах и 8 на 64 разрядных машинах). Точно так же константа
MPI_INTEGER_KIND
определена так, чтобы
INTEGER(KIND=MPI_INTEGER_KIND)
был заданным по
умолчанию размером INTEGER
.
Есть семь функций, которые имеют адресные аргументы:
MPI_TYPE_HVECTOR
, MPI_TYPE_HINDEXED
,
MPI_TYPE_STRUCT
, MPI_ADDRESS
, MPI_TYPE_EXTENT
,
MPI_TYPE_LB
и MPI_TYPE_UB
.
Четыре новых функции предназначены, чтобы дополнить первые четыре
функции в этом списке. Эти функции описаны в Разделе 4.14, стр. 65.
Оставшиеся три функции дополнены новой функцией
MPI_TYPE_GET_EXTENT
, описанную в том же разделе. Новые функции
имеют такие же функциональные возможности как старые функции на
Си/С++,
или на системах языка ФОРТРАН, где заданные по умолчанию INTEGER
s
являются адрес-размерными. В ФОРТРАН они принимают аргументы типа
INTEGER(KIND=MPI_ADDRESS_KIND)
, везде, где используются
аргументы типа MPI_Aint
в Си. На системах ФОРТРАН77, которые не
поддерживают систему обозначения KIND
языка ФОРТРАН90, и где
адреса - 64 бита, принимая во внимание, что, заданные по умолчанию
INTEGER
- 32 бита, эти аргументы будут иметь соответствующий
целочисленный тип. Старые функции продолжают поддерживаться, для
совместимости вниз. Однако, пользователям рекомендуется использовать новые
функции в языке ФОРТРАН, чтобы избежать проблем на системах с адресным
диапазоном > , и обеспечить совместимость через языки.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |