Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
па-пми / лр-4.docx
Скачиваний:
0
Добавлен:
10.06.2026
Размер:
207.79 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе № 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 – Сеть Петри

Разработанный программный код см. в Приложении А.

Тестирование программы см. в Приложении В.

Соседние файлы в папке па-пми