Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 530 / 93 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 3:

Интерфейс передачи сообщений MPI

Односторонние обмены

Односторонние обмены основаны на механизме удалённого доступа к памяти ( 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)

Три операции одностороннего обмена являются неблокирующими операциями:

  1. MPI_Put - передача данных от отправителя в окно;
  2. MPI_Get - передача данных из окна отправителю;
  3. 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 данные копируются в обратном направлении - из памяти адресата в память "источника".

Коллективные операции

В MPI-2 расширены возможности коллективных обменов сообщениями.

Расширения заключаются в обобщении некоторых операций коллективного обмена на интеркоммуникаторы, введении дополнительных конструкторов интеркоммуникаторов, введении двух новых операций обмена - обобщённой операции "all-to-all" и операции исключающего сканирования. Есть и другие расширения.

Подпрограмма MPI_Comm_create может использоваться для создания интеркоммуникаторов.

Внешние интерфейсы

Механизм внешних интерфейсов позволяет программисту добавить новую функциональность поверх базовой функциональности MPI.

Обобщённые запросы дают возможность определить новые неблокирующие операции.

При использовании стандартных запросов операции, связанные с ними, выполняются средой исполнения MPI и приложение на этот процесс не влияет.

При использовании обобщённых запросов "ответственность" за выполнение операции берёт на себя приложение. Оно сообщает MPI о завершении операции.

Операции с обобщёнными запросами:

  • MPI_Grequest_start
  • MPI_Grequest_complete

и некоторые другие.

Другие возможности MPI-2

Среди других возможностей MPI-2:

  • Операции декодирования производных типов.
  • Ассоциирование пользовательской информации с полями структуры status.
  • Присвоение имён объектам MPI (например, коммуникаторам, окнам и др.).
  • Многопоточность ( MPI_Init_thread, MPI_Thread_single, MPI_Thread_multiple и др.).
  • Новые операции кеширования атрибутов.
  • Параллельные операции ввода-вывода ( MPI_File_open, MPI_File_close, MPI_File_read, MPI_File_write и др.).