Вперед: 4.6.3. Функции работы с коммуникаторами
Назад: 4.6.1. Основные определения
К содержанию: Оглавление


4.6.2. Функции работы с группами

Функция определения числа процессов в группе MPI_Group_size

С:
MPI_Group_size(MPI_Group group, int *size)
FORTRAN:
MPI_GROUP_SIZE(GROUP, SIZE, IERROR)
INTEGER GROUP, SIZE, IERROR
IN group - группа;
OUT size - число процессов в группе.

Функция возвращает число процессов в группе. Если group = MPI_GROUP_EMPTY, тогда size = 0.

Функция определения номера процесса в группе MPI_Group_rank

С:
MPI_Group_rank(MPI_Group group, int *rank)
FORTRAN:
MPI_GROUP_RANK(GROUP, RANK, IERROR)
INTEGER GROUP, RANK, IERROR
,
IN group - группа;
OUT rank - номер процесса в группе.

Функция MPI_Group_rank возвращает номер в группе процесса, вызвавшего функцию. Если процесс не является членом группы, то возвращается значение MPI_UNDEFINED.

Функция установки соответствия между номерами процессов в двух группах MPI_Group_translate_ranks

С:
MPI_Group_translate_ranks (MPI_Group group1, int n, int *ranks1,
MPI_Group group2, int *ranks2)
FORTRAN:
MPI_GROUP_TRANSLATE_RANKS(GROUP1,N, RANKS1, GROUP2,
RANKS2, IERROR)
INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERROR
IN group1 - группа1;
IN n - число процессов, для которых устанавливается соответствие;
IN ranks1 - массив номеров процессов из 1-й группы;
IN group2 - группа2;
OUT ranks2 - номера тех же процессов во второй группе.

Функция определяет относительные номера одних и тех же процессов в двух разных группах. Если процесс во второй группе отсутствует, то для него устанавливается значениеа MPI_UNDEFINED.

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

Функция создания группы с помощью коммуникатора MPI_Comm_group

С:
MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
FORTRAN:
MPI_COMM_GROUP(COMM, GROUP, IERROR)
INTEGER COMM, GROUP, IERROR
IN comm - коммуникатор;
OUT group - группа.

Функция создает группу group для множества процессов, входящих в область связи коммуникатора comm.

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

С:
MPI_Group_union(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
MPI_Group_intersection(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
MPI_Group_difference(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERROR)
MPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERROR)
MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERROR)
INTEGER GROUP1, GROUP2,NEWGROUP, IERROR
IN group1 - первая группа;
IN group2 - вторая группа;
OUT newgroup - новая группа.

Операции определяются следующим образом:

Union - формирует новую группу из элементов 1-й группы и из элементов 2-й группы, не входящих в 1-ю (объединение множеств).
Intersection - новая группа формируется из элементов 1-й группы, которые входят также и во 2-ю. Упорядочивание как в 1-й группе (пересечение множеств).
Difference - новую группу образуют все элементы 1-й группы, которые не входят во 2-ю. Упорядочивание как в 1-й группе (дополнение множеств).

Созданная группа может быть пустой, что эквивалентно MPI_GROUP_EMPTY.

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

С:
MPI_Group_incl(MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
MPI_Group_excl(MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERROR)
MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERROR)
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR
IN group - существующая группа;
IN n - число элементов в массиве ranks;
IN ranks - массив номеров процессов;
OUT newgroup - новая группа.

Функция MPI_Group_incl создает новую группу, которая состоит из процессов существующей группы, перечисленных в массиве ranks. Процесс с номером i в новой группе есть процесс с номером ranks[i] в существующей группе. Каждый элемент в массиве ranks должен иметь корректный номер в группе group, и среди этих элементов не должно быть совпадающих.

Функция MPI_Group_excl создает новую группу из тех процессов group, которые не перечислены в массиве ranks. Процессы упорядочиваются как в группе group. Каждый элемент в массиве ranks должен иметь корректный номер в группе group, и среди них не должно быть совпадающих.

Две следующие функции по смыслу совпадают с предыдущими, но используют более сложное формирование выборки. Массив ranks заменяется двумерным массивом ranges, представляющим собой набор триплетов для задания диапазонов процессов.

С:
MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
MPI_Group *newgroup)
MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
MPI_Group *newgroup)
FORTRAN:
MPI_GROUP_RANGE_INCL(GROUP, N, RANGES, NEWGROUP, IERROR)
MPI_GROUP_RANGE_EXCL(GROUP, N, RANGES, NEWGROUP, IERROR)
INTEGER GROUP, N, RANGES(3,*), NEWGROUP, IERROR

Каждый триплет имеет вид: нижняя граница, верхняя граница, шаг.

Уничтожение созданных групп выполняется функцией MPI_Group_free.

С:
MPI_Group_free(MPI_Group *group)
FORTRAN:
MPI_GROUP_FREE(GROUP, IERROR)
INTEGER GROUP, IERROR
INOUT group - уничтожаемая группа.


Вперед: 4.6.3. Функции работы с коммуникаторами
Назад: 4.6.1. Основные определения
К содержанию: Оглавление