Message Passing Interface | это... Что такое Message Passing Interface? (original) (raw)

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

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

В первую очередь 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 года) дополнительно поддерживаются следующие функции:

Версия 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 %.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

Поддерживаются различные коммуникационные системы (в том числе Myrinet).

Ссылки

См. также

Просмотр этого шаблона Параллельные вычисления
Общие положения Облачные вычисления · Высокопроизводительные вычисления · Кластерные вычисления · Распределённые вычисления · Грид-вычисления · Гибридные вычисления
Уровни паралеллизма Биты · Инструкции · Данные · Задачи
Поток выполнения Суперпоточность · Гиперпоточность
Теория Закон Амдала · Закон Густавсона — Барсиса · Эффективность затрат · Метрика Карпа-Флэтта · Замедление · Коэффициент ускорения
Элементы Процесс · Поток · Файбер · ПМПД · Instruction window
Взаимодействие Многопроцессорность · Многопоточность · Когерентность памяти · Когерентность кэша · Недействительность кэша · Барьер · Синхронизация · Контрольная точка
Программирование Модели (Скрытый паралеллизм · Явный паралеллизм · Параллелизм) · Таксономия Флинна (SISDSIMDMISDMIMD (SPMD)) · Поток · Неблокирующая синхронизация
Компьютерная техника Мультипроцессорность (Симметричная · Асимметричная) · Память (NUMA · COMA · Распределённая · Разделяемая · Распределённая разделяемая) · Одновременная многопоточность MPP · Суперскалярность · Векторный процессор · Суперкомпьютер · Beowulf
API Ateji PX · POSIX Threads · OpenMP · OpenHMPP · PVM · MPI · UPC · Intel Threading Building Blocks · Boost · Global Arrays · Charm++ · Cilk · Co-array Fortran · OpenCL · CUDA · Stream · Dryad · DryadLINQ
Проблемы Затруднительное распараллеливание · Проблемы Великого Вызова · Блокировка ПО · Масштабируемость · Состояние гонки · Взаимная блокировка · Активный тупик · Детерминированный алгоритм · Параллельное замедление