Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ПарАлг 2024 / Baraeva_Elizaveta_lb5
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по лабораторной работе №5
по дисциплине «Параллельные алгоритмы»
Тема: Группы процессов и коммуникаторы
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Татаринов Ю. С.
Санкт-Петербург
2024

2
Цель работы.
Изучить создание коммуникаторов в библиотеке MPI и их использование.
Написать параллельную программу с созданием коммуникатора для
группировки процессов и использованием операции редукции.
Проанализировать результаты работы с построением графика
ускорения/замедления, а также с построением сети Петри.
Задание.
Вариант 5
В каждом процессе дано вещественное число. Используя функцию
MPI_Comm_split и одну коллективную операцию редукции, найти
максимальное из чисел, данных в процессах с четным рангом (включая
главный процесс), и минимальное из чисел, данных в процессах с нечетным
рангом. Найденный максимум вывести в процессе 0, а найденный минимум –
в процессе 1.
Указание. Программа должна содержать единственный вызов функции
MPI_Comm_split, создающий оба требуемых коммуникатора (каждый в
соответствующей группе процессов).
Выполнение работы.
Написана программа MPI с замером времени выполнения, в которой
каждый процесс генерирует случайное вещественное число в диапазоне от -1
до 1. Затем процессы разделяются по рангу на две группы: четные и
нечетные. В каждой группе процессов выполняется операция редукции: для
четных рангов вычисляется максимум, а для нечетных рангов – минимум.
Результаты редукции собираются в процессах с рангами 0 и 1
соответственно. Процесс с рангом 0 выводит максимальное число среди
четных рангов, а процесс с рангом 1 выводит минимальное число среди
нечетных рангов.

3
Время выполнения программы приведено в таблице 1.
Таблица 1 – Время выполнения программы на разном количестве процессов
Кол-во процессов
Время работы, с
Кол-во процессов
Время работы, с
2
0.000028
10
0.000599
3
0.000095
11
0.000679
4
0.000234
12
0.000625
5
0.000370
13
0.010391
6
0.000344
14
0.019506
7
0.000482
15
0.022195
8
0.000412
16
0.035979
9
0.000540
Вывод программы на 5 процессах см. рис. 1.
Рисунок 1 – Вывод программы
Анализируя вывод программы, видим, что некоторые строки выведены в
неправильном порядке. Это происходит, скорее всего, потому что объем
вычислительных операций несравнимо мал и поэтому случайные факторы
сильно сказываются на выводе программы.
Сеть Петри см. рис. 2.

4
Рисунок 2 – Сеть Петри
S0 – разделение командой MPI_Comm_split с color равным 0. S1 –
разделение командой MPI_Comm_split с color равным 1.
Разработанный программный код см. в приложении А.
Исследование программы.
Построим график времени работы программы в зависимости от числа
запущенных процессов от 2 до 16 см. рис. 3.

5
Рисунок 3 – График времени работы программы в зависимости от числа
запущенных процессов
По графику видно, что время работы программы медленно возрастает
вместе с увеличением количества процессов до 12, а после резко. Это связано
с тем, что в процессоре устройства 12 ядер, и при использовании до 12-ти
процессов программа эффективна, а уже после эффективность теряется.
График ускорения/замедления программы см. на рис. 4.

6
Рисунок 4 – График ускорения/замедления программы
Из графика можно понять, что программа замедляется при увеличении
количества процессов. Это связано с тем, что с каждым дополнительным
процессом количество отправляемых и обрабатываемых сообщений
возрастает, что приводит к увеличению задержек.
Вывод.
В ходе лабораторной работы было изучено создание и использование
коммуникаторов. Написана программа на языке C, создающая коммуникатор
для группировки процессов для дальнейшего использования операции
редукции. Проведены замеры времени работы программы в зависимости от
количества процессов и проанализированы результаты. Построены графики
замедления/ускорения и работы программы, а также построена сеть Петри.
Также было замечено, что программа замедляется при увеличении числа
процессов. Это происходит из-за увеличения объема коммуникаций и
накладных расходов на передачу данных.

7
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: lb5.c
#include <mpi.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int proc_rank, num_procs;
double time_start = 0.0, time_end;
float number, max_even, min_odd;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
// Каждому процессу присваивается вещественное число в
дипазоне от -1 до 1
srand(time(NULL) + proc_rank);
number = (float) rand() / RAND_MAX * 2 - 1;
printf("Процесс %d: %f\n", proc_rank, number);
// Создается новый коммуникатор и считается color: 0 для
четных, 1 для нечетных рангов
MPI_Comm even_odd_comm;
int color = proc_rank % 2;
if (proc_rank == 0)
time_start = MPI_Wtime();
MPI_Comm_split(MPI_COMM_WORLD, color, proc_rank,
&even_odd_comm);
if (color == 0) {
// Процессы с четным рангом
MPI_Reduce(&number, &max_even, 1, MPI_FLOAT, MPI_MAX, 0,
even_odd_comm);
if (proc_rank == 0)
printf("Максимальное число среди четных рангов: %f\n",
max_even);
}
else {
// Процессы с нечетным рангом
MPI_Reduce(&number, &min_odd, 1, MPI_FLOAT, MPI_MIN, 0,
even_odd_comm);
if (proc_rank == 1)
printf("Минимальное число среди нечетных
рангов: %f\n", min_odd);
}
if (proc_rank == 0) {
time_end = MPI_Wtime();

8
printf("The program has taken %lf seconds\n", time_end -
time_start);
}
MPI_Finalize();
return 0;
}
Соседние файлы в папке Лабы по ПарАлг 2024
