Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 956 / 174 | Длительность: 05:14:00
Лекция 6:

Группы процессов и коммуникаторы

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

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

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

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

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

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

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

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

В подпрограммах создания групп, как правило, нельзя использовать пустой коммуникатор MPI_COMM_NULL.

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

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
MPI_Comm_group(comm, group, ierr)
    

Ее выходным параметром является группа.

Для выполнения операций с группой к ней сначала необходимо получить доступ.

Подпрограмма MPI_Group_incl создает новую группу newgroup из n процессов, входящих в группу oldgroup. Ранги этих процессов содержатся в массиве ranks:

int MPI_Group_incl(MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup)
MPI_Group_incl(oldgroup, n, ranks, newgroup, ierr)
    

В новую группу войдут процессы с рангами ranks[0], …, ranks[n — 1], причем рангу i в новой группе соответствует ранг ranks[i] в старой группе. При n = 0 создается пустая группа MPI_GROUP_EMPTY.

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

Подпрограмма MPI_Group_excl создает группу newgroup, исключая из исходной группы (group) процессы с рангами ranks[0], …, ranks[n — 1]:

int MPI_Group_excl(MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup)
MPI_Group_excl(oldgroup, n, ranks, newgroup, ierr)
    

При n = 0 новая группа тождественна старой.

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

int MPI_Group_range_incl(MPI_Group oldgroup, int n, int ranks[][3], MPI_Group *newgroup)
MPI_Group_range_incl(oldgroup, n, ranks, newgroup, ierr)
    

Массив ranks состоит из целочисленных триплетов вида (первый_1, последний_1, шаг_1), …, (первый_n, последний_n, шаг_n). В новую группу войдут процессы с рангами (по первой группе) первый_1, первый_1 + шаг_1, ….

Подпрограмма MPI_Group_difference создает новую группу (newgroup) из разности двух групп (group1) и (group2):

int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)
MPI_Group_difference(group1, group2, newgroup, ierr)
    

Подпрограмма MPI_Group_intersection создает новую группу (newgroup) из пересечения групп group1 и group2:

int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)
MPI_Group_intersection(group1, group2, newgroup, ierr)
    

Подпрограмма MPI_Group_union создает группу (newgroup), объединяя группы group1 и group2:

int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)
MPI_Group_union(group1, group2, newgroup, ierr)
    

Имеются и другие подпрограммы-конструкторы новых групп.

Деструктор группы

Вызов подпрограммы MPI_Group_free уничтожает группу group:

int MPI_Group_free(MPI_Group *group)
MPI_Group_free(group, ierr)
    

Получение информации о группе

Для определения количества процессов (size) в группе (group) используется подпрограмма MPI_Group_size:

int MPI_Group_size(MPI_Group group, int *size)
MPI_Group_size(group, size, ierr)
    

Подпрограмма MPI_Group_rank возвращает ранг (rank) процесса в группе group:

int MPI_Group_rank(MPI_Group group, int *rank)
MPI_Group_rank(group, rank, ierr)
    

Если процесс не входит в указанную группу, возвращается значение MPI_UNDEFINED.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >