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

MPI Logo MPI расшифровывается как "Message passing interface" ("Интерфейс передачи сообщений"). MPI - это стандарт на программный инструментарий для обеспечения связи между отдельными процессами параллельной задачи. MPI предоставляет программисту единый механизм взаимодействия процессов внутри параллельно исполняемой задачи независимо от машинной архитектуры (однопроцессорные, многопроцессорные с общей или раздельной памятью), взаимного расположения процессов (на одном физическом процессоре или на разных) и API операционной системы. Программа, использующая MPI, легко отлаживается и переносится на другие платформы, часто для этого достаточно простой перекомпиляции исходного текста программы.

Решение использовать в своих задачах MPI следует осторожно, после тщательного взвешивания своих сил и возможностей как программиста. Несмотря на то, что MPI представляет собой значительный шаг вперед по сравнению с предшествующим поколением библиотек передачи сообщений, а, возможно и вследствие этого, программировать на MPI достаточно сложно. Причиной тому явялется не недостаток стандарта, а в самой идеологии передачи сообщений. MPI можно рассматривать как уровень ассемблера для параллельных программ. Вы любите програмировать на ассемблере?

Основное отличие стандарта MPI от его предшественников (p4, PVM) - понятие коммуникатора. Все операции синхронизации и передачи сообщений локализуются внутри коммуникатора. С коммуникатором связывается группа процессов. В частности, все коллективные операции вызываются одновременно на всех процессах, входящих в эту группу. Поскольку взаимодействие между процессами инкапсулируется внутри коммуникатора, на базе MPI можно создавать библиотеки параллельных программ.

В настоящее время разными коллективами разработчиков написано несколько программных пакетов, удовлетворяющих спецификации MPI, в частности: MPICH, LAM, HPVM, OpenMPI и так далее. В двух словах охарактеризуем наиболее распространенные из этих пакетов. Если говорить о LAM, то основное достоинство этого пакета - богатые отладочные возможности. Трассировка обращений к MPI и анализ состояния параллельной программы после аварийного завершения делают процесс отладки менее тяжелым и более продуктивным. С другой стороны, пакет MPICH более мобилен, следуя простым инструкциям можно перенести MPI на новую платформу (например с Linux на Windows или наоборот). Для этого потребуется необходимо написать лишь несколько драйверов нижнего уровня. Установка библиотеки MPICH проходит несколько труднее, чем установка LAM MPI, поскольку приходится задавать гораздо большее число параметров, причем назначение некоторых из них известно только разработчикам. Если же говорить об эффективности, то есть мнение, что MPICH несколько эффективнее передает сообщения. Спорить с этим не буду, но мне лично убедиться в этом не привелось. Что касается отладки, то отлаживать программы в среде MPICH труднее.

MPI - это хорошо стандартизованный механизм для построения программ по модели обмена сообщениями. Существуют стандартные "привязки" MPI к языкам С/С++, Fortran 77/90. Имеются и бесплатные и коммерческие реализации почти для всех суперкомпьютерных платформ, а также для High Performance кластерных систем, построенных на узлах с ОС Unix, Linux и Windows. В настоящее время MPI - наиболее широко используемый и динамично развивающийся интерфейс из своего класса. За стандартизацию MPI отвечает MPI Forum (http://www.mpi-forum.org). В новой версии стандарта 2.0 описано большое число новых интересных механизмов и процедур для организации функционирования параллельных программ: динамическое управление процессами, односторонние коммуникации (Put/Get), параллельные I/O. Но к сожалению, пока нет полных готовых реализаций этой версии стандарта, хотя часть из нововведений уже активно используется.

Основные понятия MPI. Парадигма SPMD

При запуске задачи создается группа из P процессов. Группа идентифицируется целочисленным дескриптором (коммуникатором). Внутри группы процессы нумеруются от 0 до P-1. В ходе решения задачи исходная группа (ей присвоено имя MPI_COMM_WORLD) может делиться на подгруппы, подгруппы могут объединяться в новую группу, имеющую свой коммуникатор. Таким образом, процесс имеет возможность одновременно принадлежать нескольким группам процессов. Каждому процессу доступен свой номер myProc внутри любой группы, членом которой он является.

Поведение всех процессов описывается одной и той же программой. Межпроцессные коммуникации в ней программируются явно с использованием библиотеки MPI, которая и диктует стандарт программирования. Квазиодновременный запуск исходной группы процессов производится средствами операционной системы. При этом P определяется желанием пользователя, а отнюдь не количеством доступных процессоров!

Итак, все P процессов асинхронно выполняют одну и ту же программу. Но у каждого из них свой номер myProc. Поэтому в программе, естественно, будут такие фрагменты:


     if (myProc.eq.0) then
         < делать что-то одно >
     else if (myProc.eq.1) then
         < делать что-то другое >
               .  .  .  
     else
         < делать что-то P-e >
     endif

Таким образом, в программе "под одной крышей" закодировано поведение всех процессов. В этом и заключена парадигма программирования Single Program - Multiple Data (SPMD).

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


Copyright © 1998-2011 Юрий Сбитнев