Вы здесь

MPI для начинающих

Учебное пособие + примеры.
Автор: Илья Евсеев.
Контора: ИВВиБД ( ЦСТ ).

 


Оглавление

 


Краткие характеристики.

MPI - это программный инструментарий для обеспечения связи между ветвями параллельного приложения.

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

MPI предоставляет программисту единый механизм взаимодействия ветвей внутри параллельного приложения независимо от машинной архитектуры (однопроцессорные / многопроцессорные с общей/раздельной памятью), взаимного расположения ветвей (на одном процессоре / на разных) и API операционной системы.
( API = "applications programmers interface" = "интерфейс разработчика приложений" )

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

Минимально в состав MPI входят: библиотека программирования (заголовочные и библиотечные файлы для языков Си, Си++ и Фортран) и загрузчик приложений.

Дополнительно включаются: профилирующий вариант библиотеки (используется на стадии тестирования параллельного приложения для определения оптимальности распараллеливания); загрузчик с графическим и сетевым интерфейсом для X-Windows и проч.

Структура каталогов MPI привычна глазу: bin, include, lib, man, src, ... Минимальный набор функций прост в освоении и позволяет быстро написать надежно работающую программу. Использование же всей мощи MPI позволит получить БЫСТРО работающую программу - при сохранении надежности.


MPI становится стандартом.

Несколько вычислительнх устройств (процессоров), по нынешней терминологии, могут быть объединены одним из трех способов:

  1. через общую память. В Юниксе существуют средства для работы с ней (разные для BSD- и ATT-клонов Юникса);
  2. через скоростную внутримашинную сеть на ЭВМ с аппаратной архитектурой MPI. Здесь стандарта нет ;
  3. через сеть, как правило, работающую по протоколу TCP/IP.

Программный инструментарий MPI разрабатывался как долгожданный стандарт для машин с одноименной аппаратной архитектурой. Задачей-максимум было "подмять" под него и стандарты из соседних пунктов: MPI может работать на базе любого из трех способов соединений. Тем не менее, первая редакция MPI стандартом не стала в силу следующего ограничения: все процессы, сообщающиеся между собой посредством функций MPI, начинают и заканчивают свое выполнение ОДНОВРЕМЕННО. Это не мешает использовать MPI как скелет для параллельных приложений, но системы массового обслуживания (клиент-серверные приложения и проч.) приходится разрабатывать на базе старого инструментария.

Проблема устранена в MPI-II: он гарантировано станет стандартом в категории 2. Не исключено, что и стандарты категорий 1 и 3 со временем потеряют интерес для программиста и будут использоваться только как интерфейс между "железом" и MPI-II.


Сравнение с низкоуровневыми пересылками.

Часто приходится слышать утверждение, что низкоуровневые пересылки через разделяемую память и семафоры предпочтительнее применения таких библиотек как MPI, потому что работают быстрее. Против такой точки зрения существует 4 очень веских довода:

  1. В хорошо распараллеленном приложении на собственно взаимодействие между ветвями (пересылки данных и синхронизацию) тратится небольшая доля времени - несколько процентов от общего времени работы. Таким образом, замедление пересылок, допустим, в два раза не означает общего падения производительности вдвое - она понизится на несколько процентов. Зачастую такое понижение производительности является приемлемым и с лихвой оправдывается прочими соображениями ;

     

  2. MPI - это изначально БЫСТРЫЙ инструмент. Для повышения скорости в нем используются приемы, о которых прикладные программисты зачастую просто не задумываются. Например:
    • встроенная буферизация позволяет избежать задержек при отправке данных - управление в передающую ветвь возвращается немедленно, даже если ветвь-получатель еще не подготовилась к приему ;
    • MPI использует многопоточность (multi-threading), вынося большую часть своей работы в потоки (threads) с низким приоритетом. Буферизация и многопоточность сводят к минимуму негативное влияние неизбежных простоев при пересылках на производительность прикладной программы ;
    • на передачу данных типа "один-всем" затрачивается время, пропорциональное не числу участвующих ветвей , а логарифму этого числа
    • и так далее...

    И все-все скурпулезно отлажено и протестировано!

     

  3. Перенос - отныне не требует переписывания и повторной отладки. Незаменимое качество для программы, которой предстоит пользоваться широкому кругу людей. Следует учитывать и то обстоятельство, что УЖЕ появляются машины, на которых из средств межпрограммного взаимодействия есть только MPI - и ничего более.

     

  4. ОТЛАДКА - ей посвящена оставшаяся часть раздела.

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

Функции работы с разделяемой памятью и с семафорами слишком атомарны, примитивны. Вероятность без ошибки реализовать с их помощью нужное программе действие стремительно уменьшается с ростом количества инструкций ; вероятность найти ошибку путем отладки близка к нулю, потому что отладочное средство привносит задержку в выполнение одних ветвей, и тем самым позволяет нормально работать другим (ветви перестают конкурировать за совместно используемые данные).


Сравнение с PVM.

PVM - это изначально исследовательский проект. Его несомненными достоинствами являются простота использования ( в теории ) и почтенный возраст - он появился на свет в 1989 году, и, таким образом, на 6 лет старше MPI.

Надо признать, по сравнению с PVM, MPI - это СЛОЖНЫЙ пакет. То, что в PVM реализовано одним-единственным способом, в MPI может быть сделано несколькими, про которые говорится: способ А прост в использовании, но не очень эффективен; способ Б сложнее, но эффективнее; а способ В сложнее и эффективнее при определенных условиях. Изложение в доступных через Интернет учебниках расчитано на профессиональных программистов, а не на прикладников, потому что упорядочено по областям применения (способы А, Б и В в одной главе), а не по уровням сложности (способ А в первой главе, способ Б в следующей, способ В и вовсе вынесен в приложения).

Ergo, главным недостатком MPI является
отсутствие ПРАВИЛЬНО упорядоченного описания
для непрофессионалов.

Судите сами, насколько это утверждение применимо к пособию, которое сейчас перед Вами.

 


Документация.

Практика показывает, что на период работы с той или иной библиотекой полезно бывает распечатать и держать под рукой ее заголовочные файлы из подкаталога include. В Convex MPI такой файл один: mpi.h, в WinMPICH их три: mpi.h (описания констант и типов), mpi_errno.h (коды ошибок и их описания) и <