Параллельное программирование с использованием технологии MPI
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ИНТУИТ
Автор:
Антонов А. С.
Год издания: 2016
Кол-во страниц: 63
Дополнительно
Технология MPI является основным средством программирования для кластерных систем и компьютеров с распределенной памятью, но может применяться также и на вычислительных системах других типов.
Курс включает в себя описание большинства основных процедур стандарта MPI-1.1 с примерами их применения и практические сведения, которые могут потребоваться при написании реальных программ. Основное описание ведется с использованием вызовов процедур MPI из программ на языке Фортран, однако указаны также основные отличия в использовании вызовов аналогичных функций из программ на языке Си.
Тематика:
ББК:
УДК:
- 004: Информационные технологии. Вычислительная техника...
- 681: Точная механика. Автоматика. Приборостроение
ОКСО:
- ВО - Бакалавриат
- 02.03.01: Математика и компьютерные науки
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- ВО - Магистратура
- 02.04.01: Математика и компьютерные науки
- 02.04.02: Фундаментальная информатика и информационные технологии
- 09.04.01: Информатика и вычислительная техника
- 09.04.02: Информационные системы и технологии
- 09.04.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Параллельное программирование с использованием технологии MPI 2-е издание, исправленное Антонов А.С. Национальный Открытый Университет “ИНТУИТ” 2016 2
Параллельное программирование с использованием технологии MPI/ А.С. Антонов - М.: Национальный Открытый Университет “ИНТУИТ”, 2016 Технология MPI является основным средством программирования для кластерных систем и компьютеров с распределенной памятью, но может применяться также и на вычислительных системах других типов. Курс включает в себя описание большинства основных процедур стандарта MPI-1.1 с примерами их применения и практические сведения, которые могут потребоваться при написании реальных программ. Основное описание ведется с использованием вызовов процедур MPI из программ на языке Фортран, однако указаны также основные отличия в использовании вызовов аналогичных функций из программ на языке Си. (c) ООО “ИНТУИТ.РУ”, 2008-2016 (c) Антонов А.С., 2008-2016 3
Основные понятия В данной лекции можно познакомиться в общих чертах с наиболее распространенной технологией программирования для параллельных компьютеров с распределенной памятью Наиболее распространенной технологией программирования для параллельных компьютеров с распределенной памятью в настоящее время является MPI. Основным способом взаимодействия параллельных процессов в таких системах является передача сообщений друг другу. Это и отражено в названии данной технологии - Message Passing Interface (интерфейс передачи сообщений). Стандарт MPI фиксирует интерфейс, который должен соблюдаться как системой программирования на каждой вычислительной платформе, так и пользователем при создании своих программ. Современные реализации, чаще всего, соответствуют стандарту MPI версии 1.1. В 1997- 1998 годах появился стандарт MPI-2.0, значительно расширивший функциональность предыдущей версии. Однако до сих пор этот вариант MPI не получил широкого распространения и в полном объеме не реализован ни на одной системе. Везде далее, если иного не оговорено, мы будем иметь дело со стандартом MPI-1.1. MPI поддерживает работу с языками Фортран и Си. В данном пособии примеры и описания всех процедур будут даны с использованием языка Фортран. Однако это совершенно не является принципиальным, поскольку основные идеи MPI и правила оформления отдельных конструкций для этих языков во многом схожи. Полная версия интерфейса содержит описание более 125 процедур и функций. Наша задача объяснить идею технологии и помочь освоить необходимые на практике компоненты. Дополнительную информацию об интерфейсе MPI можно найти на тематической странице Информационно-аналитического центра по параллельным вычислениям в сети Интернет ссылка: http://parallel.ru/tech/tech_dev/mpi.html. Интерфейс MPI поддерживает создание параллельных программ в стиле MIMD (Multiple Instruction Multiple Data), что подразумевает объединение процессов с различными исходными текстами. Однако писать и отлаживать такие программы очень сложно, поэтому на практике программисты гораздо чаще используют SPMD-моделъ (Single Program Multiple Data) параллельного программирования, в рамках которой для всех параллельных процессов используется один и тот же код. В настоящее время все больше и больше реализаций MPI поддерживают работу с нитями. Поскольку MPI является библиотекой, то при компиляции программы необходимо прилинковать соответствующие библиотечные модули. Это можно сделать в командной строке или воспользоваться предусмотренными в большинстве систем командами или скриптами mpicc++ (для программ на языке Си), mpicc++ (для программ на языке Си++), и mpif 77/ mpif 90 (для программ на языках Фортран 77/90). Опция компилятора "-о name" позволяет задать имя name для получаемого выполнимого файла, по умолчанию выполнимый файл yказывается на out, например: mpif77 -o program program.f . 4
После получения выполнимого файла необходимо запустить его на требуемом количестве процессоров. Для этого обычно предоставляется команда запуска MPIприложений mpirun, например: mpirun -np N <программа с аргументами>, где N - число процессов, которое должно быть не более разрешенного в данной системе числа процессов для одной задачи. После запуска одна и та же программа будет выполняться всеми запущенными процессами, результат выполнения в зависимости от системы будет выдаваться на терминал или записываться в файл с предопределенным именем. Все дополнительные объекты: имена процедур, константы, предопределенные типы данных и т.п., используемые в MPI, имеют префикс MPI_. Если пользователь не будет использовать в программе имен с таким префиксом, то конфликтов с объектами MPI заведомо не будет. В языке Си, кроме того, является существенным регистр символов в названиях функций. Обычно в названиях функций MPI первая буква после префикса MPI_ пишется в верхнем регистре, последующие буквы - в нижнем регистре, а названия констант MPI записываются целиком в верхнем регистре. Все описания интерфейса MPI собраны в файле mpif.h (mpi.h) , поэтому в начале MPI-программы должна стоять директива include ‘mpif.h’ ( #include “mpi.h” для программ на языке Си). MPI-программа - это множество параллельных взаимодействующих процессов. Все процессы порождаются один раз, образуя параллельную часть программы. В ходе выполнения MPI-программы порождение дополнительных процессов или уничтожение существующих не допускается (в MPI-2.0 такая возможность появилась). Каждый процесс работает в своем адресном пространстве, никаких общих переменных или данных в MPI нет. Основным способом взаимодействия между процессами является явная посылка сообщений. Для локализации взаимодействия параллельных процессов программы можно создавать группы процессов , предоставляя им отдельную среду для общениякоммуникатор . Состав образуемых групп произволен. Группы могут полностью совпадать, входить одна в другую, не пересекаться или пересекаться частично. Процессы могут взаимодействовать только внутри некоторого коммуникатора, сообщения, отправленные в разных коммуникаторах, не пересекаются и не мешают друг другу. Коммуникаторы имеют в языке Фортран тип INTEGER (В языке Си предопределенный тип MPI_Comm ) . При старте программы всегда считается, что все порожденные процессы работают в рамках всеобъемлющего коммуникатора, имеющего предопределенное имя MPI_COMM_WORLD. Этот коммуникатор существует всегда и служит для взаимодействия всех запущенных процессов MPI-программы. Кроме него при старте программы имеется коммуникатор MPI_COMM_SELF, содержащий только один текущий процесс, а также коммуникатор MPI_COMM_NULL, не содержащий ни одного процесса. Все взаимодействия процессов протекают в рамках определенного коммуникатора, сообщения, переданные в разных коммуникаторах, никак не мешают друг другу. 5
Каждый процесс MPI-программы имеет в каждой группе, в которую он входит, уникальный атрибут номер процесса , который является целым неотрицательным числом. С помощью этого атрибута происходит значительная часть взаимодействия процессов между собой. Ясно, что в одном и том же коммуникаторе все процессы имеют различные номера. Но поскольку процесс может одновременно входить в разные коммуникаторы, то его номер в одном коммуникаторе может отличаться от его номера в другом. Отсюда становятся понятными два основных атрибута процесса: коммуникатор и номер в коммуникаторе . Если группа содержит п процессов, то номер любого процесса в данной группе лежит в пределах от 0 до п - 1. Основным способом общения процессов между собой является явная посылка сообщений. Сообщение - это набор данных некоторого типа. Каждое сообщение имеет несколько атрибутов , в частности, номер процесса-отправителя, номер процессаполучателя, идентификатор сообщения и другие. Одним из важных атрибутов сообщения является его идентификатор или тэг. По идентификатору процесс, принимающий сообщение, например, может различить два сообщения, пришедшие к нему от одного и того же процесса. Сам идентификатор сообщения является целым неотрицательным числом, лежащим в диапазоне от 0 до MPI_TAG_UP, причем гарантируется, что MPI_TAG_UP не меньше 327 67. Для работы с атрибутами сообщений введен массив (в языке Си - структура), элементы которого дают доступ к их значениям. В последнем аргументе (в языке Си - в возвращаемом значении функции) большинство процедур MPI возвращают информацию об успешности завершения. В случае успешного выполнения возвращается значение MPI_SUCCESS, иначе - код ошибки. Вид ошибки, которая произошла при выполнении процедуры, можно будет определить из ее описания. Предопределенные значения, соответствующие различным ошибочным ситуациям, перечислены в файле mpif .h.. 6
Общие процедуры MPI В данной лекции остановимся на общих процедурах MPI, не связанных с пересылкой данных. Большинство процедур, описанных в этой лекции, необходимы практически в каждой содержательной параллельной программе В данном разделе мы остановимся на общих процедурах MPI, не связанных с пересылкой данных. Большинство процедур этого раздела необходимы практически в каждой содержательной параллельной программе. MPI_INIT(IERR) INTEGER IERR Инициализация параллельной части программы. Все другие процедуры MPI могут быть вызваны только после вызова MPI_INIT. Инициализация параллельной части для каждого приложения должна выполняться только один раз. В языке Си функции MPI_Init передаются указатели на аргументы командной строки программы argc и argv, из которых системой могут извлекаться и передаваться в параллельные процессы некоторые параметры запуска программы. MPI_FINALIZE(IERR) INTEGER IERR Завершение параллельной части приложения. Все последующие обращения к любым процедурам MPI, в том числе к MPI_INIT, запрещены. К моменту вызова MPI_FINALIZE каждым процессом программы все действия, требующие его участия в обмене сообщениями, должны быть завершены. Пример простейшей MPI-программы на языке Фортран выглядит следующим образом: program example1 include 'mpif.h' integer ierr print *, 'Before MPI_INIT' call MPI_INIT(ierr) print *, 'Parallel section' call MPI_FINALIZE(ierr) print *, 'After MPI_FINALIZE' end В зависимости от реализации MPI строчки ‘Before MPI_INIT’ И ‘After MPI_FINALIZE’ может печатать либо один выделенный процесс, либо все запущенные процессы приложения. Строчку ‘Parallel section’ должны напечатать все процессы. Порядок вывода строк с разных процессов может быть произвольным. Общая схема MPI-программы на языке Си выглядит примерно следующим образом: #include "mpi.h" main(int argc, char **argv) MPI_Init(&argc, &argv); MPI_Finalize() ; 7