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

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

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

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

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

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

отчет

по лабораторной работе № 5

по дисциплине «Параллельные алгоритмы»

Тема: Виртуальные топологии.

Студентка гр. 3384

Преподаватель

Татаринов Ю.С.

Санкт-Петербург

2025

Цель работы.

Разработать модель обмена целыми числами в заданной виртуальной графовой топологии, где чётные процессы образуют цепочку, а нечётные подключены к предыдущему чётному. Реализовать рассылку значения каждого процесса всем его соседям с последующим упорядоченным по рангам выводом полученных значений. Провести тестирование при разных числах процессов, замеры времени выполнения и построение графиков производительности, а также нарисовать сеть Петри.

Задание. (Вариант 12)

Число процессов K является четным: K = 2N (1<N<6); в каждом процессе дано целое число A. Используя функцию MPI_Graph_create, определить для всех процессов топологию графа, в которой все процессы четного ранга (включая главный процесс) связаны в цепочку: 0-2-4-6-…-(2N−2), а каждый процесс нечетного ранга R (1,3,…,2N−1) связан с процессом ранга R-1 (в результате каждый процесс нечетного ранга будет иметь единственного соседа, первый и последний процессы четного ранга будут иметь по два соседа, а остальные - «внутренние» - процессы четного ранга будут иметь по три соседа). Переслать число A из каждого процесса всем процессам-соседям. Для определения количества процессов-соседей и их рангов использовать функции MPI_Graph_neighbors_count и MPI_Graph_neighbors, пересылку выполнять с помощью функции MPI_Sendrecv. Во всех процессах вывести полученные числа в порядке возрастания рангов переславших их процессов.

Выполнение работы.

Описание алгоритма выполнения.

Алгоритм реализован для чётного числа процессов и нацелен на построение графовой топологии, в которой все процессы с чётными рангами образуют цепочку с шагом два, а каждый нечётный процесс подключён к предыдущему чётному. Сначала происходит инициализация окружения через MPI_Init, и каждый процесс получает общее число процессов и свой ранг с помощью MPI_Comm_size и MPI_Comm_rank, после чего проверяется условие чётности общего числа процессов и при несоответствии выполняется завершение через MPI_Finalize. Для формирования виртуальной топологии формируется представление графа в формате, требуемом MPI_Graph_create, то есть для каждой вершины определяется количество соседей, и в одном массиве перечисляются все их ранги. Затем создаётся новый коммуникатор с помощью MPI_Graph_create при параметре, отключающем перестройку рангов, чтобы сохранить соответствие между рангами. Внутри нового коммуникатора каждому процессу назначается целое значение для последующей проверки корректности обменов. Далее, с помощью MPI_Graph_neighbors_count определяется количество соседей у текущего процесса, и через MPI_Graph_neighbors извлекаются их ранги. Обмен выполняется последовательными парными операциями MPI_Sendrecv с каждым соседом, что обеспечивает одновременную отправку и приём. Полученные значения объединяются вместе с метками рангов отправителей, чтобы потом вывести их в упорядоченном по рангу виде. Для вывода производится сортировка пар рангов и соответствующих значений по возрастанию ранга отправителя, после чего каждый процесс печатает своё значение и значения, полученные от соседей, в порядке возрастания рангов отправивших процессов. В завершение освобождаются выделенные ресурсы, происходит закрытие графового коммуникатора через MPI_Comm_free и вызывается MPI_Finalize, что обеспечивает корректное завершение работы приложения.

Графики.

На рисунке 1 показана зависимость среднего времени выполнения программы от числа процессов. Среднее время работы вычислялось как среднее на основе работы теста десять раз. Рост времени выполнения на графике объясняется увеличением накладных расходов и задержек при взаимодействии процессов. С ростом числа процессов возрастает количество коммуникаций, что приводит к накоплению этих задержек. Кроме того, при большом числе процессов возможна конкуренция за ресурсы процессора, если процессов больше, чем физических ядер, а также дополнительные задержки при одновременном выводе данных всеми процессами. Также можно отметить, что основной вклад во увеличение времени выполнения дают операции, связанные с функциями MPI_Graph_create, MPI_Sendrecv и синхронным выводом, так как именно они создают и обслуживают коммуникацию между процессами.

Рисунок 1 – График зависимости времени выполнения программы от числа процессов

На рисунке 2 представлен график замедления функции, который демонстрирует, что при увеличении числа процессов производительность программы резко падает. Это возникает потому, что высокие затраты на запуск сообщений и сетевая латентность становятся доминирующими при росте числа процессов, поскольку объём полезной работы остаётся маленьким. А виртуальная топология создаёт дисбаланс, так как чётные ранги имеют до трёх соседей и выполняют больше обменов, что увеличивает время ожидания синхронных коммуникаций. MPI_Sendrecv выполняется блокирующим образом, приводя к частичной сериализации обменов и дополнительным задержкам при увеличении числа связей. Рост числа сообщений повышает конкуренцию за сетевые ресурсы и за CPU при запуске с `--oversubscribe`, что ухудшает масштабирование. Фиксированные накладные расходы на создание графового коммуникатора и вызовы MPI_Graph_neighbors при малом объёме передаваемых данных начинают доминировать, в результате наблюдается суммарное замедление.

Рисунок 2 – График замедления

Сеть Петри.

Сеть Петри для четырех процессов представлена на рисунке 3. В сети есть места P{i} и связанные с ними переходы Init{i}, которые моделируют локальную подготовку процесса. Когда срабатывает Init{i}, токен перемещается в Ready{i}, что означает готовность процесса к обменам. Для каждой пары соседних процессов u и v используются места Ready_u и Ready_v и один общий переход Exchange_u_v, который забирает токены готовности у обоих процессов и одновременно создаёт токены в местах Recv_u_from_v и Recv_v_from_u, что отражает получение сообщений каждым из участников обмена. Места Recv_i_from_j служат входами для дальнейшей обработки, а переход Process{i} подключён ко всем таким приёмным местам процесса i, который срабатывает только тогда, когда получены все нужные токены, после чего создаёт токен в месте Result{i}. Места Result{i} показывают, что процесс завершил обмены и обработку данных.

Рисунок 3 – Сеть Петри

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

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

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