next up previous contents
Next: Fence Up: Односторонние взаимодействия Previous: Функция acumulate   Contents

Синхронизационные вызовы

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 обеспечивает три механизма синхронизации:

  1. Коллективный синхронизационный MPI_WIN_FENCE вызов обеспечивает простую модель синхронизации, которая часто используется при параллельных вычислениях: а именно, слабосинхронную модель (loosely synchronous model), когда общие вычислительные фазы перемежаются с фазами общих комуникаций. Такой механизм более всего пригоден для слабосинхронных алгоритмов, когда граф взаимодействующих процессов меняется очень часто, либо когда каждый процесс взаимодействует со многими другими.

    Этот вызов используется для коммуникаций с активным адресатом. Период доступа в инициаторе (originator) или период предоставления доступа в процессе адресате (target) начинаются и заканчиваются вызовами MPI_WIN_FENCE. Процесс может иметь доступ к окнам на всех процессах в группе win во время такого периода доступа, и все процессы в группе win могут доступиться к локальному окну во время такого периода предоставления доступа.

  2. Четыре функции 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 есть групповой аргумент, который определяет набор инициаторов для данного периода.

  3. И последнее, общие и эксклюзивные блокировки обеспечиваются двумя вызовами
    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. Синхронизационные вызовы корректно упорядочивают обращения к окну, но не обязательно синхронизируют другие операции. Эта слабая синхронизация семантически допускает более эффективную реализацию.

\includegraphics[scale=0.90]{pic/6.1.eps}


Рисунок 6.1. Коммуникации с активным адресатом. Синхронизация представлена пунктирными стрелками (упорядочение событий).

\includegraphics[scale=0.90]{pic/6.2.eps}


Рисунок 6.2. Коммуникации с активным адресатом и слабой синхронизацией. Синхронизация представлена пунктирными стрелками (упорядочение событий).

Рис 6.3 иллюстрирует общую модель синхронизации для коммуникаций с пассивным адресатом. Первый процесс-инициатор обменивается данными со вторым инициатором через память процесса-адресата; процесс-адресат явно не участвует во взаимодействии. Вызовы lock и unlock гарантируют, что два RMA обращения одновременно не возникнут. Однако, они не гарантируют, что вызов put первого инициатора будет предшествовать вызову get второго инициатора.

\includegraphics[scale=0.7]{pic/6.3.eps}


Рисунок 6.3. Коммуникации с пассивным адресатом. Синхронизация представлена пунктирными стрелками (упорядочение событий).



Subsections
next up previous contents
Next: Fence Up: Односторонние взаимодействия Previous: Функция acumulate   Contents
Alex Otwagin 2002-12-10