MPI - Message-Passing Interface
(Message Passing Interface Forum, May 5, 1994
http://www.mpi-forum.org)
(1) Цели:
·
Создать интерфейс прикладного программирования (не только для компиляторов или библиотек реализации систем);
· Обеспечить возможность эффективных коммуникаций (избежать копирования из памяти в память, позволить совмещение вычислений и коммуникаций или разгрузку на коммуникационный процессор там, где он есть);
· Разрешить расширения для использования в гетерогенной среде;
· Исходить из надежности коммуникаций (пользователь не должен бороться с коммуникационными сбоями - это дело коммуникационных подсистем нижнего уровня);
· Определить интерфейс, который бы не слишком отличался от используемых в настоящее время, таких как PVM, Express, P4, и пр.;
· Определить интерфейс, который мог бы быстро быть реализован на многих продаваемых платформах без серьезной переделки нижележащего коммуникационного и системного ПО.
**************************************************************
(2) Что включено в MPI ?
· Коммуникации точка-точка;
· Коллективные операции;
· Группы процессов;
· Коммуникационные контексты;
· Простой способ создания процессов для модели SPMD (одна программа используется для обработки разных данных на разных процессорах);
· Топология процессов.
**************************************************************
(3) Что не включено в MPI ?
· Явные операции с разделяемой памятью и явная поддержка нитей (процессов с общей памятью);
· Операции, которые требуют больше поддержки от операционных систем, чем действующие в настоящее время стандарты на ОС (например, получение сообщений через механизм прерываний, активные сообщения);
· Вспомогательные функции, такие как таймеры.
**************************************************************
(4) Некоторые понятия.
Коммуникационные операции могут быть:
неблокирущие - если возврат осуществляется до завершения операции;
блокируюшие - если возврат означает, что пользователь может использовать ресурсы (например, буфера), указанные в вызове;
Операция называется
локальной, если ее выполнение не требует коммуникаций;
нелокальной, если ее выполнение может требовать коммуникаций;
коллективной, если в ее выполнении должны участвовать все процессы группы.
(5) Группы, контексты, коммуникаторы.
Группа - упорядоченное (от 0 до ранга группы) множество идентификаторов процессов (т.е. процессов). Группы служат для указания адресата при посылке сообщений (процесс-адресат специфицируется своим номером в группе), определяют исполнителей коллективных операций.
Являются мощным средством функционального распараллеливания - позволяют разделить группу процессов на несколько подгрупп, каждая из которых должна выполнять свою параллельную процедуру. При этом существенно упрощается проблема адресации при использовании параллельных процедур.
Контекст - область «видимости» для сообщений, аналогичное области видимости переменных в случае вложенных вызовов процедур. Сообщения, посланные в некотором контексте, могут быть приняты только в этом же контексте. Контексты - также важные средства поддержки параллельных процедур.
Коммуникаторы - позволяют ограничить область видимости (жизни, определения) сообщений рамками некоторой группы процессов, т.е. могут рассматриваться как пара - группа и контекст. Кроме того, они служат и для целей оптимизации, храня необходимые для этого дополнительные объекты.
Имеются предопределенные коммуникаторы (точнее, создаваемые при инициализации MPI-системы):
· MPI_COMM_ALL - все процессы
· MPI_COMM_PEER - все, кроме главного процесса.
**************************************************************
(6) Операции над группами (локальные, без обмена сообщениями).
Для поддержки пользовательских серверов имеется коллективная операция разбиения группы на подгруппы по ключам, которые указывает каждый процесс группы.
Для поддержки связывания с серверами, имеются средства построения коммуникатора по некоторому имени, известному и серверу и клиентам.
(7) Точечные коммуникации.
Основные операции - send, receive
Операции могут быть
блокирующими и
неблокирующими.
В операции send задается:
· адрес буфера в памяти;
· количество посылаемых элементов;
· тип данных каждого элемента;
· номер процесса-адресата в его группе;
· тег сообщения;
· коммуникатор.
(последние 3 параметра - аналоги «почтового конверта»)
В операции receive задается:
· адрес буфера в памяти;
· количество посылаемых элементов;
· тип данных каждого элемента;
· номер процесса-адресата в его группе (либо «любой»);
· тег сообщения (либо «любой»);
· коммуникатор;
· статус (источник и тег, необходимые в том случае, когда они неизвестны - при их задании с помощью шаблона «любой»).
Предусмотрена конвертация данных при работе в гетерогенной среде.
Имеется четыре режима коммуникаций - стандартный, буферизуемый, синхронный и режим готовности.
В стандартном режиме последовательность выдачи операций send и receive произвольна, операция send завершается тогда, когда сообщение изъято из памяти и она уже может использоваться процессом. При этом выполнение операции может осуществляться независимо от наличия receive, либо требовать наличие (вопрос реализации MPI). Поэтому операция считается нелокальной.
В буферизуемом режиме последовательность выдачи операций send и receive произвольна, операция send завершается тогда, когда сообщение изъято из памяти и помещено в буфер. Если места в буфере нет - ошибка программы (но есть возможность определить свой буфер). Операция локальная.
В синхронном режиме последовательность выдачи операций произвольна, но операция send завершается только после выдачи и начала выполнения операции receive. Операция нелокальная.
В режиме готовности операция send может быть выдана только после выдачи соответствующей операции receive, иначе программа считается ошибочной и результат ее работы неопределен. Операция локальная.
Во всех четырех режимах операция receive завершается после получения сообщения в заданный пользователем буфер приема.
Неблокирующие операции не приостанавливают процесс до своего завершения, а возвращают ссылку на коммуникационный объект, позволяющий опрашивать состояние операции или дожидаться ее окончания.
Имеются операции проверки поступающих процессу сообщений, без чтения их в буфер (например, для определения длины сообщения и запроса затем памяти под него).
Имеется возможность аварийно завершать выданные неблокирующие операции, и поэтому предоставлены возможности проверки, хорошо ли завершились операции.
Имеется составная операция send-receive, позволяющая избежать трудностей с порядком выдачи отдельных операций в обменивающихся между собой процессах. Для частного случая обмена данными одного типа и длины предлагается специальная операция (send-receive-replace), в которой для посылки и приема сообщения используется один буфер.
Содержание раздела