next up previous contents
Next: Примеры Up: Производные типы данных Previous: Использование универсальных типов данных   Contents

Корректное использование адресов

Переменные, последовательно декларированные в языках Си или ФОРТРАН, не обязательно хранятся в смежных ячейках. Поэтому необходимо, чтобы смещения этих переменных не пересекались. К тому же в машине с сегментным адресным пространством адреса не уникальны, и адресная арифметика имеет некоторые необычные свойства. Поэтому использование addresses, то есть смещений относительно стартового адреса MPI_BOTTOM должно быть ограничено.

Переменные принадлежат той же самой последовательной памяти, если они принадлежат тому же массиву, тому же COMMON блоку в языке ФОРТРАН или той же самой структуре в языке Си.

Приведенные выше правила не ограничивают использование производных типов до тех пор, пока они определяют коммуникационный буфер, который целиком расположен в той же самой последовательной памяти. Однако, конструкция коммуникационного буфера, которая содержит переменные, не находящиеся внутри той же самой последовательной памяти, обязана иметь определенные ограничения. В общем случае коммуникационный буфер с переменными вне той же самой последовательной памяти может быть использован только путем описания в коммуникационном вызове buf = MPI_BOTTOM, count = 1, и c использованием аргумент типа данных, где все смещения есть правильные (абсолютные) адреса.

Совет пользователям: Трудно ожидать, что реализации MPI будут способны определять ошибки выхода смещения ``за границы'', если это не переполнение пространства пользователя, поскольку вызов MPI может не знать участок массива и записи в хост программе.[]

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

Заметим, что числа INTEGER в языке ФОРТРАН могут быть слишком малы, чтобы поддерживать адреса (например, 32-разрядные INTEGER на машине с 64-разрядными ссылками). Вследствие этого в языке ФОРТРАН реализации MPI могут ограничивать использование абсолютных адресов только частью памяти процессов и ограничивать использование относительных смещений подразделами памяти процессов, ограниченых размером типа INTEGER языка ФОРТРАН.



Alex Otwagin 2002-12-10