The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа
next up previous contents
Next: Атрибуты окна Up: Инициализация Previous: Инициализация   Contents

Создание окна

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

MPI_WIN_CREATE(base, size, disp_unit, info, comm, win)

IN base начальный адрес окна (выбор)  
IN size размер окна в байтах (неотрицательное целое число)  
IN disp_unit размер локальной единицы смещения В байтах (положительное целое)  
IN info аргумент info (дескриптор)  
IN comm коммуникатор (дескриптор)  
OUT win оконный объект, вызвращаемый вызовом (дескриптор)  

int MPI_Win_create(void *base, MPI_Aint size, int disp_unit,
        MPI_Info info, MPI_Comm comm, MPI_Win *win)

MPI_WIN_CREATE(BASE, SIZE, DISP_UNIT, INFO, COMM, WIN, IERROR)
   <type> BASE(*)
   INTEGER(KIND=MPI_ADDRESS_KIND) SIZE
   INTEGER DISP_UNIT, INFO, COMM, WIN, IERROR

static MPI::Win MPI::Win::Create(const void* base,
            MPI::Aint size, int disp_unit, const MPI::Info& info,
            const MPI::Intracomm& comm)

Это - коллективный вызов, выполняемый всеми процессами из группы коммуникационного взаимодействия comm. Этот вызов возвращает оконный объект, который может использоваться этими процессами для выполнения RMA операций. Каждый процесс определяет окно в существующей памяти, которое он предоставляет для дистанционного доступа процессам из группы коммуникационного взаимодействия comm. Окно состоит из size байт, начинающихся c адреса base. Процесс может и не предоставлять никакой памяти, при этом size=0.

Для упрощения адресной арифметики в RMA операциях представляется аргумент, определяющий единицу смещения: значение аргумента смещения в RMA операции для процесса-адресата масштабируется с коэффициентом disp_unit, определенным адресатом при создании окна.

Объяснение: Размер окна указывается, используя целое, приведенное к адресному типу, в связи с этим, чтобы разрешить существование окон, которые занимают больше, чем 4 Гбайт адресного пространства. (Даже если размер физической памяти меньше, чем 4 Гбайт, область адресов может быть больше, чем 4 Гбайт, если адреса не являются непрерывными.) []

Совет пользователям: Обычным выбором для значения disp_unit являются 1 (нет масштабирования), и (в синтаксисе Си) sizeof(type) для окон, которые состоят из массива элементов типа type. В последнем случае можно использовать индексы массивов в RMA вызовах, что обеспечивает правильное масштабирование к байтовому смещению даже в неоднородной среде. []

Параметр info предоставляет подсказку относительно ожидаемой структуры использования окна исполняющей системе для выполнения оптимизации. Предопределено следующее ключевое значение для info:

No_locks -- если установлено в TRUE, то в процессе выполнения можно считать, что локальное окно никогда не блокируется (выполнением вызова MPI_WIN_LOCK). Это подразумевает, что данное окно не используется в трехсторонних коммуникациях, и RMA может быть реализован без активности (либо с меньшей активностью) асинхронного агента для этого процесса.

Разные процессы в группе коммуникационного взаимодействия comm могут определять окна адресаты, полностью различающиеся по расположению, размеру, по единицам смещения и параметру (аргументу) info. В случае, если все обращения по get, put и accumulate к некоторому процессу заполнят его выходное окно, это не должно вызвать никаких проблем. Одна и та же самая область памяти может появляться в нескольких окнах, каждое из которых связано с различными оконными объектами. Как бы не были прозрачны одновременные взаимодействия, перекрывающиеся окна могут приводить к ошибочным результатам.

Совет пользователям: Окно можно создать в любой части памяти процесса. Однако, на некоторых системах, эффективность окон в памяти, которая распределена вызовом MPI_ALLOC_MEM (Раздел 4.11) будет лучше. Также, на некоторых системах, эффективность улучшается, когда границы окна выравниваются по ``естественным'' границам (слово, двойное слово, строка кэша, страничный блок, и т.д.). []

Совет разработчикам: В случаях, когда RMA операции используют различные механизмы в различных областях памяти (например, load/store в разделяемом сегменте памяти и асинхронный обработчик в приватной памяти), обращение MPI_WIN_CREATE нуждается в выяснении, какой тип памяти используется для окна. Чтобы это сделать, MPI внутренне поддерживает список сегментов памяти, распределенных MPI_ALLOC_MEM, или с помощью другого, зависящего от реализации, механизма, вместе с информацией о типе распределенного сегмента памяти. Когда происходит вызов MPI_WIN_CREATE, MPI проверяет, какой сегмент содержит каждое окно и соответственно решает, какой механизм использовать для операций RMA.

Поставщики могут предоставлять дополнительные, зависящие от реализации механизмы, чтобы обеспечить использование "хорошей" памяти для статических переменных.

Разработчики должны документировать любое влияние выравнивания окна на эффективность. []

MPI_WIN_FREE(win)

INOUT win оконный объект (дескриптор)  

int MPI_Win_free(MPI_Win *win)

MPI_WIN_FREE(WIN, IERROR)
   INTEGER WIN, IERROR

void MPI::Win::Free()

MPI_WIN_FREE освобождает оконный объект и возвращает пустой дескриптор (со значением
[]MPI_WIN_NULL). Это коллективный вызов, выполняемый всеми процессами в группе, связанной с окном win.

MPI_WIN_FREE(win) может вызываться процессом только после того, как тот завершил участие в RMA взаимодействиях с оконным объектом win: т.е. процесс вызвал MPI_WIN_FENCE или вызов MPI_WIN_WAIT, чтобы выполнить согласование с предыдущим вызовом MPI_WIN_POST, или вызов MPI_WIN_COMPLETE, чтобы выполнить согласование с предыдущим вызовом MPI_WIN_START, или вызов MPI_WIN_UNLOCK, чтобы выполнить согласование с предыдущим вызовом MPI_WIN_LOCK. После возврата из вызова память окна можно освободить.

Совет пользователям: MPI_WIN_FREE требует барьерной синхронизации:

никакой из процессов не может выполнить возврат из free, пока все процессы из группы данного окна win не вызовут free. Это предусмотрено, чтобы гарантировать, что никакой из процессов не будет пытаться обратиться к окну (например, с запросами lock/unlock) после того, как это окно было освобождено.


next up previous contents
Next: Атрибуты окна Up: Инициализация Previous: Инициализация   Contents
Alex Otwagin 2002-12-10



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру