Операция инициализации позволяет каждому процессу из группы интракоммуникаторов определить, используя коллективную операцию, ``окно'' в своей памяти, которое становится доступным для удаленных процессов. Вызов возвращает объект со скрытой структурой, представляющий группу процессов, которые являются обладателями и имеют доступ к набору окон, а также к атрибутам каждого окна, как это определено в инициализационном вызове.
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
) после того, как это окно
было освобождено.