магПП2013 / lec12ПП
.pptx
11
Выполнение операций передачи данных
•Парные операции – только для процессов из одного коммуникатора.
•Коллективные операции – одновременно
для всех процессов коммуникатора.
•Операции на разных коммуникаторах – независимы и не влияют друг на друга
•Создание коммуникаторов
▫Сужает область действия коллективных операций.
▫Устраняет взаимовлияние выполняемых частей программы
Лекция 12. И.Г. Захарова, кафедра ПО
12




Управление группами
•Группа создается только из уже
существующих групп.
•Исходной м.б. группа, связанная с коммуникатором по умолчанию –
MPI_COMM_WORLD.
•Для каждого процесса определен
коммуникатор MPI_COMM_SELF, включающий этот процесс.
•Можно использовать пустую группу
MPI_GROUP_EMPTY
Лекция 12. И.Г. Захарова, кафедра ПО
13




Получение группы, связанной с существующим коммуникатором:
int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
comm – коммуникатор,
group – группа, связанная с коммуникатором.
Лекция 12. И.Г. Захарова, кафедра ПО
14




Создание новой группы на основе существующей (1)
int MPI_Group_incl(MPI_Group oldgroup,int n,int *ranks,MPI_Group
*newgroup)
oldgroup – существующая группа, newgroup – созданная группа,
n – количество элементов в массиве ranks , ranks – массив, хранящий ранги процессов,
вошедших в новую группу.
Лекция 12. И.Г. Захарова, кафедра ПО
15




Создание новой группы на основе существующей (2)
int MPI_Group_excl(MPI_Group oldgroup,int n,int *ranks,MPI_Group
*newgroup)
oldgroup – существующая группа, newgroup – созданная группа,
n – количество элементов в массиве ranks , ranks – массив, хранящий ранги процессов, которые будут исключены из новой группы.
Лекция 12. И.Г. Захарова, кафедра ПО
16
Пример:
создание двух непересекающихся
групп
…
size1=size/2;
for(i=1; i<=size1; i++)
{
ranks[i]=i-1;
}
MPI_Group_incl(group, size1, ranks, group1);
MPI_Group_excl(group, size1, ranks, group2);
Лекция 12. И.Г. Захарова, кафедра ПО
17




Операции над группами
На основе существующих групп group1 и group2 может быть создана новая группа newgroup
•Объединение:
int MPI_Group_union(MPI_Group group1, MPI_Group group2,MPI_Group *newgroup);
•Пересечение:
int MPI_Group_intersection( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
•Разность:
int MPI_Group_difference( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
Лекция 12. И.Г. Захарова, кафедра ПО
18




Пример
•В группу gr1 входят процессы 0, 1, 2, 4, 5
•В группу gr2 - процессы 0, 2, 3
•Нумерация задана в группе, соответствующей
MPI_COMM_WORLD
После вызовов
MPI_Group_intersection(gr1, gr2, *newgr1); MPI_Group_union(gr1, gr2, *newgr2); MPI_Group_difference(gr1, gr2, *newgr3);
В группе newgr1 процессы 0, 2
В группе newgr2 процессы 0, 1, 2, 4, 5, 3
В группе newgr3 процессы 1, 4, 5
•Порядок нумерации процессов в новых группах соответствует порядку их перечисления
Лекция 12. И.Г. Захарова, кафедра ПО
19




Получение информации о группе
• Количество процессов в группе:
int MPI_Group_size(MPI_Group group, int *size)
group – группа,
size– количество процессов.
• Ранг текущего процесса в группе:
int MPI_Group_rank(MPI_Group group, int *rank)
group – группа,
rank– ранг процесса в группе.
Лекция 12. И.Г. Захарова, кафедра ПО
20




Удаление группы
•После завершения использования группы ее надо удалить с помощью функции:
int MPI_Group_free(MPI_Group group) group – группа.
Удаление группы не затрагивает коммуникаторы, в которых она используется.
Лекция 12. И.Г. Захарова, кафедра ПО
