Параллельное программирование в стандарте MPI. Баканов В.М - 6 стр.

UptoLike

Составители: 

- 6 -
одновременно (и относительно независимо друг от друга) на различных ВУ
выполняются несколько (базирующихся на различных исходных текстах)
программных ветвей, в определенные промежутки времени обменивающиеся
данными. Однако подобные программы слишком громоздки при написании
(для каждого ВУ требуется отдельный исходной текст), поэтому на практике
применяется
SPMD
-подход (Single Program - Multiple Data: одна программа
множество данных), предполагающий исполнение на различных ВУ логиче-
ски выделенных условными операторами участков идентичного кода. Все
ветви программы запускаются загрузчиком одновременно как процессы
UNIX; количество ветвей фиксированосогласно стандарту MPI 1.1 в ходе
работы порождение новых ветвей невозможно.
Параллельно выполняющиеся программы обычно не используют привыч-
ного пользователям ОС Windows оконного
интерфейса (вследствие как труд-
ности связывания окон с конкретным экземпляром приложения, так и несу-
щественности использования подобного интерфейса при решении серьезных
счетных задач). Отладка параллельного приложения также существенно от-
личается от таковой обычного последовательного [3].
В дальнейшем будем считать, что параллельное приложение состоит из не-
скольких ветвей
(или процессов, или задач), выполняющихся одновременно
на ВУ; при этом процессы обмениваются друг с другом данными в виде со-
общений (рис.1). Каждое сообщение имеет идентификатор, который позво-
ляет программе и библиотеке связи отличать их друг от друга. В MPI суще-
ствует понятие области связи;
области связи имеют независимую друг от
друга нумерацию процессов (коммуникатор
как раз и определяет область
связи).
В общем случае создание параллельной программы включает в себя (ук-
рупненно) две основные стадии:
Исходно-последовательный алгоритм подвергается декомпозиции (распа-
раллеливанию), т.е. разбивается на независимо работающие ветви; для
взаимодействия в ветви вводятся два типа дополнительных нематематиче-
ских операции: прием (
Send
) и передача (
Receive
) данных.
Распараллеленный алгоритм оформляется в виде программы, в которой
операции приема и передачи записываются в терминах конкретной систе-
мы связи между ветвями (в нашем случае MPI).
Несколько подробнее этот процесс описан в [4,5], для желающих серьезно
заняться проблемой рекомендуются работы [1,3].
Т.к. время обмена данными между ветвями намного (на порядки) больше
времени доступа к собственной (локальной) памяти, распределение работы
между процессами должно бытькрупнозернистым’ [1]. Типичный размер
этого зерна (гранулы) составляет десятки-сотни тысяч машинных операций
(что на порядки превышает типичный размер оператора языков Fortran или
C/C++, [3]). В зависимости от размеров гранул говорят о мелкозернистом и
крупнозернистом параллелизме (fine-grained parallelism и coarse-grained par-
                                    -6-

одновременно (и относительно независимо друг от друга) на различных ВУ
выполняются несколько (базирующихся на различных исходных текстах)
программных ветвей, в определенные промежутки времени обменивающиеся
данными. Однако подобные программы слишком громоздки при написании
(для каждого ВУ требуется отдельный исходной текст), поэтому на практике
применяется SPMD-подход (Single Program - Multiple Data: одна программа –
множество данных), предполагающий исполнение на различных ВУ логиче-
ски выделенных условными операторами участков идентичного кода. Все
ветви программы запускаются загрузчиком одновременно как процессы
UNIX; количество ветвей фиксировано – согласно стандарту MPI 1.1 в ходе
работы порождение новых ветвей невозможно.
  Параллельно выполняющиеся программы обычно не используют привыч-
ного пользователям ОС Windows оконного интерфейса (вследствие как труд-
ности связывания окон с конкретным экземпляром приложения, так и несу-
щественности использования подобного интерфейса при решении серьезных
счетных задач). Отладка параллельного приложения также существенно от-
личается от таковой обычного последовательного [3].
  В дальнейшем будем считать, что параллельное приложение состоит из не-
скольких ветвей (или процессов, или задач), выполняющихся одновременно
на ВУ; при этом процессы обмениваются друг с другом данными в виде со-
общений (рис.1). Каждое сообщение имеет идентификатор, который позво-
ляет программе и библиотеке связи отличать их друг от друга. В MPI суще-
ствует понятие области связи; области связи имеют независимую друг от
друга нумерацию процессов (коммуникатор как раз и определяет область
связи).
  В общем случае создание параллельной программы включает в себя (ук-
рупненно) две основные стадии:

 •   Исходно-последовательный алгоритм подвергается декомпозиции (распа-
     раллеливанию), т.е. разбивается на независимо работающие ветви; для
     взаимодействия в ветви вводятся два типа дополнительных нематематиче-
     ских операции: прием (Send) и передача (Receive) данных.
 •   Распараллеленный алгоритм оформляется в виде программы, в которой
     операции приема и передачи записываются в терминах конкретной систе-
     мы связи между ветвями (в нашем случае MPI).

  Несколько подробнее этот процесс описан в [4,5], для желающих серьезно
заняться проблемой рекомендуются работы [1,3].
  Т.к. время обмена данными между ветвями намного (на порядки) больше
времени доступа к собственной (локальной) памяти, распределение работы
между процессами должно быть ‘крупнозернистым’ [1]. Типичный размер
этого зерна (гранулы) составляет десятки-сотни тысяч машинных операций
(что на порядки превышает типичный размер оператора языков Fortran или
C/C++, [3]). В зависимости от размеров гранул говорят о мелкозернистом и
крупнозернистом параллелизме (fine-grained parallelism и coarse-grained par-