Параллельное программирование: Учебное пособие, страница 106

5.3.5  Создание групп процессов

Операции создания групп процессов аналогичны математическим операциям над множествами:

·  объединениек процессам первой группы (group1) добавляются процессы второй группы (group2), не принадлежащие первой;

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

·  разность— в новую группу включаются все процессы первой группы, не входящие во вторую группу. Ранги назначаются как в первой группе.

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

Доступ к группе с именем group, связанной с коммуникатором по имени comm, можно получить, обратившись к подпрограмме  MPI_Comm_group, объявление которой выглядит так:

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)

Чтобы начать какие-либо операции с группой, к ней сначала получают доступ, поместив на место выходного параметра типа MPI_Group имя этой группы.

Создать новую группу, например, с именем newgroup, из n процессов, входящих в существующую уже группу с именем oldgroup, можно путем вызова подпрограммы MPI_Group_incl, объявление которой имеет вид:

int MPI_Group_incl(MPI_Group oldgroup, int n,

int *ranks, MPI_Group *newgroup)

Ранги процессов, которые войдут в создаваемую новую группу, содержатся в массиве ranks с рангами  ranks[0],...,ranks[n-1], причем рангу i в новой группе соответствует ранг ranks[i] в старой группе. Иными словами, от старой группы отделяются первые n элементов массива, перечисляющего ранги процессов в старой группе. Если указать n=0, то будет создана пустая группа с предопределенным именем MPI_GROUP_EMPTY. Эта подпрограмма в совокупности с ниже рассмотренными позволяет также изменить порядок процессов в старой группе.

Подпрограмма MPI_Group_excl создает группу newgroup, исключая из исходной группы oldgroup процессы с рангами ranks[0], ..., ranks[n-1], то есть формирует группу из оставшейся части процессов в массиве ranks:

int MPI_Group_excl(MPI_Group oldgroup, int n,

int *ranks, MPI_Group *newgroup)

Формально с помощью этой подпрограммы из исходного множества процессов, составлявших группу oldgroup, создается множество, которое является дополнением исключенного множества. При n=0 новая группа тождественна по составу старой, а в теоретико-множественном понимании соответствует множеству, которое называют абсолютным дополнением.

Подпрограмма MPI_Group_range_incl создает группу newgroup из группы oldgroup, помещая в нее n процессов, ранг которых указан в двумерном () массиве ranks, второе измерение которого представлено тремя значениями:

int MPI_Group_range_incl(MPI_Group oldgroup, int n,

int ranks[][3], MPI_Group *newgroup)

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

(первый_1, последний_1, шаг_1),

 ...,

(первый_n, последний_n, шаг_n).

В результате в новой группе может оказаться число процессов, равное

,

которые расположенны в порядке возрастания рангов в группеoldgroup: (первый_1, первый_1 + шаг_1, … , последний_1, первый_2, первый_2 + шаг_2,…, последний_2,…, первый_n, первый_n + шаг_n, … , последний_n). Такое перечисление позволяет перестроить существовавший порядок размещения рангов процессов в группе.

Подпрограмма MPI_Group_range_excl создает группу newgroup из группы group, исключая из нее n процессов, ранг которых указан в массиве ranks:

int MPI_Group_range_excl(MPI_Group group, int n,

int ranks[][3], MPI_Group *newgroup)

Двумерный массив ranks имеет триплетную структуру, аналогичную структуре двумерного массива в подпрограмме MPI_Group_range_incl.

Разность двух групп (group1 и group2), которая представляется разностью двух соответствующих упорядоченных множеств процессов, создается подпрограммойMPI_Group_difference, которая формирует новую группу с именем newgroup, исключает из нее одноименные ранги процессов из двух групп