next up previous contents
Next: Ассерты Up: Синхронизационные вызовы Previous: Общая синхронизация с активным   Contents

Lock

MPI_WIN_LOCK(lock_type, rank, assert, win)

IN lock_type или MPI_LOCK_EXCLUSIVE или MPI_LOCK_SHARED (состояние)  
IN rank ранк блокированного окна (неотрицательное целое)  
IN assert программный ассерт (целое)  
IN win объект окна (дескриптор)  

int MPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win)

MPI_WIN_LOCK(LOCK_TYPE, RANK, ASSERT, WIN, IERROR) INTEGER LOCK_TYPE, RANK, ASSERT, WIN, IERROR

void MPI::Win::Lock(int lock_type, int rank, int assert) const

Начинает период RMA доступа. Во время этого периода можно обратиться с помощью RMA операций к окну win только из процесса категории rank.

MPI_WIN_UNLOCK(rank, win)

IN rank ранк окна (неотрицательное целое)  
IN win объект окна (дескриптор)  

int MPI_Win_unlock(int rank, MPI_Win win)

MPI_WIN_UNLOCK(RANK, WIN, IERROR) INTEGER RANK, WIN, IERROR

void MPI::Win::Unlock(int rank) const

Вызов завершает период RMA доступа, начатый вызовом MPI_WIN_LOCK(...,win). RMA операции, вызванные во время этого периода, завершатся как в инициаторе, так и в адресате, как только произойдет возврат из вызова.

Блокировки используются чтобы защитить обращения к заблокированному окну-адресату, на которое действуют RMA вызовы, выданные между вызовами lock и unlock, и чтобы защитить локальные load/store обращения к заблокированному локальному окну, выполненные между вызовами lock и unlock. Обращения, защищенные при помощи эксклюзивной блокировки, не будут пересекаться в пределах окна с другими обращениями к этому же окну, которое защищено блокировкой. Обращения, которые защищены совместной блокировкой, не будут пересекаться в пределах окна с обращениями, защищенными с помощью эксклюзивной блокировки, к одному и тому же окну.

Ошибочно иметь окно заблокированное и предоставленное для доступа (в период предоставления доступа) одновременно. Т.е., процесс не может вызвать MPI_WIN_LOCK, чтобы заблокировать окно получателя, если процесс-получатель уже вызвал MPI_WIN_POST, но еще не вызвал MPI_WIN_WAIT; ошибочно вызывать MPI_WIN_POST в то время, как локальное окно заблокировано.

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

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

Реализации могут ограничивать использование RMA коммуникацию, которые синхронизируются вызовами lock к окнам в памяти, размещенным при помощи MPI_ALLOC_MEM (раздел 4.11). Блокировки могут переносимо использоваться только в такой памяти.

Объяснение: Реализация взаимодействия с пассивным адресатом в случае, если память не является совместно используемой (non-shared), требует асинхронного агента. Такой агент может быть просто реализован, и можно достигнуть большей производительности, если ограничиться специально распределенной памятью. Этого в целом можно избежать, если используется совместно используемая (shared) память. Кажется естественным наложить ограничения, которые позволяют использовать совместно используемую память для сторонних коммуникаций на машинах с совместно используемой памятью.

Обратная сторона этого решения состоит в том, что коммуникации с пассивным адресатом не могут использоваться без того, чтобы не использовать преимущество нестандартных особенностей ФОРТРАНa: а именно, возможность использования Си-подобных указателей; они не поддерживаются некоторыми ФОРТРАН компиляторами (g77 и Windows/NT компиляторы, на момент написания). Также коммуникации с пассивным адресатом нельзя переносимо направить на COMMON блоки, или другие статически определенные массивы ФОРТРАНa.

Рассмотрим последовательность вызовов в нижеследующем примере.

Пример 6.5

MPI_Win_lock(MPI_LOCK_EXCLUSIVE, rank, assert, win) MPI_Put(..., rank, ..., win) MPI_Win_unlock(rank, win)

Возврат из вызова MPI_WIN_UNLOCK не произойдет, пока не завершится put-передача в инициаторе и адресате. Это по прежнему оставляет много свободы для разработчиков. Вызов MPI_WIN_LOCK может вызывать блокирование до того, как эксклюзивная блокировка для окна будет подтверждена; или, вызов MPI_WIN_LOCK может не вызывать блокировку в то время, когда блокировку вызывает MPI_PUT до тех пор, пока не будет подтверждена эксклюзивная блокировка для окна; или, первые два вызова могут не выполнить блокирование, в то время как MPI_WIN_UNLOCK вызывает блокировку прежде, чем блокировка подтверждена - обновление окна адресата в этом случае откладывается до тех пор, пока не произойдет вызов MPI_WIN_UNLOCK. Однако, если вызов MPI_WIN_LOCK используется, чтобы заблокировать локальное окно, тогда вызов должен выполнять блокировку раньше, чем блокировка будет подтверждена, поскольку блокировка может защитить локальные load/store обращения к окну, открытому после того, как осуществился возврат из вызова lock.



Alex Otwagin 2002-12-10