next up previous contents
Next: Массивы аргументов Up: Типы данных Previous: Типы данных   Contents

Скрытые (оpaque) объекты

MPI управляет системной памятью, которая используется для буферизации сообщений и для хранения внутреннего представления различных объектов MPI, таких как группы, коммуникаторы, типы данных и так далее. Эта память не является для пользователя прямодоступной и объекты, хранимые здесь, являются скрытыми: их размер и форма невидимы пользователю. К скрытым объектам обращаются через дескрипторы (handles), которые существуют в пространстве пользователя. Процедуры MPI, которые оперируют на скрытых объектах, посылают аргументы дескриптора, чтобы получить доступ к этому объекту. В дополнение к их использованию вызовами MPI дескрипторы могут участвовать в операциях присваивания и сравнениях.

В языке ФОРТРАН все дескрипторы имеют тип INTEGER. В Си для каждой категории объектов определены различные типы указателей. Это должны быть типы, поддерживающие операторы присваивания и сравнения.

В языке ФОРТРАН дескриптор может быть индексом для таблицы скрытых объектов в системной таблице; в языке Си он может быть таким же индексом или указателем (pointer) на объект.

Скрытые объекты создаются и удаляются вызовами, которые специфичны для каждого объектного типа. Они находятся в списке в разделе, где описаны объекты. Вызовы получают аргумент дескриптора соответствующего типа. В вызовах создания объекта это OUT аргумент, который возвращает ссылку на объект. В вызовах для удаления это INOUT аргумент, который возвращает значение ``нулевой дескриптор '' (``null handle''). MPI обеспечивает константу ``нулевой дескриптор'' для каждого типа объекта. Чтобы проверить правильность дескриптора, используется сравнение с этой константой.

Обращение для удаления делает объект недействительным и отмечает его для удаления. После этого вызова объект становится недоступен пользователю. Однако, в MPI нет необходимости удалять объект немедленно. Любая ждущая операция (во время удаления), которая использует этот объект, будет завершаться нормально, а объект будет удален после этого.

Вызовы MPI не изменяют значения дескрипторов, за исключением вызовов, которые создают и удаляют объекты, и вызова MPI_TYPE_COMMIT, в разделе 3.12.4.

Аргумент со значением ``null handle'' и с маркировкой IN является неверным, кроме случая, когда в тексте, определяющем функцию, явно установлено исключение. Такое исключение допустимо для дескрипторов в объектах запросов при обращении к Wait и Test (разделы 3.7.3 и 3.7.5). В противном случае нулевой указатель может быть передан только функции, которая создает новый объект и возвращает ссылку на него в дескриптор.

Скрытый объект и его дескриптор существенны только в процессе, где был создан объект, и не могут быть переданы другому процессу.

В MPI предусмотрены предопределенные скрытые объекты и предопределенные статические дескрипторы этих объектов. Такие объекты не могут быть разрушены.

Объяснение: Использование в MPI скрытого представления некоторых структур данных имеет то преимущество, что позволяет сходным образом обращаться к этим структурам в языках Си и ФОРТРАН. Это также позволяет избежать конфликтов в правилах типизации для этих языков и обеспечивает будущие расширения функциональности. Механизм скрытых объектов, использованный здесь, близок к стандарту связей POSIX ФОРТРАН.

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

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

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



Alex Otwagin 2002-12-10