Кафедра ЮНЕСКО по НИТ1 Создание групп и коммуникаторов Параллельное программирование
Кафедра ЮНЕСКО по НИТ 2 Группы Группа представляет собой упорядоченное множество процессов. Каждый процесс идентифицируется переменной целого типа. Идентификаторы процессов образуют непрерывный ряд, начинающийся с нуля. В MPI вводится специальный тип данных MPI_Group и набор функций для работы с переменными и константами этого типа. Существует две предопределенных группы: MPI_GROUP_EMPTY- группа, не содержащая ни одного процесса; MPI_GROUP_NULL - возвращаемое значение функций, когда группа не может быть создана. Созданная группа не может быть модифицирована - расширена или усечена, может быть только создана новая группа. Интересно отметить, что при инициализации MPI не создается группы, соответствующей коммуникатору MPI_COMM_WORLD. Она должна создаваться специальной функцией явным образом.
Кафедра ЮНЕСКО по НИТ 3 Функция MPI_Comm_group comm коммуникатор области связи int MPI_Comm_group (MPI_Comm comm, MPI_Group *group) Входные параметры: Выходные параметры: group созданная группа создает группу group для множества процессов, входящих в область связи коммуникатора comm.
Кафедра ЮНЕСКО по НИТ 4 Функция MPI_Group_incl oldgroup существующая группа, на основе которой создается новая n количество процессов в новой группе ranks ранги процессов, вошедших в эту группу int MPI_Group_incl (MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup) Входные параметры: Выходные параметры: newgroup созданная группа создает новую группу newgroup из n процессов, входящих в группу oldgroup. Ранги этих процессов содержатся в массиве ranks
Кафедра ЮНЕСКО по НИТ 5 Функция MPI_Group_incl int MPI_Group_incl (MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup) создает новую группу newgroup из n процессов, входящих в группу oldgroup. Ранги этих процессов содержатся в массиве ranks В НОВУЮ группу войдут процессы с рангами ranks[0],..., ranks[n-1], причем рангу i в новой группе соответствует ранг ranks(i) в старой группе. При n = 0 создается пустая группа MPI_GROUP_EMPTY. С помощью данной функции можно не только создать новую группу, но и изменить порядок процессов в старой группе.
Кафедра ЮНЕСКО по НИТ 6 Функция MPI_Group_excl oldgroup существующая группа, на основе которой создается новая n количество удаляемых из группы процессов ranks ранги процессов, которые не войдут в группу int MPI_Group_excl (MPI_Group oldgroup, int n, int *ranks, MPI_Group *newgroup) Входные параметры: Выходные параметры: newgroup созданная группа создает группу newgroup, исключая из исходной группы (oldgroup) процессы с рангами ranks[0],..., ranks[n-1]
Кафедра ЮНЕСКО по НИТ 7 Функция MPI_Group_union group1 первая группа group2 вторая группа int MPI_Group_union (MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) Входные параметры: Выходные параметры: newgroup созданная группа формирует новую группу из всех элементов 1-й и 2-й групп (объединение множеств)
Кафедра ЮНЕСКО по НИТ 8 Функция MPI_Group_intersection group1 первая группа group2 вторая группа int MPI_Group_intersection (MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) Входные параметры: Выходные параметры: newgroup созданная группа новая группа формируется из элементов 1-й группы, которые входят также и во 2-ю. Упорядочивание, как в 1-й группе (пересечение множеств)
Кафедра ЮНЕСКО по НИТ 9 Функция MPI_Group_difference group1 первая группа group2 вторая группа int MPI_Group_difference (MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) Входные параметры: Выходные параметры: newgroup созданная группа формирует новую группу из всех элементов 1-й группы, которые не входят во 2-ю. Упорядочивание, как в 1-й группе (дополнение множеств)
Кафедра ЮНЕСКО по НИТ 10 Функция MPI_Group_size group группа int MPI_Group_size (MPI_Group group, int *size) Входные параметры: Выходные параметры: size количество процессов определяет количество (size) процессов в группе group
Кафедра ЮНЕСКО по НИТ 11 Функция MPI_Group_rank group группа int MPI_Group_rank (MPI_Group group, int *rank) Входные параметры: Выходные параметры: rank ранг процесса в данной группе (или MPI_UNDEFINED) возвращает ранг (rank) процесса в группе group Если процесс не входит в указанную группу, вторым аргументом возвращается значение MPI_UNDEFINED
MPI_Group_translate_ranks - Кафедра ЮНЕСКО по НИТ 12 Функция установки соответствия между номерами процессов в двух группах. int MPI_Group_rank (MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2) group1 группа1 n число процессов, для которых устанавливается соответствие ranks1 Массив номеров процессов из первой группы group2 группа2 Входные параметры: Выходные параметры: ranks2 номера тех же процессов во второй группе
Кафедра ЮНЕСКО по НИТ 13 Функция MPI_Group_free group уничтожаемая группа int MPI_Group_free (MPI_Group *group) Входные параметры: Выходные параметры: group указатель на пустую группу MPI_GROUP_NULL уничтожает группу group
Кафедра ЮНЕСКО по НИТ 14 Коммуникаторы Коммуникатор представляет собой скрытый объект с некоторым набором атрибутов, а также правилами его создания, использования и уничтожения. Коммуникатор описывает некоторую область связи. Одной и той же области связи может соответствовать несколько коммуникаторов, но даже в этом случае они не являются тождественными и не могут участвовать во взаимном обмене сообщениями. Если данные посылаются через один коммуникатор, процесс-получатель может получить их только через тот же самый коммуникатор. При инициализации MPI создается два предопределенных коммуникатора: MPI_COMM_WORLD – описывает область связи, содержащую все процессы; MPI_COMM_SELF – описывает область связи, состоящую из одного процесса.
Кафедра ЮНЕСКО по НИТ 15 Функция MPI_Comm_create int MPI_Comm_create (MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) Входные параметры: Выходные параметры: newcomm новый коммуникатор создает новый коммуникатор из группы group comm родительский коммуникатор group группа, для которой создается коммуникатор
Функция MPI_Comm_dup Кафедра ЮНЕСКО по НИТ 16 Функция дублирования коммуникатора int MPI_Comm_dup (MPI_Comm comm, MPI_Comm *newcomm) Входные параметры: Выходные параметры: newcomm новый коммуникатор comm родительский коммуникатор
Кафедра ЮНЕСКО по НИТ 17 Функция MPI_Comm_split int MPI_Comm_split (MPI_Comm comm, int color, int key, MPI_Comm *newcomm) Входные параметры: Выходные параметры: newcomm новый коммуникатор расщепляет группу, связанную с родительским коммуникатором, на непересекающиеся подгруппы comm родительский коммуникатор color признак подгруппы key управление упорядочиванием
Кафедра ЮНЕСКО по НИТ 18 Функция MPI_Comm_split int MPI_Comm_split (MPI_Comm comm, int color, int key, MPI_Comm *newcomm) Функция расщепляет группу, связанную с родительским коммуникатором, на непересекающиеся подгруппы по одной на каждое значение признака подгруппы color. Значение color должно быть неотрицательным. Каждая подгруппа содержит процессы с одним и тем же значением color. Параметр key управляет упорядочиванием внутри новых групп: меньшему значению key соответствует меньшее значение идентификатора процесса. В случае равенства параметра key для нескольких процессов упорядочивание выполняется в соответствии с порядком в родительской группе.
Кафедра ЮНЕСКО по НИТ 19 Функция MPI_Comm_split Алгоритм расщепления группы из восьми процессов на три подгруппы: MPI_comm comm, newcomm; int myid, color; …… MPI_Comm_rank(comm, &myid); color = myid%3; MPI_Comm_split(comm, color, myid, &newcomm); В данном примере первую подгруппу образовали процессы, номера которых делятся на 3 без остатка, вторую, для которых остаток равен 1, и третью, для которых остаток равен 2. Отметим, что после выполнения функции MPI_Comm_split значения коммуникатора newcomm в процессах разных подгрупп будут отличаться.
Кафедра ЮНЕСКО по НИТ 20 Функция MPI_Comm_free comm уничтожаемый коммуникатор int MPI_Comm_free (MPI_Comm *comm) Входные параметры: уничтожает коммуникатор comm
Кафедра ЮНЕСКО по НИТ 21 Задание 1 На основе коммуникатора MPI_Comm_world создать группу Разбить её на 2 непересекающиеся группы с помощью функций MPI_Group_incl и MPI_Group_excl. На основе этих групп создать свои коммуникаторы С помощью функции MPI_Bcast в пределах каждой группы 0-й процесс данной группы рассылает какое-нибудь свое число. Для обоих групп вывести результат пересылок на экран.
Задание 2 Для n процессов (n – произвольно) при помощи MPI_Comm_split создайте два коммуникатора: отдельно из процессов с четными и нечетными номерами. Осуществите передачу данных по кольцу внутри каждого коммуникатора. 22