|
Основные понятия MPI-программирования
Стандарт библиотеки MPI определен для двух языков: Фортрана и C
(заметим, что вариант библиотеки MPI для языка С может быть
использован без каких-либо изменений и в программах на языке C++). В то
же время, поскольку данная библиотека является обычной процедурной
библиотекой и состоит из набора функций, ее можно использовать в
любом процедурном языке; требуется лишь, чтобы этот язык допускал
работу с указателями. Поэтому нет никаких препятствий к тому, чтобы
использовать средства библиотеки MPI в программах на языке Pascal,
широко применяемом в настоящее время при обучении
программированию. При этом знания, полученные при изучении
технологии MPI с применением языка Pascal, можно будет в дальнейшем
использовать и при разработке параллельных программ на других языках
(учитывая лишь особенности этих языков, связанные с передачей
параметров).
Поскольку параллельные программы, разрабатываемые на языках
C/С++ и Pascal, имеют, по существу, одни и те же особенности,
связанные со спецификой технологии MPI, мы будем описывать
выполнение заданий по параллельному программированию сразу для двух
языков: Pascal и C++. Так как настоящее описание технологии MPI ориентировано на
применение электронного задачника Programming Taskbook for MPI,
необходимо использовать программную среду, для которой имеется
реализация данного задачника. Для языка Pascal такими средами
являются Borland Delphi 7, Turbo Delphi 2006 for Win32, Free Pascal
Lazarus 1 for Win32, а для языка C++ (начиная с версии 1.5 задачника PT for MPI) Microsoft Visual Studio
2008, 2010, 2012, 2013 и Code::Blocks 13. Будем считать для
определенности, что при выполнении заданий на языке Pascal используется
среда Free Pascal Lazarus, а при выполнении заданий на C++
среда Microsoft Visual Studio 2008.
Знакомство с параллельным программированием начнем с
рассмотрения следующей простой задачи.
MPIBegin1.
В каждом из процессов, входящих в коммуникатор
MPI_COMM_WORLD, прочесть одно целое число и вывести его
удвоенное значение. Кроме того, для главного процесса (процесса
ранга 0) вывести количество процессов, входящих в
коммуникатор MPI_COMM_WORLD.
Прежде всего разъясним термины параллельного MPI-программирования.
При параллельном выполнении программы запускается несколько
экземпляров этой программы. Каждый запущенный экземпляр
представляет собой отдельный процесс (англ. process), который
может взаимодействовать с другими процессами, обмениваясь
сообщениями (messages). MPI-функции предоставляют
разнообразные средства для реализации такого взаимодействия
(аббревиатура MPI расшифровывается как «Message Passing Interface»
интерфейс передачи сообщений).
Для идентификации каждого процесса в группе процессов
используется понятие ранга (rank). Ранг процесса это
порядковый номер процесса в группе процессов, отсчитываемый от нуля
(таким образом, первый процесс имеет ранг 0, а последний процесс
ранг K 1, где K количество процессов в
группе). При этом группа процессов может включать лишь часть всех
запущенных процессов параллельного приложения.
С группой процессов связывается особая сущность библиотеки MPI,
называемая коммуникатором (communicator). Любое
взаимодействие процессов возможно только в рамках того или иного
коммуникатора. Стандартный коммуникатор, содержащий все процессы,
запущенные при параллельном выполнении программы, имеет имя
MPI_COMM_WORLD. «Пустой» коммуникатор, не
содержащий ни одного процесса, имеет имя MPI_COMM_NULL.
Процесс ранга 0 часто называют главным процессом (master
process), а остальные процессы подчиненными (slave
processes). Как правило, главный процесс играет особую роль по
отношению к подчиненным процессам, передавая им свои данные или
получая данные от всех (или некоторых) подчиненных процессов. В
рассматриваемом задании MPIBegin1 все процессы должны выполнить
одно и то же действие прочесть одно целое число и вывести его
удвоенное значение, а главный процесс, кроме этого, должен выполнить
дополнительное действие вывести количество всех запущенных
процессов (иными словами, количество всех процессов, входящих в
коммуникатор MPI_COMM_WORLD). Обратите внимание на то, что в
этом простом задании процессам не требуется обмениваться сообщениями
друг с другом (таковы все задания начального уровня, входящие в
подгруппу «Процессы и их ранги»).
|