Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельное программирование на основе MPI.doc
Скачиваний:
121
Добавлен:
11.04.2015
Размер:
941.57 Кб
Скачать

5.6. Управление группами процессов и коммуникаторами

Рассмотрим теперь возможности MPIпо управлению группамипроцессови коммуникаторами.

Для изложения последующего материала напомним ряд понятий и определений, приведенных в начале данной лекции.

Процессыпараллельной программыобъединяются вгруппы. В группу могут входить всепроцессыпараллельной программы; с другой стороны, в группе может находиться только часть имеющихсяпроцессов. Один и тот жепроцессможет принадлежать нескольким группам. Управление группамипроцессовпредпринимается для создания на их основе коммуникаторов.

Под коммуникатором в MPIпонимается специально создаваемый служебный объект, который объединяет в своем составе группупроцессови ряд дополнительных параметров (контекст), используемых при выполнении операций передачи данных. Парные операции передачи данных выполняются только дляпроцессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всехпроцессовкоммуникатора. Создание коммуникаторов предпринимается для уменьшения области действия коллективных операций и для устранения взаимовлияния разных выполняемых частейпараллельной программы. Важно еще раз подчеркнуть – коммуникационные операции, выполняемые с использованием разных коммуникаторов, являются независимыми и не влияют друг на друга.

Все имеющиеся в параллельной программепроцессывходят в состав создаваемого по умолчанию коммуникатора с идентификаторомMPI_COMM_WORLD.

При необходимости передачи данных между процессамииз разных групп необходимо создавать определенные в стандартеMPI-2 глобальные коммуникаторы (intercommunicator). Взаимодействие междупроцессамиразных групп оказывается необходимым в достаточно редких ситуациях, в данном учебном материале не рассматривается и может служить темой для самостоятельного изучения – см., например, [[4],[40][42],[57]].

5.6.1. Управление группами

Группы процессовмогут быть созданы только из уже существующих групп. В качестве исходной группы может быть использована группа, связанная с предопределенным коммуникаторомMPI_COMM_WORLD. Также иногда может быть полезным коммуникаторMPI_COMM_SELF, определенный для каждогопроцессапараллельной программыи включающий только этотпроцесс.

Для получения группы, связанной с существующим коммуникатором, применяется функция:

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group),

где

  • comm — коммуникатор;

  • group — группа, связанная с коммуникатором.

Далее, на основе существующих групп, могут быть созданы новые группы:

  • создание новой группы newgroup из существующей группы oldgroup, которая будет включать в себя n процессов — их ранги перечисляются в массиве ranks:

int MPI_Group_incl(MPI_Group oldgroup, int n, int *ranks,

MPI_Group *newgroup),

где

  • oldgroup — существующая группа;

  • n — число элементов в массиве ranks;

  • ranks — массив рангов процессов, которые будут включены в новую группу;

  • newgroup — созданная группа;

  • создание новой группы newgroup из группы oldgroup, которая будет включать в себя n процессов, чьи ранги не совпадают с рангами, перечисленными в массиве ranks:

int MPI_Group_excl(MPI_Group oldgroup, int n, int *ranks,

MPI_Group *newgroup),

где

  • oldgroup — существующая группа;

  • n — число элементов в массиве ranks;

  • ranks — массив рангов процессов, которые будут исключены из новой группы;

  • newgroup — созданная группа.

Для получения новых групп над имеющимися группами процессовмогут быть выполнены операции объединения, пересечения и разности:

  • создание новой группы newgroup как объединения групп group1 и group2:

int MPI_Group_union(MPI_Group group1, MPI_Group group2,

MPI_Group *newgroup),

где

  • group1 — первая группа;

  • group2 — вторая группа;

  • newgroup — объединение групп;

  • создание новой группы newgroup как пересечения групп group1 и group2:

int MPI_Group_intersection(MPI_Group group1, MPI_Group group2,

MPI_Group *newgroup),

где

  • group1 — первая группа;

  • group2 — вторая группа;

  • newgroup — пересечение групп;

  • создание новой группы newgroup как разности групп group1 и group2:

int MPI_Group_difference(MPI_Group group1, MPI_Group group2,

MPI_Group *newgroup),

где

  • group1 — первая группа;

  • group2 — вторая группа;

  • newgroup — разность групп;

При конструировании групп может оказаться полезной специальная пустая группа MPI_COMM_EMPTY.

Ряд функций MPIобеспечивает получение информации о группепроцессов:

  • получение количества процессов в группе:

int MPI_Group_size(MPI_Group group, int *size),

где

  • group — группа;

  • size — число процессов в группе;

  • получение ранга текущего процесса в группе:

int MPI_Group_rank(MPI_Group group, int *rank),

где

  • group — группа;

  • size — ранг процесса в группе.

После завершения использования группа должна быть удалена:

int MPI_Group_free(MPI_Group *group),

где

  • group — группа, подлежащая удалению

(выполнение данной операции не затрагивает коммуникаторы, в которых используется удаляемая группа).