MPI (технология программирования)
MPI (от англ. Message Passing Interface, буквально – интерфейс передачи сообщений), наиболее распространённая технология программирования для параллельных вычислительных систем с распределённой памятью. Основной способ взаимодействия параллельных процессов в таких системах – передача сообщений друг другу, что и отражено в названии технологии. Классическая модель передачи сообщений была в дальнейшем расширена за счёт коллективных операций, односторонних коммуникаций, динамического управления процессами, параллельного ввода-вывода и некоторых других возможностей.
Стандарт MPI фиксирует интерфейс, который должен соблюдаться как системой программирования на каждой вычислительной платформе, так и пользователем при создании своих программ. Созданием стандарта MPI занимается MPI Forum. Долгое время большинство реализаций соответствовали стандарту MPI версии 1.1, опубликованному в 1995 г. В 1997 г. появился стандарт MPI 2.0, значительно расширивший функциональность предыдущей версии. Далее были выпущены версии стандарта MPI 2.1 (2008), MPI 2.2 (2009), MPI 3.0 (2012), MPI 3.1 (2015), MPI 4.0 (2021). Версия стандарта MPI 4.1 опубликована в 2023 г. Некоторые функции последних вариантов стандарта MPI могут не поддерживаться конкретными реализациями.
Существует большое количество бесплатных и коммерческих реализаций MPI почти для всех суперкомпьютерных платформ, а также для сетей рабочих станций. Наиболее известные реализации: MPICH, OpenMPI, Intel MPI Library, MVAPICH.
Стандарт MPI поддерживает работу с языками программирования Fortran и C. Существуют также реализации MPI для других языков программирования, таких как C++, C#, Java и Python. Основные идеи MPI и правила оформления отдельных конструкций для всех языков во многом схожи. Полная версия стандарта MPI 4.1 содержит описание более 600 процедур и функций.
Интерфейс MPI поддерживает создание параллельных программ в стиле MIMD (от англ. Multiple Instruction Multiple Data – множественный поток команд, множественный поток данных) по классификации Флинна, что подразумевает объединение вычислительных процессов, выполняющих различные исходные тексты. Однако писать и отлаживать такие программы очень сложно, поэтому на практике программисты гораздо чаще используют модель SPMD (от англ. Single Program Multiple Data – одна программа, множественный поток данных) параллельного программирования, в рамках которой для всех параллельных процессов используется один и тот же программный код. Ныне всё больше и больше реализаций MPI также поддерживают работу с нитями (легковесными процессами без собственного адресного пространства).
Поскольку MPI является библиотекой, то при компиляции программы необходимо ссылаться на соответствующие библиотечные модули. Это можно сделать в командной строке или воспользоваться предусмотренными в большинстве систем командами или скриптами. После получения выполнимого файла необходимо запустить его на требуемом количестве процессов.
MPI-программа – это множество параллельных взаимодействующих процессов. Процессы порождаются при запуске программы, а начиная с версии стандарта MPI 2.0 появилась возможность динамического порождения дополнительных процессов или уничтожения существующих. Каждый процесс работает в своём адресном пространстве (хотя возможны и реализации MPI на компьютерах с общей памятью), никаких общих переменных или данных в MPI нет. Основным способом взаимодействия между процессами является явная посылка сообщений. Для локализации взаимодействия параллельных процессов программы можно создавать группы процессов, предоставляя им отдельную среду для общения – коммуникатор.
Для написания эффективной параллельной программы c использованием технологии MPI необходимо: найти в программе ресурс параллелизма, распределить данные по модулям памяти вычислительных узлов, распределить операции по исполнительным устройствам, согласовать распределение данных с параллелизмом вычислений, организовать необходимые пересылки данных.