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
.