Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
РАСПРЕДЕЛЕННЫЕ ВЫЧИСЛЕНИЯ
ЛЕКЦИЯ 9
ГРУППЫ ПРОЦЕССОВ И ОБЛАСТИ СВЯЗИ В MPI-ПРОГРАММЕ
Когда разрабатывается большая и сложная программа со множеством процессов распределённых не только по вычислителям, но и географически; когда над
программой работает несколько программистов; или когда в программе используются библиотеки или программные компоненты разрабатываемые отдельно, то
появляется опасность запутаться в распределении действий между множественными процесса, а также запутаться (как в нитках) в передачах данных между процессами и внести в программу фатальные изъяны.
Избежать обозначенных ранее проблем можно путём формирования групп
процессов для решения тех или иных частей задачи, а также распределения передач по разным областям связи. В MPI для создания и использования групп и областей связи имеются специальные средства.
Итак, цели разделения процессов на группы, и введения дополнительных
областей связи:
1. Структурирование и ранжирование процедур передачи данных;
2. Устранение ошибок при планировании передач;
3. Предоставление возможности создания библиотечных параллельных
компонентов программ с независимыми от основной программы передачами;
4. Создание одной программы несколькими программистами;
5. Учёт структуры программы при планировании операций и передач данных;
6. Учёт топологии вычислительной системы при планировании операций и
передач данных.
Изначально, все процессы MPI-программы объединены в одну группу, для
которой создана область связи MPI_COMM_WORLD. В ходе выполнения программы возможно создавать новые группы, их объединять, разделять, удалять и
прочее. Для взаимодействия процессов друг с другом (в частности, для передачи
данных) в рамках каждой группы создаётся область связи называемая интракоммуникатором. Группы процессов могут пересекаться друг с другом. Одновременно, каждый процесс может входить в несколько групп. В каждой группе и в каж1
дой области связи, в которые входит процесс, у него имеется собственный идентификатор (номер). Узнать свой номер в группе процесс может с помощью функции MPI_Group_rank, а номер в области связи процесс может узнать с помощью
функции MPI_Comm_rank. На рис. 1 показан пример. Для взаимодействия все девять процессов изначально были объединены общей областью связи
MPI_COMM_WORLD и каждый процесс получил в ней свой номер (от 0, до 8).
Потом была создана область связи COMM1 объединяющая те же девять процессов, но в ней они пронумерованы в обратном порядке. Также были созданы области связи COMM2 и COMM3. В них входят разные процессы. Один из процессов
входит во все четыре области связи и имеет в каждой из них свой номер.
MPI_COMM_WORLD
5 4
1
1
7
7 1
2
COMM3
4 5
0 8
2
63
30
8 0
3
COMM2
3 6
1
2
6
COMM1
Рис. 1. Процессы и области связи
Создание групп процессов и областей связи для них ещё полезно тем, что
функции коллективных передач действуют в рамках одной из областей связи. То
есть, если есть необходимость, чтобы в коллективных операциях, например с использованием функций MPI_Barrier, MPI_Bcast, MPI_Scatter и пр, участвовали не
все процессы программы, а только их часть, то эти выбранные процессы можно
выделить в отдельную группу и только в рамках этой группы выполнять коллективное взаимодействие.
2
Кроме областей связи для групп процессов, можно создавать области связи
для взаимодействия лидеров разных групп. Они называются интеркоммуникаторами.
Группы процессов
Идентификатор группы имеет тип MPI_Group. С группами процессов можно
выполнять следующие операции:
1. Создание групп;
2. Получение информации о группе;
3. Объединение групп;
4. Пересечение групп;
5. Разность групп;
6. Создание области связи на основе группы;
7. Удаление группы.
Функции создания и получения информации о группе:
1. Доступ к группе связанной с областью связи («создание группы»)
int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
comm – идентификатор области связи
group – идентификатор группы связанной с областью связи comm
2. Получение текущего числа процессов в группе
int MPI_Group_size(MPI_Group group, int *size)
3. Получение номера процесса в группе
int MPI_Group_rank(MPI_Group group, int *rank)
4. Относительная нумерация процессов в двух разных группах
int MPI_Group_translate_rank( MPI_Group group1, int n, int *ranks1,
MPI_Group group2, int *ranks2)
5. Сравнение групп на совпадение наборов процессов
int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int
*result)
result – результат сравнения (константа равенства MPI_SIMILAR, константа неравенства MPI_UNEQUAL)
Создание, объединение, пересечение и разность групп
1. Создание новой группы процессов из n процессов имеющийся группы
int MPI_Group_incl(MPI_Group oldgroup, int n, int *ranks,
MPI_Group *newgroup)
2. Объединение двух групп group1 и group2 процессов
int MPI_Group_union(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
3. Исключение процессов из группы oldroup
3
int MPI_Group_excl(MPI_Group oldgroup, int n, int *ranks, MPI_Group
*newgroup)
4. Создание новой группы из разности двух старых
int MPI_Group_difference(MPI_Group group1,MPI_Group group2,
MPI_Group *newgroup)
5. Создание новой группы из пересечения двух старых
int MPI_Group_intersection(MPI_Group group1,MPI_Group group2,
MPI_Group *newgroup)
Добавление и удаление процессов, удаление группы
1. Подсоединение n процессов к имеющейся группе
int MPI_Group_range_incl(MPI_Group oldgroup, int n, int *ranks,
MPI_Group *newgroup)
2. Исключение n процессов из имеющейся группы
int MPI_Group_range_excl(MPI_Group oldgroup, int n, int *ranks,
MPI_Group *newgroup)
Примечание:
Массив ranks в обоих случаях состоит из триплетов вида: [первый1,последний1,шаг1],[первый2,последний2,шаг2] ……..
3. Удаление группы
int MPI_Group_free(MPI_Group *group)
Подробнее о группах процессов можно почитать здесь (примеры на Фортране):
https://parallel.ru/sites/default/files/info/parallel/antonov/groups.pdf
и здесь:
http://cdot-nntu.ru/basebook/parallelnoe_programmirovanie/files/assets/basichtml/page67.html
Области связи
Идентификатор группы имеет тип MPI_Comm. Ещё раз отметим, что области связи бывают двух типов
1.
Интракоммуникаторы. К этому типу относятся области связи, служащие для передачи данных между процессами одной группы. Передавать
данные в рамках интракоммуникатора могут все процессы группы.
MPI_COMM_WORLD главный интракоммуникатор.
2.
Интеркоммуникаторы. К этому типу относятся области связи, служащие для передачи данных между процессами лидерами разных групп. Передавать данные в рамках интеркоммуникатора могут только лидеры групп.
В нашей лекции они рассматриваться не будут.
4
Операции с интракоммуникаторами:
1. Создание;
2. Получение информации о процессах;
3. Тестирование;
4. Разделение;
5. Создание топологий процессов;
6. Удаление.
Создание и удаление интракоммуникаторов
1) Дублирование имеющейся области связи
int MPI_Comm_dup(MPI_Comm oldcomm, MPI_Comm newcomm)
2) Создание области связи из подмножества процессов group другой области связи
int MPI_Comm_create (MPI_Comm oldcomm, MPI_Group group,
MPI_Comm newcomm)
3) Удаление области связи
int MPI_Comm_free(MPI_Comm comm)
Получение информации о процессах в интракоммуникаторах
1) Получение числа процессов в области связи
int MPI_Comm_size(MPI_Comm comm, int size)
2) Получение номера процесса в области связи
int MPI_Comm_rank(MPI_Comm comm, int rank
Создание новых областей связи путём разделения процессов старой
int MPI_Comm_split(MPI_Comm oldcomm, int color, int n_rank,
MPI_Comm *newcomm )
oldcomm – идентификатор исходной области связи
color – признак объединения процессов в новую область связи (процессы, у
которых этот параметр совпадает объединяются в одну область)
n_rank – параметр, задающий порядок присвоения номеров процессам в новых областях связи (у кого этот параметр больше, тот получит больший номер в
новой области связи)
newcomm – идентификатор новой области связи
Подробнее об применении MPI_Comm_split:
https://vunivere.ru/work25974/page109
https://web-answers.ru/c/objasnenie-mpi-comm-split.html
http://cdot-nntu.ru/basebook/parallelnoe_programmirovanie/files/assets/basichtml/page70.html
Ещё: https://www.intuit.ru/studies/courses/4447/983/lecture/14927?page=7
5