Группы процессов и коммуникаторы
Создание групп процессов
Создание групп процессов
Созданию нового коммуникатора предшествует создание соответствующей группы процессов. Операции создания групп аналогичны математическим операциям над множествами:
- объединение - к процессам первой группы (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.