Удаленный доступ к памяти (RMA) расширяет механизмы взаимодействий
MPI, позволяя одному процессу определить все коммуникационные
параметры как для посылающей стороны, так и для получающей. Этот режим
связи облегчает кодирование некоторых приложений с динамически
изменяющимися шаблонами доступа к данным, в том случае, если распределение
данных фиксировано или изменяется медленно. В этом случае каждый
процесс может вычислить, к каким данным других процессов ему потребуется
обратиться или какие данные модифицировать. В то же время, процессы могут
не знать, к каким данным в их собственной памяти потребуется обратиться
удаленным (remote) процессам или что им потребуется модифицировать, мало
того, они могут даже не знать, что это за процессы. Таким образом,
параметры передачи оказываются доступными полностью только на одной
стороне. Обыкновенные взаимодействия типа посылка/прием требуют взаимно
согласованных действий отправителя и принимающего. Чтобы выполнить
взаимно согласованные действия, приложение должно распространить параметры
передачи. Для этого может потребоваться, чтобы все процессы приняли
участие в глобальных вычислениях, требующих высоких временных затрат, либо
периодически выполняли поллинг потенциальных коммуникационных запросов для
того, чтобы соответствующим образом их принять и выполнить. Использование
коммуникационных механизмов RMA предотвращает потребность в
глобальных вычислениях или явном поллинге. Характерным общим примером
этого является выполнение присваивания в форме A=B(map)
, где
map
- перестановочный вектор, при этом A
, B
и
map
распределены одинаковым образом.
Во время MPI взаимодействия происходят два действия: передача данных от
отправителя к получателю, а также их синхронизация. Функции RMA
спроектированы таким образом, что эти две функции разделяются.
Предоставляется три коммуникационных вызова: MPI_PUT
(дистанционная
запись), MPI_GET
(дистанционное чтение) и MPI_ACCUMULATE
(дистанционная модификация). Предоставляется большее число
синхронизационных вызовов, которые поддерживают различные стили
синхронизации. Дизайн этих функций похож на те, которые имеют место для
слабокогерентных систем памяти: правильное упорядочение доступа к памяти
является обязанностью пользователя, использующего для этого
синхронизационные вызовы; для эффективности при реализации можно задержать
коммуникационные операции до синхронизационных вызовов.
Дизайн функций дистанционного доступа к памяти (RMA) позволяет
разработчикам в многих случаях воспользоваться преимуществом быстрых
механизмов связи, обеспечиваемых различными платформами, типа когерентной
или некогерентной разделяемой памяти, средств прямого доступа в память,
аппаратно поддерживаемых операций put/get
, коммуникационных
сопроцессоров, и т.д.
Наиболее часто используемые коммуникационные механизмы RMA можно поместить поверх передачи сообщений. Однако, для некоторых функций RMA требуется поддержка асинхронных агентов связи (обработчики, треды, и т.д.) в среде распределенной памяти.
Мы будем называть инициатором процесс, который выполняет вызов и
адресатом процесс, к памяти которого выполняется обращение. Таким
образом, для операции put
источник=инициатор
(source=origin
) и место_назначения=адресат
(destination=target
); а для операции get
справедливо источник=адресат
(source=target
) и
место_назначения=инициатор
(destination=origin
).