Message Passing Interface: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Реализации MPI: Магазин не имеет отношение к MPI
 
(не показано 39 промежуточных версий 30 участников)
Строка 1: Строка 1:
{{Ложное перенаправление|OpenMPI}}
'''Message Passing Interface''' (MPI, интерфейс передачи сообщений) — программный интерфейс ([[API]]) для передачи [[информация|информации]], который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан [[Гроупп, Уильям|Уильямом Гроуппом]], {{Translation|:en:Ewing Lusk|Ласк, Эвин|Эвином Ласком}} и другими.
'''Message Passing Interface''' (MPI, интерфейс передачи сообщений) — программный интерфейс ([[API]]) для передачи [[информация|информации]], который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан [[Гроупп, Уильям|Уильямом Гроуппом]], {{нп1|Ласк, Эвин|Эвином Ласком|en|Ewing Lusk}} и другими.


MPI является наиболее распространённым стандартом интерфейса обмена данными в
MPI является наиболее распространённым стандартом интерфейса обмена данными в
[[Параллельное программирование|параллельном программировании]], существуют его реализации для большого числа компьютерных платформ. Используется при разработке программ для [[Кластер (группа компьютеров)|кластеров]] и [[суперкомпьютер]]ов.
[[Параллельное программирование|параллельном программировании]], существуют его реализации для большого числа компьютерных платформ. Используется при разработке программ для [[Кластер (группа компьютеров)|кластеров]] и [[суперкомпьютер]]ов. Основным средством коммуникации между [[процесс (информатика)|процессами]] в MPI является передача сообщений друг другу.
Основным средством коммуникации между [[процесс (информатика)|процессами]] в MPI является передача сообщений друг другу.
Стандартизацией MPI занимается MPI Forum. В стандарте MPI описан интерфейс передачи сообщений, который должен поддерживаться как на платформе, так и в [[Прикладное программное обеспечение|приложениях]] пользователя. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков [[Фортран]] 77/90, [[Си (язык программирования)|Си]] и [[Си плюс плюс|Си++]].


Стандартизацией MPI занимается [[MPI Forum]]. В стандарте MPI описан интерфейс передачи сообщений, который должен поддерживаться как на платформе, так и в [[Прикладное программное обеспечение|приложениях]] пользователя. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков [[Фортран]] 77/90, [[Java]], [[Си (язык программирования)|Си]] и [[C++]].
В первую очередь MPI ориентирован на системы с [[Массивно-параллельная архитектура|распределенной памятью]], то есть когда затраты на передачу данных велики, в то время как [[OpenMP]] ориентирован на системы с общей памятью (многоядерные с общим кэшем). Обе технологии могут использоваться совместно, дабы оптимально использовать в кластере многоядерные системы.

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


== Стандарты MPI ==
== Стандарты MPI ==
Строка 27: Строка 28:
Версия MPI 2.1 вышла в начале сентября 2008 года.
Версия MPI 2.1 вышла в начале сентября 2008 года.


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


Версия MPI 3.0 вышла 21 сентября 2012 года.
Ниже приведён пример программы на '''C''' с использованием '''MPI''':

== Функционирование интерфейса ==
Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:
* отправитель — ранг (номер в группе) отправителя сообщения;
* получатель — ранг получателя;
* признак — может использоваться для разделения различных видов сообщений;
* коммуникатор — код группы процессов.
Операции приёма и передачи могут быть блокирующимися и неблокирующимися. Для неблокирующихся операций определены функции проверки готовности и ожидания выполнения операции.

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

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


<source lang="C">
<source lang="C">
Строка 105: Строка 119:
if(myid==0)
if(myid==0)
{
{
printf("PI is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
printf("PI is approximately %.16lf, Error is %.16lf\n", pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
printf("wall clock time =%lf\n", endwtime-startwtime);
fflush(stdout);
fflush(stdout);
}
}
Строка 120: Строка 134:


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

== См. также ==
* [[Исчисление взаимодействующих систем]]
* [[Charm++]]
* [[Global Arrays]]
* [[X10 (язык программирования)]]


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


== См. также ==
== См. также ==
Строка 148: Строка 170:
* [[mpC]] — [http://panda.ispras.ru/~mpc/index.html The mpC Parallel Programming Environment]{{ref-en}}
* [[mpC]] — [http://panda.ispras.ru/~mpc/index.html The mpC Parallel Programming Environment]{{ref-en}}


{{soft-stub}}
{{ПО для распределенных вычислений}}
{{ПО для распределенных вычислений}}


[[Категория:Параллельные вычисления]]
[[Категория:Параллельные вычисления]]
[[Категория:Компьютерные сети]]
[[Категория:Кластерные системы]]
[[Категория:Библиотеки параллельного программирования]]
[[Категория:Библиотеки параллельного программирования]]
[[Категория:Сетевое программное обеспечение]]

[[ar:واجهة تمرير الرسائل]]
[[cs:Message Passing Interface]]
[[de:Message Passing Interface]]
[[en:Message Passing Interface]]
[[es:Interfaz de Paso de Mensajes]]
[[fr:Message Passing Interface]]
[[it:Message Passing Interface]]
[[ja:Message Passing Interface]]
[[ko:메시지 전달 인터페이스]]
[[lt:Message Passing Interface]]
[[pl:Message Passing Interface]]
[[pt:Message Passing Interface]]
[[sk:Message Passing Interface]]
[[tr:MPI]]
[[uk:Message Passing Interface]]
[[vi:MPI]]
[[zh:訊息傳遞介面]]

Текущая версия от 15:53, 14 апреля 2023

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

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

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

В первую очередь 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), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.

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

[править | править код]

Ниже приведён пример программы вычисления числа на языке 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 %.16lf, Error is %.16lf\n", pi, fabs(pi - PI25DT));
                endwtime = MPI_Wtime();
                printf("wall clock time =%lf\n", endwtime-startwtime);
                fflush(stdout);
            }
        }
    }
 
    // Освобождение подсистемы MPI
    MPI_Finalize();
    return 0;
}

Реализации MPI

[править | править код]
  • MPICH — одна из самых первых свободная реализация MPI, работает на UNIX-системах и Windows NT
  • Open MPI — ещё одна свободная реализация MPI. Основана на более ранних проектах FT-MPI, LA-MPI, LAM/MPI и PACX-MPI. Поддерживаются различные коммуникационные системы (в том числе Myrinet).
  • MPI/PRO for Windows NT — коммерческая реализация для Windows NT
  • Intel MPI — коммерческая реализация для Windows / Linux
  • Microsoft MPI входит в состав Compute Cluster Pack SDK. Основан на MPICH2, но включает дополнительные средства управления заданиями. Поддерживается спецификация MPI-2.
  • HP-MPI — коммерческая реализация от HP
  • SGI MPT — платная библиотека MPI от SGI
  • Mvapich — свободная реализация MPI для Infiniband
  • Oracle HPC ClusterTools — бесплатная реализация для Solaris SPARC/x86 и Linux на основе Open MPI
  • MPJ — MPI for Java
  • MPJ Express — MPI на Java