Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник_Вс.doc
Скачиваний:
14
Добавлен:
01.03.2025
Размер:
13 Мб
Скачать
☆

4.1.6. Вопросы к разделу 4.1

1. Какая модель параллельных вычислений используется в библиотеке OpenMP?

2. Какие директивы используются для создания и ликвидации нитей?

3. Какие существуют способы построения параллельных программ ?

4. Охарактеризуйте нисходящие и восходящие к корню, покрывающие ориентированные деревья.

5. Каким способом определяются области действия переменных в компиляторах Open MP?

6. В чём специфика использования потоков OpenMP на основе потоков Windows?

7. Какие этапы надо выполнить перед запуском программы в Open MP?

4.2. Основы построения библиотеки mpi

4.2.1. Основные понятия

Одной из распространённых технологий программирования для создания параллельных программ в настоящее время является библиотека МРI (Message Passing Interfase – интерфейс передачи данных) [29]. Для этой библиотеки выработано несколько стандартов. Наиболее часто используемым стандартом в настоящее время является стандарт МРI 1.1 образца 1997 – 1998гг. Последняя версия стандарта - 2.0. В этой версии к MPI добавлены такие важные элементы функциональности, как динамическое управление процессами, односторонние коммуникации (Put/Get), параллельный ввод/вывод. Однако ни в одной реализации на настоящее время интерфейс MPI 2.0 полностью не поддерживается. Основным способом взаимодействия параллельных процессов в этой библиотеке является передача сообщений. Стандарт МPI фиксирует интерфейс, который должен соблюдаться как рассматриваемой библиотекой на каждой вычислительной платформе, так и пользователем при создании своих программ.

Библиотека МРI поддерживает работу с языками Фортран и Си. В данном разделе будут изложены основные положения MPI стандарта. Более подробные сведения приведены в интернете [28].

Далее в тексте примеры и описания всех процедур будут даны с использованием языка Си иллюстрирующие основные возможности этой библиотеки. Полная версия MPI стандарта содержит описание более 125 процедур и функций. Интерфейс МPI поддерживает создание параллельных программ в стиле МIМD, что подразумевает объединение процессов с различными программными модулями. При использовании стандарта MPI компиляция программы требует подключения модулей библиотеки MPI. Это можно сделать в командной строке или воспользоваться предусмотренными в большинстве систем командами или скриптами mрicc (для программ на языке Си), mрiСС (для программ на языке Си++), и mрif77/mpif90 (для программ на языках Фортран 77/90). Опция компилятора <—о паmе> позволяет задать имя nаше для получаемого выполнимого файла, по умолчанию выполнимый файл называется а.оut, например:

mрiCC -о рrоgrаm рrоgrаm.c

После получения выполнимого файла необходимо запустить его на требуемом количестве процессоров. Для этого обычно предоставляется команда запуска МPI-приложений mрiruп, например:

mрirun -nр N <программа с аргументами>,

где N – число процессов, которое должно быть не более разрешенного в данной системе числа процессов для одной задачи. После запуска одна и та же программа будет выполняться всеми запущенными процессами, результат выполнения в зависимости от системы будет выдаваться на терминал или записываться в файл с предопределенным именем.

Все дополнительные объекты: имена процедур, константы, предопределенные типы данных и т.п., используемые в МРI, описаны в библиотеке mpi.h и имеют префикс MPI_. В языке Си, кроме того, является существенным регистр символов в названиях функций. Обычно в названиях функций МPI первая буква после префикса MPI_ пишется в верхнем регистре, последующие буквы — в нижнем регистре, а названия констант МPI записываются целиком в верхнем регистре.

МPI-программа – это множество параллельных взаимодействующих процессов. Все процессы порождаются один раз, образуя параллельную часть программы. В ходе выполнения МPI-программы не допускается порождение дополнительных процессов или уничтожение уже существующих. Каждый процесс работает в своем адресном пространстве , никаких общих переменных или данных в МPI нет. Основным способом взаимодействия между процессами является явная посылка сообщений.

Для локализации взаимодействия параллельных процессов программы можно создавать группы процессов, предоставляя им отдельную среду для общения – коммуникатор. Состав образуемых групп произволен. Группы могут полностью совпадать, входить одна в другую, не пересекаться или пересекаться частично. Процессы могут взаимодействовать только внутри некоторого коммуникатора, сообщения, отправленные в разных коммуникаторах , не пересекаются и не мешают друг другу. Коммуникаторы имеют в языке Си — предопределенный тип MPI_Соmm. При старте программы всегда считается, что все порожденные процессы работают в рамках всеобъемлющего коммуникатора, имеющего предопределенное имя MPI_СOMM_WORLD. Этот коммуникатор существует всегда и служит для взаимодействия всех запущенных процессов МPI-программы. Кроме него при старте программы имеется коммуникатор MPI_СOMM_SELF, содержащий только один текущий процесс, а также коммуникатор MPI_СOMM_NULL, не содержащий ни одного процесса. Каждый процесс MPI-программы имеет в каждой группе, в которую он входит, уникальный атрибут - номер процесса, который является целым неотрицательным числом. С помощью этого атрибута происходит значительная часть взаимодействия процессов между собой. Ясно, что в одном и том же коммуникаторе все процессы имеют различные номера. Но поскольку процесс может одновременно входить в разные коммуникаторы, то его номер в одном коммуникаторе может отличаться от его номера в другом. Отсюда становятся понятными два основных атрибута процесса коммуникатор и номер в коммуникаторе. Если группа содержит n процессов, то номер любого процесса в данной группе лежит в пределах от 0 до n — 1.

Основным способом общения процессов между собой является явная посылка сообщений. Сообщение – это набор данных некоторого типа. Каждое сообщение имеет несколько атрибутов, в частности, номер процесса-отправителя, номер процесса-получателя, идентификатор сообщения и другие. По идентификатору процесс, принимающий сообщение, например, может различить два сообщения, пришедшие к нему от одного и того же процесса. Сам идентификатор сообщения является целым неотрицательным числом, лежащим в диапазоне от 0 до MPI_TAG_UP, причем гарантируется, что MPI_TAG_UP не меньше 32767. Для работы с атрибутами сообщений введен массив (в языке Си — структура), элементы которого дают доступ к их значениям.

В последнем аргументе (в языке Си — в возвращаемом значении функции) большинство процедур МРI возвращают информацию об успешности завершения. В случае успешного выполнения возвращается значение MPI_SUССESS, иначе — код ошибки. Вид ошибки, которая произошла при выполнении процедуры, можно будет определить из ее описания. Предопределенные значения, соответствующие различным ошибочным ситуациям, перечислены в файле mрif.h.

Рассмотрим часто используемые функции MPI:

INTEGER IERR;

MPI_INIT(IERR);

Инициализация параллельной части программы. Все другие процедуры МРI могут быть вызваны только после вызова MPI_INIT. Инициализация параллельной части для каждого приложения должна выполняться только один раз. В языке Си функции MPI_Iпit передаются указатели на аргументы командной строки программы аrgc и аrgv, из которых системой могут извлекаться и передаваться в параллельные процессы некоторые параметры запуска программы:

MPI_FINALIZE(IERR)

Завершение параллельной части приложения. Все последующие обращения к любым процедурам МРI, в том числе к MPI_INIT, запрещены. К моменту вызова MPI_FINALIZE каждым процессом программы все действия, требующие его участия в обмене сообщениями, должны быть завершены.