Односторонние обмены
Взаимодействие между группами процессов
MPI-2 допускает организацию обмена сообщениями между группами процессов, которые запущены независимо друг от друга. Это позволяет, например, "подключиться" к параллельной программе приложению, выполняющему обработку данных. Данная возможность полезна при создании клиент-серверных приложений и в других ситуациях.
Основные механизмы взаимодействия:
- связь по имени;
- связь через порт.
Программная реализация взаимодействия - в функциях:
- MPI_Open_port
- MPI_Close_port
- MPI_Comm_accept
- MPI_Publish_name
- MPI_Unpublish_name
- MPI_Lookup_name и других подпрограммах.
Односторонние обмены основаны на механизме удалённого доступа к памяти ( RMA -Remote Memory Access ) и позволяют процессу, инициировавшему обмен, самостоятельно задать параметры обмена как для источника, так и для адресата сообщения.
Односторонние обмены используются в том случае, когда процесс "знает", какие данные другого процесса он должен модифицировать, а процесс-адресат сообщения этого не знает.
Стандартная схема обмена сообщениями в этом случае требует согласования действий отправителя и получателя сообщения, для чего могут потребоваться дополнительные затраты времени (например, на пересылку параметров обмена). При этом объединены функции коммуникации и синхронизации.
В односторонних обменах эти функции разделены.
Односторонний обмен возможен, если процесс создаёт "окно", доступное всем остальным процессам (рис. 3.13).
Окно создаётся (коллективным) вызовом подпрограммы MPI_Win_create.
Создание окна
int MPI_Win_create(void *base, MPI_Aint size, int disp_unit,
MPI_Info info, MPI_Comm comm, MPI_Win *win)
MPI_Win_create(base, size, disp unit, info, comm, win, ierror)
Входные параметры:
- base - адрес окна;
- size - размер окна в байтах;
- disp_unit - масштабный множитель для вычисления смещений;
- info - информационный параметр;
- comm - коммуникатор.
Выходной параметр - win - окно.
Рис. 3.13. Окно одностороннего обмена
Аннулировать окно можно вызовом подпрограммы:
int MPI_Win_free(MPI_Win *win) MPI_Win_free(win, ierror)
Три операции одностороннего обмена являются неблокирующими операциями:
- MPI_Put - передача данных от отправителя в окно;
- MPI_Get - передача данных из окна отправителю;
- MPI_Accumulate - обновление окна получателя.
Операция Put
int MPI_Put(void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
int target_rank, MPI_Aint target_disp, int target_count,
MPI_Datatype target_datatype, MPI_Win win)
MPI_Put(origin_addr, origin_count, origin_datatype, target_rank,
target_disp, target_count, target_datatype, win, ierror)
Входные параметры:
- origin_addr - адрес буфера отправки сообщения;
- origin_count - количество элементов в буфере отправки;
- origin_datatype - тип передаваемых данных;
- target_rank - ранг адресата;
- target_disp - смещение от начала окна приёма до буфера приёма;
- target_count - количество принимаемых данных;
- target_datatype - тип принимаемых данных;
- win - окно приёма.
При выполнении этой операции данные размещаются в буфере приёма по адресу
адрес_окна + смещение х disp_unit
При вызове подпрограммы MPI_Get данные копируются в обратном направлении - из памяти адресата в память "источника".