Message Passing Interface

Поделись знанием:
(перенаправлено с «OpenMPI»)
Перейти к: навигация, поиск

Message Passing Interface (MPI, интерфейс передачи сообщений) — программный интерфейс (API) для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан Уильямом Гроуппом, Эвином Ласком (англ.) и другими.

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

Стандартизацией MPI занимается MPI Forum. В стандарте MPI описан интерфейс передачи сообщений, который должен поддерживаться как на платформе, так и в приложениях пользователя. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков Фортран 77/90, Java, Си и Си++.

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





Стандарты MPI

Первая версия MPI разрабатывалась в 1993—1994 году, и MPI 1 вышла в 1994.

Большинство современных реализаций MPI поддерживают версию 1.1. Стандарт MPI версии 2.0 поддерживается большинством современных реализаций, однако некоторые функции могут быть реализованы не до конца.

В MPI 1.1 (опубликован 12 июня 1995 года, первая реализация появилась в 2002 году) поддерживаются следующие функции:

  • передача и получение сообщений между отдельными процессами;
  • коллективные взаимодействия процессов;
  • взаимодействия в группах процессов;
  • реализация топологий процессов;

В MPI 2.0 (опубликован 18 июля 1997 года) дополнительно поддерживаются следующие функции:

  • динамическое порождение процессов и управление процессами;
  • односторонние коммуникации (Get/Put);
  • параллельный ввод и вывод;
  • расширенные коллективные операции (процессы могут выполнять коллективные операции не только внутри одного коммуникатора, но и в рамках нескольких коммуникаторов).

Версия MPI 2.1 вышла в начале сентября 2008 года.

Версия MPI 2.2 вышла 4 сентября 2009 года.

Версия MPI 3.0 вышла 21 сентября 2012 года.

Функционирование интерфейса

Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:

  • отправитель — ранг (номер в группе) отправителя сообщения;
  • получатель — ранг получателя;
  • признак — может использоваться для разделения различных видов сообщений;
  • коммуникатор — код группы процессов.

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

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

Пример программы

Ниже приведён пример программы вычисления числа <math>\pi</math> на языке C с использованием MPI:

// Подключение необходимых заголовков
#include <stdio.h>
#include <math.h>
// Подключение заголовочного файла MPI
#include "mpi.h"
 
// Функция для промежуточных вычислений
double f(double a)
{
    return (4.0 / (1.0+ a*a));
}
 
// Главная функция программы
int main(int argc, char **argv)
{
    // Объявление переменных
    int done = 0, n, myid, numprocs, i;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime = 0.0, endwtime;
    int namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
 
    // Инициализация подсистемы MPI
    MPI_Init(&argc, &argv);
    // Получить размер коммуникатора MPI_COMM_WORLD
    // (общее число процессов в рамках задачи)
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    // Получить номер текущего процесса в рамках 
    // коммуникатора MPI_COMM_WORLD
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Get_processor_name(processor_name,&namelen);
 
    // Вывод номера потока в общем пуле
    fprintf(stdout, "Process %d of %d is on %s\n", myid,numprocs,processor_name);
    fflush(stdout);
 
    while(!done)
    {
        // количество интервалов
        if(myid==0)
        {
            fprintf(stdout, "Enter the number of intervals: (0 quits) ");
            fflush(stdout);
            if(scanf("%d",&n) != 1)
            {
                fprintf(stdout, "No number entered; quitting\n");
                n = 0;
            }
            startwtime = MPI_Wtime();
        }
        // Рассылка количества интервалов всем процессам (в том числе и себе)
        MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
        if(n==0)
            done = 1;
        else
        {
            h = 1.0 / (double) n;
            sum = 0.0;
            // Обсчитывание точки, закрепленной за процессом
            for(i = myid + 1 ; (i <= n) ; i += numprocs)
            {
                x = h * ((double)i - 0.5);
                sum += f(x);
            }
            mypi = h * sum;
 
            // Сброс результатов со всех процессов и сложение
            MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
 
            // Если это главный процесс, вывод полученного результата
            if(myid==0)
            {
                printf("PI is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
                endwtime = MPI_Wtime();
                printf("wall clock time =%f\n", endwtime-startwtime);
                fflush(stdout);
            }
        }
    }
 
    // Освобождение подсистемы MPI
    MPI_Finalize();
    return 0;
}

Реализации MPI

  • MPICH — одна из самых первых свободная реализация MPI, работает на UNIX-системах и Windows NT
  • [www.open-mpi.org/ Open MPI] — ещё одна свободная реализация MPI. Основана на более ранних проектах FT-MPI, LA-MPI, LAM/MPI и PACX-MPI. Поддерживаются различные коммуникационные системы (в том числе Myrinet).
  • [www.cswmpi.com/ WMPI] — реализация MPI для Windows
  • [www.mpi-softtech.com/mpi_pro.php MPI/PRO] for Windows NT — коммерческая реализация для Windows NT
  • [software.intel.com/en-us/intel-mpi-library/ Intel MPI] — коммерческая реализация для Windows / Linux
  • Microsoft MPI входит в состав Compute Cluster Pack SDK. Основан на MPICH2, но включает дополнительные средства управления заданиями. Поддерживается спецификация MPI-2.
  • [h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1238,00.html HP-MPI] — коммерческая реализация от HP
  • SGI [www.sgi.com/products/software/mpt/ MPT] — платная библиотека MPI от SGI
  • [mvapich.cse.ohio-state.edu/ Mvapich] — свободная реализация MPI для Infiniband
  • [www.sun.com/software/products/clustertools/index.xml Oracle HPC ClusterTools] — бесплатная реализация для Solaris SPARC/x86 и Linux на основе Open MPI
  • MPJ — MPI for Java
  • [www.mpj-express.org/ MPJ Express] — MPI на Java

Напишите отзыв о статье "Message Passing Interface"

Ссылки

  • [www.mpi-forum.org/ MPI Forum]  (англ.)
  • [www-unix.mcs.anl.gov/mpi/mpich/ MPICH]  (англ.)
  • [parallel.ru/tech/tech_dev/mpi.html MPI на parallel.ru]  (рус.)
  • [www.ccas.ru/mmes/educat/lab04k/01/basics.html MPI в Вычислительном центре им. А. А. Дородницына РАН]  (рус.)
  • [www.mpj-express.org/ MPJ Express (Java)]  (англ.)
  • [www.hpjava.org/papers/MPJ-CPE/cpempi/cpempi.html MPJ: MPI for Java]  (англ.)
  • [www.ccas.ru/mmes/educat/lab04k/ Курс лабораторных работ по MPI] (рус. koi8-R)
  • Оленев Н.Н. Основы параллельного программирования в системе MPI. М.: ВЦ РАН. 2005. 80 с. Web: www.ccas.ru/olenev/MPIbook1.pdf  (рус.)
  • Долматова А.И., Оленев Н.Н. Параллельные вычисления в моделировании региональной экономики: учебное пособие / А.И. Долматова, Н.Н. Оленев. – Киров: ПРИП ФГБОУ ВПО «ВятГУ», 2012. – 125 с. Web: www.ccas.ru/olenev/Dolmatova_OlenevPDF1.pdf  (рус.)

См. также

  • PETSc — библиотека параллельных программ для решения систем линейных алгебраических уравнений
  • OpenMP (англ. Open Multi-Processing) — технология мультипроцессорного (мультипотокового) программирования.
  • Модель акторов
  • mpC — [panda.ispras.ru/~mpc/index.html The mpC Parallel Programming Environment] (англ.)

Отрывок, характеризующий Message Passing Interface

– Да, это благополучно… хорошо благополучие! Мне нынче Варвара Ивановна порассказала, как войска наши отличаются. Уж точно можно чести приписать. Да и народ совсем взбунтовался, слушать перестают; девка моя и та грубить стала. Этак скоро и нас бить станут. По улицам ходить нельзя. А главное, нынче завтра французы будут, что ж нам ждать! Я об одном прошу, mon cousin, – сказала княжна, – прикажите свезти меня в Петербург: какая я ни есть, а я под бонапартовской властью жить не могу.
– Да полноте, ma cousine, откуда вы почерпаете ваши сведения? Напротив…
– Я вашему Наполеону не покорюсь. Другие как хотят… Ежели вы не хотите этого сделать…
– Да я сделаю, я сейчас прикажу.
Княжне, видимо, досадно было, что не на кого было сердиться. Она, что то шепча, присела на стул.
– Но вам это неправильно доносят, – сказал Пьер. – В городе все тихо, и опасности никакой нет. Вот я сейчас читал… – Пьер показал княжне афишки. – Граф пишет, что он жизнью отвечает, что неприятель не будет в Москве.
– Ах, этот ваш граф, – с злобой заговорила княжна, – это лицемер, злодей, который сам настроил народ бунтовать. Разве не он писал в этих дурацких афишах, что какой бы там ни был, тащи его за хохол на съезжую (и как глупо)! Кто возьмет, говорит, тому и честь и слава. Вот и долюбезничался. Варвара Ивановна говорила, что чуть не убил народ ее за то, что она по французски заговорила…
– Да ведь это так… Вы всё к сердцу очень принимаете, – сказал Пьер и стал раскладывать пасьянс.
Несмотря на то, что пасьянс сошелся, Пьер не поехал в армию, а остался в опустевшей Москве, все в той же тревоге, нерешимости, в страхе и вместе в радости ожидая чего то ужасного.
На другой день княжна к вечеру уехала, и к Пьеру приехал его главноуправляющий с известием, что требуемых им денег для обмундирования полка нельзя достать, ежели не продать одно имение. Главноуправляющий вообще представлял Пьеру, что все эти затеи полка должны были разорить его. Пьер с трудом скрывал улыбку, слушая слова управляющего.
– Ну, продайте, – говорил он. – Что ж делать, я не могу отказаться теперь!
Чем хуже было положение всяких дел, и в особенности его дел, тем Пьеру было приятнее, тем очевиднее было, что катастрофа, которой он ждал, приближается. Уже никого почти из знакомых Пьера не было в городе. Жюли уехала, княжна Марья уехала. Из близких знакомых одни Ростовы оставались; но к ним Пьер не ездил.
В этот день Пьер, для того чтобы развлечься, поехал в село Воронцово смотреть большой воздушный шар, который строился Леппихом для погибели врага, и пробный шар, который должен был быть пущен завтра. Шар этот был еще не готов; но, как узнал Пьер, он строился по желанию государя. Государь писал графу Растопчину об этом шаре следующее:
«Aussitot que Leppich sera pret, composez lui un equipage pour sa nacelle d'hommes surs et intelligents et depechez un courrier au general Koutousoff pour l'en prevenir. Je l'ai instruit de la chose.
Recommandez, je vous prie, a Leppich d'etre bien attentif sur l'endroit ou il descendra la premiere fois, pour ne pas se tromper et ne pas tomber dans les mains de l'ennemi. Il est indispensable qu'il combine ses mouvements avec le general en chef».
[Только что Леппих будет готов, составьте экипаж для его лодки из верных и умных людей и пошлите курьера к генералу Кутузову, чтобы предупредить его.
Я сообщил ему об этом. Внушите, пожалуйста, Леппиху, чтобы он обратил хорошенько внимание на то место, где он спустится в первый раз, чтобы не ошибиться и не попасть в руки врага. Необходимо, чтоб он соображал свои движения с движениями главнокомандующего.]
Возвращаясь домой из Воронцова и проезжая по Болотной площади, Пьер увидал толпу у Лобного места, остановился и слез с дрожек. Это была экзекуция французского повара, обвиненного в шпионстве. Экзекуция только что кончилась, и палач отвязывал от кобылы жалостно стонавшего толстого человека с рыжими бакенбардами, в синих чулках и зеленом камзоле. Другой преступник, худенький и бледный, стоял тут же. Оба, судя по лицам, были французы. С испуганно болезненным видом, подобным тому, который имел худой француз, Пьер протолкался сквозь толпу.
– Что это? Кто? За что? – спрашивал он. Но вниманье толпы – чиновников, мещан, купцов, мужиков, женщин в салопах и шубках – так было жадно сосредоточено на то, что происходило на Лобном месте, что никто не отвечал ему. Толстый человек поднялся, нахмурившись, пожал плечами и, очевидно, желая выразить твердость, стал, не глядя вокруг себя, надевать камзол; но вдруг губы его задрожали, и он заплакал, сам сердясь на себя, как плачут взрослые сангвинические люди. Толпа громко заговорила, как показалось Пьеру, – для того, чтобы заглушить в самой себе чувство жалости.
– Повар чей то княжеский…
– Что, мусью, видно, русский соус кисел французу пришелся… оскомину набил, – сказал сморщенный приказный, стоявший подле Пьера, в то время как француз заплакал. Приказный оглянулся вокруг себя, видимо, ожидая оценки своей шутки. Некоторые засмеялись, некоторые испуганно продолжали смотреть на палача, который раздевал другого.
Пьер засопел носом, сморщился и, быстро повернувшись, пошел назад к дрожкам, не переставая что то бормотать про себя в то время, как он шел и садился. В продолжение дороги он несколько раз вздрагивал и вскрикивал так громко, что кучер спрашивал его:
– Что прикажете?
– Куда ж ты едешь? – крикнул Пьер на кучера, выезжавшего на Лубянку.
– К главнокомандующему приказали, – отвечал кучер.
– Дурак! скотина! – закричал Пьер, что редко с ним случалось, ругая своего кучера. – Домой я велел; и скорее ступай, болван. Еще нынче надо выехать, – про себя проговорил Пьер.
Пьер при виде наказанного француза и толпы, окружавшей Лобное место, так окончательно решил, что не может долее оставаться в Москве и едет нынче же в армию, что ему казалось, что он или сказал об этом кучеру, или что кучер сам должен был знать это.
Приехав домой, Пьер отдал приказание своему все знающему, все умеющему, известному всей Москве кучеру Евстафьевичу о том, что он в ночь едет в Можайск к войску и чтобы туда были высланы его верховые лошади. Все это не могло быть сделано в тот же день, и потому, по представлению Евстафьевича, Пьер должен был отложить свой отъезд до другого дня, с тем чтобы дать время подставам выехать на дорогу.
24 го числа прояснело после дурной погоды, и в этот день после обеда Пьер выехал из Москвы. Ночью, переменя лошадей в Перхушкове, Пьер узнал, что в этот вечер было большое сражение. Рассказывали, что здесь, в Перхушкове, земля дрожала от выстрелов. На вопросы Пьера о том, кто победил, никто не мог дать ему ответа. (Это было сражение 24 го числа при Шевардине.) На рассвете Пьер подъезжал к Можайску.
Все дома Можайска были заняты постоем войск, и на постоялом дворе, на котором Пьера встретили его берейтор и кучер, в горницах не было места: все было полно офицерами.
В Можайске и за Можайском везде стояли и шли войска. Казаки, пешие, конные солдаты, фуры, ящики, пушки виднелись со всех сторон. Пьер торопился скорее ехать вперед, и чем дальше он отъезжал от Москвы и чем глубже погружался в это море войск, тем больше им овладевала тревога беспокойства и не испытанное еще им новое радостное чувство. Это было чувство, подобное тому, которое он испытывал и в Слободском дворце во время приезда государя, – чувство необходимости предпринять что то и пожертвовать чем то. Он испытывал теперь приятное чувство сознания того, что все то, что составляет счастье людей, удобства жизни, богатство, даже самая жизнь, есть вздор, который приятно откинуть в сравнении с чем то… С чем, Пьер не мог себе дать отчета, да и ее старался уяснить себе, для кого и для чего он находит особенную прелесть пожертвовать всем. Его не занимало то, для чего он хочет жертвовать, но самое жертвование составляло для него новое радостное чувство.