RMA взаимодействия делятся на две категории:
Комуникационные RMA вызовы с аргументом win
должны происходить
только во время периода доступа для win
. Такой период доступа
начинается синхронизационным RMA вызовом к win
; за ним следуют ноль
или более коммуникационных RMA вызовов (MPI_PUT
, MPI_GET
или MPI_ACCUMULATE
) к win
; период заканчивается другим
синхронизационным вызовом к win
. Это позволяет пользователям
поддерживать единственную синхронизацию при многочисленных передачах данных и
обеспечивает разработчикам большую гибкость в реализации RMA операций.
Различные периоды доступа для win
в пределах одного процесса не
должны совмещаться. С другой стороны, периоды доступа, принадлежащие
разным win
могут перекрываться. В течение периода доступа могут
также происходить локальные операции или другие RMA вызовы.
При взаимодействии с активным адресатом к его окну можно обратиться с
помощью RMA операций только в пределах периода предоставления
доступа. Подобный период начинается и заканчивается синхронизационными
RMA вызовами, выполняемыми процессом-адресатом (target). Различные
периоды предоставления доступа в процессах на одном и том же окне не
должны совмещаться, но такие периоды предоставления доступа могут
перекрываться периодами предоставления доступа к другим окнам или с
периодами доступа для тех же или других аргументов win
. Существует
однозначное соответствие между периодами доступа инициаторов (originator)
и периодами предоставления доступа процессов-адресатов (target): RMA
операции, запущенные инициатором для окна адресата, будут иметь доступ к
этому окну во время одного и того же периода предоставления доступа только
в том случае, если они созданы во время одного и того же периода доступа.
При взаимодействии с пассивным адресатом, процесс-адресат не выполняет синхронизационных RMA вызовов, и понятия периода предоставления доступа не существует.
MPI обеспечивает три механизма синхронизации:
MPI_WIN_FENCE
вызов
обеспечивает простую модель синхронизации, которая часто используется при
параллельных вычислениях: а именно, слабосинхронную модель (loosely
synchronous model), когда общие вычислительные фазы перемежаются с фазами
общих комуникаций. Такой механизм более всего пригоден для слабосинхронных
алгоритмов, когда граф взаимодействующих процессов меняется
очень часто, либо когда каждый процесс взаимодействует со многими другими.
Этот вызов используется для коммуникаций с активным адресатом. Период
доступа в инициаторе (originator) или период предоставления доступа в
процессе адресате (target) начинаются и заканчиваются вызовами
MPI_WIN_FENCE
. Процесс может иметь доступ к окнам на всех
процессах в группе win
во время такого периода доступа, и все
процессы в группе win
могут доступиться к локальному окну во время
такого периода предоставления доступа.
MPI_WIN_START
, MPI_WIN_COMPLETE
,
MPI_WIN_POST
и MPI_WIN_WAIT
могут использоваться чтобы свести
синхронизацию к минимуму: синхронизируются только пары взаимодействующих
процессов, и это происходит только тогда, когда синхронизация необходима,
чтобы корректно упорядочить RMA обращения к окну принимая во внимание
локальные обращеня к этому же окну. Этот механизм может быть более
эффективным, когда каждый процесс взаимодействует с малым количеством
(логических) соседей, а комуникационный граф постоянен или редко меняется.
Эти вызовы используются для взаимодействия с активным адресатом. Период
доступа начинается в инициаторе вызовом MPI_WIN_START
и
заканчивается вызовом MPI_WIN_COMPLETE
. У вызова start
есть
групповой аргумент, который определяет группу процессов-адресатов для
данного периода доступа. Период предоставления доступа начинается в
процессе-адресате вызовом MPI_WIN_POST
и заканчивается вызовом
MPI_WIN_WAIT
. У вызова post
есть групповой аргумент,
который определяет набор инициаторов для данного периода.
MPI_WIN_LOCK
и MPI_WIN_UNLOCK
.
Синхронизация с блокировками полезна для MPI приложений, которые
эмулируют модель с
общей памятью через MPI вызовы; например в модели ``доска объявлений'', где
процессы, в случайные промежутки времени, могут обращаться или обновлять
различные части ``доски объявлений''.
Эти два вызова обеспечивают взаимодействие с пассивным адресатом (passive
target). Период доступа начинается вызовом MPI_WIN_LOCK
и
завершается вызовом MPI_WIN_UNLOCK
. Только одно окно адресата
может быть доступно во время периода доступа к win
.
Рис 6.1 иллюстрирует общую модель синхронизации для коммуникаций с
активным адресатом. Синхронизация между post
и start
гарантирует, что вызов put
инициатора не начнется раньше,
чем адресат создаст окно (с помощью вызова post
);
процесс-адресат создаст окно только после того, как завершились
предшедствующие локальные обращения. Синхронизация между complete
и
wait
гарантирует, что вызов put
инициатора
выполнится раньше, чем закроется окно (с помощью процедуры wait
).
Процесс-адресат будет выполнять следующие локальные обращения к окну
адресату только после того, как выполнится возврат из wait
.
Рис 6.1 илюстрирует операции, происходящие в естественном временном
порядке, подразумеваемом при синхронизациях: post
происходит перед
соответствующим start
, и complete
происходит перед
соответствующим wait
. Хотя такой сильной синхронизации
более чем достаточно для правильного упорядочивания доступа к окну,
семантика MPI вызовов делает возможной слабую синхронизацию, как
показано на рис. 6.2. Доступ к окну-адресату задерживается, пока окно не
будет предоставлено для доступа после выполнения post
. Хотя
start
может выполниться раньше; put
и complete
также
могут завершиться раньше, если выкладываемые данные буферизуются
конкретной реализацией MPI. Синхронизационные вызовы корректно
упорядочивают обращения к окну, но не обязательно синхронизируют другие
операции. Эта слабая синхронизация семантически допускает более
эффективную реализацию.
Рис 6.3 иллюстрирует общую модель синхронизации для коммуникаций с
пассивным адресатом. Первый процесс-инициатор обменивается данными со
вторым инициатором через память процесса-адресата; процесс-адресат явно
не участвует во взаимодействии. Вызовы lock
и unlock
гарантируют, что два RMA обращения одновременно не возникнут.
Однако, они не гарантируют, что вызов put
первого инициатора будет
предшествовать вызову get
второго инициатора.