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

Скрытые объекты MPI

Если не сказать иначе, скрытые объекты ``одинаковы'' на всех языках: они несут ту же самую информацию, и имеют то же самое значение на обоих языках. Механизм, описанный в предыдущем разделе, может использоваться, чтобы передать ссылки к объектам 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 бита.

Это - проблема, независимая от межъязыковых проблем. Предположим, что процесс ФОРТРАН имеет адресное пространство $\ge$ 4 Гб. Каким должно быть значение, возвращенное в ФОРТРАН MPI_ADDRESS, для переменной с адресом более чем $2^{32}$? Описанное здесь оформление устраняет этот вопрос, при поддержании совместимости с текущими кодами языка ФОРТРАН.

Константа 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, описанную в том же разделе. Новые функции имеют такие же функциональные возможности как старые функции на Си/С++, или на системах языка ФОРТРАН, где заданные по умолчанию INTEGERs являются адрес-размерными. В ФОРТРАН они принимают аргументы типа INTEGER(KIND=MPI_ADDRESS_KIND), везде, где используются аргументы типа MPI_Aint в Си. На системах ФОРТРАН77, которые не поддерживают систему обозначения KIND языка ФОРТРАН90, и где адреса - 64 бита, принимая во внимание, что, заданные по умолчанию INTEGER - 32 бита, эти аргументы будут иметь соответствующий целочисленный тип. Старые функции продолжают поддерживаться, для совместимости вниз. Однако, пользователям рекомендуется использовать новые функции в языке ФОРТРАН, чтобы избежать проблем на системах с адресным диапазоном > $2^{32}$, и обеспечить совместимость через языки.



Alex Otwagin 2002-12-10