MPI поддерживает три коммуникационных RMA вызова: MPI_PUT
передает данные из памяти инициатора в память адресата; MPI_GET
передает данные из памяти адресата в память инициатора; и
MPI_ACCUMULATE
обновляет адреса в памяти адресата, например,
добавляя к ним значения, посланные из памяти инициатора. Эти операции
являются неблокирующими: т.е. вызов инициирует передачу, но передача
может продолжаться после возврата из вызова. Выполнение передачи
завершается, как в инициаторе, так и в адресате, когда инициатором выдан
последующий синхронизационный вызов к участвующему оконному объекту. Эти
синхронизационные вызовы описаны в разделе 6.4.
Локальный коммуникационный буфер RMA вызова не должен обновлятся, и
к локальному коммуникационному буферу вызова get
не должны
обращаться после RMA вызова до тех пор, пока не выполнится
следующий за ним синхронизационный вызов.
Объяснение:
Вышеуказанное правило является более мягким, чем в случае передачи сообщений,
где мы не позволяем одновременно выполняться двум вызовам send
с
перекрывающимися буферами. Здесь же мы позволяем одновременно
выполняться двум вызовам put
с перекрывающимися буферами. Причины
для этого послабления таковы
put
из перекрывающихся буферов не
могут быть параллельными, тогда мы должны добавлять в код ненужные
синхронизационные точки.
Является ошибочным создавать параллельные конфликтующие обращения к одному
участку памяти в окне; если позиция обновляется операцией put
или
accumulate
, тогда к этому месту нельзя обратиться при помощи
load
или другой RMA операции, пока в получателе не выполнится
обновляющая операция. Есть одно исключение из этого правила; а именно,
одно и тоже место можно обновить несколькими одновременными вызовами
accumulate
, результат будет таким же, как если бы эти обновления
произошли в некотором порядке. В дополнение к этому, окно не может одновременно
обновляться при помощи put
или accumulate
и операцией
локального store
, даже если эти два обновления обращаются
по разным адресам в окне. Последнее ограничение позволяет более
эффективно реализовать RMA операции на многих системах. Эти
ограничения описываются более детально в разделе 6.7.
Вызовы используют аргументы c общим типом данных для определения коммуникационных буферов в инициаторе и адресате. Таким образом, операция передачи может также собрать данные в источнике и разослать их в приемник. Однако, все аргументы, определяющие оба коммуникационных буфера, предоставляются инициатором.
Для всех трех вызовов, процесс адресат может быть инициатором; т.е., процесс может использовать RMA операции, чтобы перемещать данные в своей памяти.
Объяснение:
Выбор поддерживать ли ``авто-коммуникации'' является таким же, как и для
передачи сообщений. Он немного упрощает кодирование, и является очень
полезным при использовании операций accumulate
, позволяя атомарные
обновления локальных переменных. []