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

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

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

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

Совет разработчикам: В языке ФОРТРАН указатель может быть индексом таблицы скрытых объектов в системной таблице; в Си он может быть индексом или указателем на объект. Указатели С++ могут просто ``обертывать'' индекс таблицы или указатель.

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

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

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

MPI обеспечивает некоторые предопределенные скрытые объекты и предопределенные, статические указатели к этим объектам. Пользователь не должен освобождать такие объекты. В С++ это предписано объявлением указателей к этим предопределенным объектам, чтобы они имели тип static const.

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

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

Требование, чтобы указатели поддерживали присваивание/сравнение, делает такие операции общими. Это ограничивает область возможных реализаций. Альтернативой могло бы быть позволить указателям быть произвольным, скрытым типом. Это вынудило бы делать назначение и сравнение в преамбуле подпрограмм, добавляя сложность, и поэтому было исключено.

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

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



Alex Otwagin 2002-12-10