Введение в практику разработки параллельных программ в стандарте MPI. Баканов В.М - 8 стр.

UptoLike

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

- 8 -
тивовес этому неблокирующие функции возвращают управление вызвав-
шей их программе немедленно, а выполнение операции продолжается в
фоновом режиме; за завершением операции надо проследить особо. Не-
блокирующие функции возвращают квитанции (‘requests’), которыепога-
шаютсяпри завершении; до погашения квитанции с переменными и мас-
сивами, которые были аргументами неблокирующей функции, ничего де-
лать нельзя.
Локальные функции не инициируют пересылок данных между ветвями.
Локальными являются большинство информационных функций (т.к. копии
системных данных уже хранятся в каждой ветви). Функция передачи
MPI_Send и функция синхронизации MPI_Barrier не являются локальными,
поскольку производят пересылку. В то же время функция приема
MPI_Recv
(парная для
MPI_Send) является локальной: она всего лишь пассивно ждет
поступления данных, ничего не пытаясь сообщить другим ветвям.
Коллективные функции должны быть вызваны всеми ветвями-абонентами
коммуникатора (о понятии коммуникатора см. ниже), передаваемого им
как аргумент. Несоблюдение этого правила приводит к ошибкам на стадии
выполнения программы (обычно кповисаниюпрограммы).
В MPI продумано объединение ветвей в коллективы (это помогает надеж-
нее отличать сообщения друг от друга). Достигается это введением в функ-
ции MPI параметра типакоммуникатор’, который можно рассматривать как
дескриптор (номер) коллектива (он ограничивает область действия данной
функции соответствующим коллективом). Коммуникатор коллектива, кото-
рый включает в себя все ветви приложения, создается
автоматически (при
выполнении функции
MPI_INIT) и называется MPI_COMM_WORLD; в дальней-
шем имеется возможность (функция
MPI_Comm_split) создавать новые комму-
никаторы. Имеют место включающий только самого себя как процесс комму-
никатор
MPI_COMM_SELF и (заведомо неверный) коммуникатор
MPI_COMM_NULL; в случае возможности (динамического) порождения новых
процессов ситуация сложнее (подробнее см. [3
÷
5]).
Наиболее простыми функциями коммуникаций являются функцииточка-
точка’, в таких взаимодействиях участвуют два процесса, причем один
процесс является отправителем сообщения, а другой - получателем.
Процесс-отправитель вызывает одну из процедур передачи данных и явно
указывает номер в коммуникаторе процесса-получателя, а процесс-
получатель должен вызвать одну из процедур приема с указанием
того же
коммуникатора (в некоторых случаях необязательно знать точный номер
процесса-отправителя в заданном коммуникаторе).
Все процедуры этой группы делятся на два класса: процедуры с блокиров-
кой (с синхронизацией) и процедуры без блокировки (асинхронные). Проце-
дуры обмена с блокировкой приостанавливают работу процесса до выполне-
ния определенного условия, а возврат из асинхронных
процедур происходит
немедленно после инициализации соответствующей коммуникационной опе-
    тивовес этому неблокирующие функции возвращают управление вызвав-
    шей их программе немедленно, а выполнение операции продолжается в
    фоновом режиме; за завершением операции надо проследить особо. Не-
    блокирующие функции возвращают квитанции (‘requests’), которые ‘пога-
    шаются’ при завершении; до погашения квитанции с переменными и мас-
    сивами, которые были аргументами неблокирующей функции, ничего де-
    лать нельзя.
•   Локальные функции не инициируют пересылок данных между ветвями.
    Локальными являются большинство информационных функций (т.к. копии
    системных данных уже хранятся в каждой ветви). Функция передачи
    MPI_Send и функция синхронизации MPI_Barrier не являются локальными,
    поскольку производят пересылку. В то же время функция приема MPI_Recv
    (парная для MPI_Send) является локальной: она всего лишь пассивно ждет
    поступления данных, ничего не пытаясь сообщить другим ветвям.
•   Коллективные функции должны быть вызваны всеми ветвями-абонентами
    коммуникатора (о понятии коммуникатора см. ниже), передаваемого им
    как аргумент. Несоблюдение этого правила приводит к ошибкам на стадии
    выполнения программы (обычно к ‘повисанию’ программы).

  В MPI продумано объединение ветвей в коллективы (это помогает надеж-
нее отличать сообщения друг от друга). Достигается это введением в функ-
ции MPI параметра типа ‘коммуникатор’, который можно рассматривать как
дескриптор (номер) коллектива (он ограничивает область действия данной
функции соответствующим коллективом). Коммуникатор коллектива, кото-
рый включает в себя все ветви приложения, создается автоматически (при
выполнении функции MPI_INIT) и называется MPI_COMM_WORLD; в дальней-
шем имеется возможность (функция MPI_Comm_split) создавать новые комму-
никаторы. Имеют место включающий только самого себя как процесс комму-
никатор MPI_COMM_SELF и (заведомо неверный) коммуникатор
MPI_COMM_NULL; в случае возможности (динамического) порождения новых
процессов ситуация сложнее (подробнее см. [3 ÷ 5]).
  Наиболее простыми функциями коммуникаций являются функции ‘точка-
точка’, в таких взаимодействиях участвуют два процесса, причем один
процесс является отправителем сообщения, а другой - получателем.
Процесс-отправитель вызывает одну из процедур передачи данных и явно
указывает номер в коммуникаторе процесса-получателя, а процесс-
получатель должен вызвать одну из процедур приема с указанием того же
коммуникатора (в некоторых случаях необязательно знать точный номер
процесса-отправителя в заданном коммуникаторе).
  Все процедуры этой группы делятся на два класса: процедуры с блокиров-
кой (с синхронизацией) и процедуры без блокировки (асинхронные). Проце-
дуры обмена с блокировкой приостанавливают работу процесса до выполне-
ния определенного условия, а возврат из асинхронных процедур происходит
немедленно после инициализации соответствующей коммуникационной опе-
                                      -8-