МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе № 4
по дисциплине «Параллельные алгоритмы»
Тема: Группы процессов и коммуникаторы.
Студентка гр. 3384 |
|
|
Преподаватель |
|
Татаринов Ю.С. |
Санкт-Петербург
2025
Цель работы.
Изучить механизмы групп процессов и коммуникаторов в MPI и оценить влияние способа организации коллективной операции на поведение распределённой программы. Реализовать программу, которая разделяет процессы на две группы, формирует локальные значения A, выполняет пользовательскую операцию редукции и распространяет результаты всем процессам. Провести измерения времени и анализ производительности программы при различном числе процессов.
Задание. (Вариант 12)
В каждом процессе дано целое число N, которое может принимать два значения: 1 и 2 (имеется хотя бы один процесс с каждым из возможных значений). Кроме того, в каждом процессе дано вещественное число A. Используя функцию MPI_Comm_split и одну коллективную операцию редукции, найти минимальное значение среди чисел A, которые даны в процессах с N=1, и максимальное значение среди чисел A, которые даны в процессах с N=2. Найденный минимум вывести в процессах с N=1, а найденный максимум - в процессах с N=2.
Указание. Программа должна содержать единственный вызов функции MPI_Comm_split, создающий оба требуемых коммуникатора (каждый в соответствующей группе процессов).
Выполнение работы.
Описание алгоритма выполнения.
Программа инициализирует MPI и проверяет, что число процессов не меньше двух, каждый процесс получает значение N, равное 1 или 2. Каждый процесс инициализирует генератор случайных чисел с учётом ранга и времени запуска и вычисляет A в диапазоне от 0 до 100. Затем выполняется вызов MPI_Comm_split для создания коммуникатора group_comm для процессов с одинаковым N. Для редукции каждый процесс формирует массив local из двух элементов, где первый элемент local[0] содержит A, если процесс принадлежит группе N=1, иначе в него записан нейтральный элемент для операции минимума, второй элемент local[1] содержит A, если процесс в группе N=2, иначе в него записан нейтральный элемент для максимума. Далее создаётся операция minmax_op, которая сравнивает элементы массивов поэлементно, выбирая минимум для индекса ноль и максимум для индекса один. Затем выполняется MPI_Allreduce, в результате которого всем процессам доставляются значения global, где global[0] соответствует минимуму среди A процессов группы N=1, а global[1] соответствует максимуму среди A процессов группы N=2. Каждый процесс выводит свою строку, значение числа A и найденное число в соответствии с номером группы.
Графики.
На рисунке 1 показана зависимость среднего времени выполнения программы от числа процессов. Среднее время работы вычислялось как среднее на основе работы теста десять раз. По рисунку можно заметить, что с увеличением числа процессов возрастает и время работы программы. Это происходит из-за того, что полезной работы на каждый процесс мало, поэтому время определяется накладными расходами: латентностью сети, синхронизацией и затратами MPI.
Рисунок 1 – График зависимости времени выполнения программы от числа процессов
На рисунке 2 представлен график замедления функции, который демонстрирует, что при увеличении числа процессов производительность программы резко падает. Это возникает потому, что полезная работа на каждом процессе очень мала, а расходы - создание/удаление коммуникаторов, создание пользовательской операции и глобальная MPI_Allreduce - растут с числом процессов. Кроме того, флаг oversubscribe для больших p вызывает конкуренцию за CPU, что увеличивает задержки и коммуникационные затраты и в результате происходит замедление вместо ускорения.
Рисунок 2 – График замедления
Сеть Петри.
Сеть Петри для трех процессов представлена на рисунке 3. На входе для каждой ветви, соответствующей отдельному MPI процессу, находятся два ресурса: целое N и вещественное A. Место start_p и переход gen_data_p моделируют локальную подготовку данных и присвоение значений N и A. После срабатывания gen_data_p в место data_ready_p помещается токен с парой N и A, который сигнализирует о готовности процесса к коллективной фазе. Затем вызывается MPI_Comm_split, смоделированный переходом MPI_Comm_split, у которого есть входы от всех data_ready_p и который срабатывает, когда все процессы предоставили свои данные. При срабатывании MPI_Comm_split для каждого процесса токен направляется в одно из мест group_1_p или group_2_p в зависимости от значения N. После разделения у каждого процесса с соответствующим групповым местом срабатывает переход prepare_g_p, который подготавливает локальное значение A для редукции и переводит токен в место ready_p. Коллективная операция редукции моделируется переходом MPI_Allreduce с входами от всех ready_p. Этот переход срабатывает в каждой группе, когда все её члены готовы, и вычисляет минимум A для процессов с N=1 и максимум A для процессов с N=2. Найденные значения помещаются в места done_p и таким образом оказываются у всех участников соответствующих коммуникаторов. Структура сети гарантирует, что ни MPI_Comm_split, ни MPI_Allreduce не выполнятся до тех пор, пока все процессы не подготовят свои данные, и что результаты редукции будут доставлены всем процессам их групп.
Рисунок 3 – Сеть Петри
Разработанный программный код см. в Приложении А.
Тестирование программы см. в Приложении В.
