next up previous contents
Next: Put Up: Односторонние взаимодействия Previous: Атрибуты окна   Contents


Коммуникационные вызовы

MPI поддерживает три коммуникационных RMA вызова: MPI_PUT передает данные из памяти инициатора в память адресата; MPI_GET передает данные из памяти адресата в память инициатора; и MPI_ACCUMULATE обновляет адреса в памяти адресата, например, добавляя к ним значения, посланные из памяти инициатора. Эти операции являются неблокирующими: т.е. вызов инициирует передачу, но передача может продолжаться после возврата из вызова. Выполнение передачи завершается, как в инициаторе, так и в адресате, когда инициатором выдан последующий синхронизационный вызов к участвующему оконному объекту. Эти синхронизационные вызовы описаны в разделе 6.4.

Локальный коммуникационный буфер RMA вызова не должен обновлятся, и к локальному коммуникационному буферу вызова get не должны обращаться после RMA вызова до тех пор, пока не выполнится следующий за ним синхронизационный вызов.

Объяснение: Вышеуказанное правило является более мягким, чем в случае передачи сообщений, где мы не позволяем одновременно выполняться двум вызовам send с перекрывающимися буферами. Здесь же мы позволяем одновременно выполняться двум вызовам put с перекрывающимися буферами. Причины для этого послабления таковы

  1. Пользователям не нравится ограничение, которое не слишком естественно (оно запрещает конкурентное чтение).
  2. Ослабление правила, насколько мы знаем, не устраняет возможность эффективной реализации.
  3. Ослабление правила важно для выполнения RMA: мы хотим связать один синхронизационный вызов со столькими RMA операциями, со сколькими это будет возможно. Если вызовы put из перекрывающихся буферов не могут быть параллельными, тогда мы должны добавлять в код ненужные синхронизационные точки.
[]

Является ошибочным создавать параллельные конфликтующие обращения к одному участку памяти в окне; если позиция обновляется операцией put или accumulate, тогда к этому месту нельзя обратиться при помощи load или другой RMA операции, пока в получателе не выполнится обновляющая операция. Есть одно исключение из этого правила; а именно, одно и тоже место можно обновить несколькими одновременными вызовами accumulate, результат будет таким же, как если бы эти обновления произошли в некотором порядке. В дополнение к этому, окно не может одновременно обновляться при помощи put или accumulate и операцией локального store, даже если эти два обновления обращаются по разным адресам в окне. Последнее ограничение позволяет более эффективно реализовать RMA операции на многих системах. Эти ограничения описываются более детально в разделе 6.7.

Вызовы используют аргументы c общим типом данных для определения коммуникационных буферов в инициаторе и адресате. Таким образом, операция передачи может также собрать данные в источнике и разослать их в приемник. Однако, все аргументы, определяющие оба коммуникационных буфера, предоставляются инициатором.

Для всех трех вызовов, процесс адресат может быть инициатором; т.е., процесс может использовать RMA операции, чтобы перемещать данные в своей памяти.

Объяснение: Выбор поддерживать ли ``авто-коммуникации'' является таким же, как и для передачи сообщений. Он немного упрощает кодирование, и является очень полезным при использовании операций accumulate, позволяя атомарные обновления локальных переменных. []



Subsections

Alex Otwagin 2002-12-10