Вперед: 4.2. Базовые функции MPI
Назад: 4.10. Контрольные вопросы к главе 3.
К содержанию: Оглавление


Глава 4. Прикладной программный интерфейс MPI

4.1. Общая организация MPI

Коммуникационная библиотека MPI стала общепризнанным стандартом в параллельном программировании с использованием механизма передачи сообщений. Полное и строгое описание среды программирования MPI можно найти в авторском описании разработчиков [7], [15]. Предлагаемое вниманию читателя описание MPI не является полным, однако содержит значительно больше материала, чем принято представлять во введениях в MPI. Цель данного пособия состоит в том, чтобы, во-первых, ознакомить читателя с функциональными возможностями этой коммуникационной библиотеки и, во-вторых, рассмотреть набор подпрограмм, достаточный для программирования алгоритмов любой сложности. Примеры параллельных программ c использованием коммуникационной библиотеки MPI, приведенные в данной главе, протестированы на различных многопроцессорных системах.

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

MPI не предоставляет никаких средств для распределения процессов по вычислительным узлам и для запуска их на исполнение. Эти функции возлагаются либо на операционную систему, либо на программиста. Например, на многопроцессорной системе nCUBE2 для запуска MPI программ используется стандартная команда xnc, а на кластерах - специальный командный файл (скрипт) mpirun, который предполагает, что исполняемая программа уже каким-то образом распределена по вычислительным узлам кластера. Наиболее распространенный подход состоит в использовании сетевой файловой системы для трансляции программ пользователей на вычислительные узлы.

Описываемый в данной книге стандарт MPI 1.1 не содержит механизмов динамического создания и уничтожения процессов во время выполнения программы. MPI не накладывает каких-либо ограничений на то, как процессы будут распределены по процессорам, в частности, возможен запуск MPI-программы с несколькими процессами на обычной однопроцессорной системе.

При инициализации MPI создается совокупность процессов, образующих область связи, с которой связывается предопределенный коммуникатор MPI_COMM_WORLD. В дальнейшем различные выборки процессов могут объединяться в группы с нумерацией процессов от 0 до groupsize-1, с которыми могут быть связаны свои коммуникаторы. Все коммуникационные операции с некоторым коммуникатором будут выполняться только внутри области связи, описываемой этим коммуникатором.

Если сформулировать коротко, то MPI - это библиотека функций, обеспечивающая взаимодействие параллельных процессов с помощью механизма передачи сообщений. Это достаточно объемная и сложная библиотека, состоящая примерно из 130 функций, в число которых входят:

Набор функций библиотеки MPI далеко выходит за рамки набора функций, минимально необходимого для поддержки механизма передачи сообщений. Однако сложность этой библиотеки не должна пугать пользователей, поскольку, в конечном итоге, все это множество функций предназначено для облегчения разработки эффективных параллельных программ. В конце концов, пользователю принадлежит право самому решать, какие средства из предоставляемого арсенала использовать, а какие нет. В принципе, любая параллельная программа может быть написана с использованием всего 6 MPI-функций, а достаточно полную и удобную среду программирования согласно Яну Фостеру составляет набор из 24 функций [12].

Каждая из MPI функций характеризуется некоторым набором свойств, которые определяют способ ее выполнения:

Локальная функция - выполняется внутри вызывающего процесса. Ее завершение не требует коммуникаций.

Нелокальная функция - для ее завершения может потребоваться выполнение MPI-процедуры другим процессом.

Глобальная функция - процедуру должны выполнять все процессы в области связи коммуникатора. Несоблюдение этого условия может приводить к зависанию программы.

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

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

Использование библиотеки MPI имеет некоторые отличия в языках Cи и Фортран.

В языке Cи все процедуры являются функциями, и большинство из них возвращает код ошибки. При использовании имен подпрограмм и именованных констант необходимо строго соблюдать регистр символов. Массивы индексируются с 0. Логические переменные представляются типом int (true соответствует 1, а false - 0). Определение всех именованных констант, прототипов функций и определение типов выполняется подключением файла mpi.h. Введение собственных типов в MPI было продиктовано тем обстоятельством, что стандартные типы языков на разных платформах имеют различное представление. MPI допускает возможность запуска процессов параллельной программы на компьютерах различных платформ, обеспечивая при этом автоматическое преобразование данных при пересылках. В таблице 4.1 приведено соответствие предопределенных в MPI типов стандартным типам языка Си.

В языке Фортран большинство MPI-процедур являются подпрограммами (вызываются с помощью оператора CALL), а код ошибки возвращают через дополнительный последний параметр процедуры. Несколько процедур, оформленных в виде функций, код ошибки не возвращают. Не требуется строгого соблюдения регистра символов в именах подпрограмм и именованных констант. Массивы индексируются с 1. Объекты MPI, которые в языке Cи являются структурами, в языке Фортран представляются массивами целого типа. Определение всех именованных констант и определение типов выполняется подключением файла mpif.h. В таблице 4.2 приведено соответствие предопределенных в MPI типов стандартным типам языка Фортран.

Таблица 4.1. Соответствие между MPI-типами и типами языка Cи

Тип MPIТип языка C
MPI_CHARsigned char
MPI_SHORTsigned short int
MPI_INTsigned int
MPI_LONGsigned long int
MPI_UNSIGNED_CHARunsigned char
MPI_UNSIGNED_SHORTunsigned short int
MPI_UNSIGNEDunsigned int
MPI_UNSIGNED_LONGunsigned long int
MPI_FLOATFloat
MPI_DOUBLEDouble
MPI_LONG_DOUBLElong double
MPI_BYTE
MPI_PACKED

Таблица 4.2. Соответствие между MPI-типами и типами языка Фортран

Тип MPIТип языка Фортран
MPI_INTEGERINTEGER
MPI_REALREAL
MPI_DOUBLE_PRECISIONDOUBLE PRECISION
MPI_COMPLEXCOMPLEX
MPI_LOGICALLOGICAL
MPI_CHARACTERCHARACTER(1)
MPI_BYTE
MPI_PACKED

В таблицах 4.1 и 4.2 перечислен обязательный минимум поддерживаемых стандартных типов, однако, если в базовой системе представлены и другие типы, то их поддержку будет осуществлять и MPI, например, если в системе есть поддержка комплексных переменных двойной точности DOUBLE COMPLEX, то будет присутствовать тип MPI_DOUBLE_COMPLEX. Типы MPI_BYTE и MPI_PACKED используются для передачи двоичной информации без какого-либо преобразования. Кроме того, программисту предоставляются средства создания собственных типов на базе стандартных.

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



Вперед: 4.2. Базовые функции MPI
Назад: 4.10. Контрольные вопросы к главе 3.
К содержанию: Оглавление