Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ПарАлг 2024 / Baraeva_Elizaveta_lb5

.doc
Скачиваний:
1
Добавлен:
09.09.2026
Размер:
388 Кб
Скачать
☆

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

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

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

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

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

отчет

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

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

Тема: Группы процессов и коммуникаторы

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

Бараева Е. Н.

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

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

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

2024

Цель работы.

Изучить создание коммуникаторов в библиотеке MPI и их использование. Написать параллельную программу с созданием коммуникатора для группировки процессов и использованием операции редукции. Проанализировать результаты работы с построением графика ускорения/замедления, а также с построением сети Петри.

Задание.

Вариант 5

В каждом процессе дано вещественное число. Используя функцию MPI_Comm_split и одну коллективную операцию редукции, найти максимальное из чисел, данных в процессах с четным рангом (включая главный процесс), и минимальное из чисел, данных в процессах с нечетным рангом. Найденный максимум вывести в процессе 0, а найденный минимум – в процессе 1.

Указание. Программа должна содержать единственный вызов функции MPI_Comm_split, создающий оба требуемых коммуникатора (каждый в соответствующей группе процессов).

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

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

Время выполнения программы приведено в таблице 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.

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

S0 – разделение командой MPI_Comm_split с color равным 0. S1 – разделение командой MPI_Comm_split с color равным 1.

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

Исследование программы.

Построим график времени работы программы в зависимости от числа запущенных процессов от 2 до 16 см. рис. 3.

Рисунок 3 – График времени работы программы в зависимости от числа запущенных процессов

По графику видно, что время работы программы медленно возрастает вместе с увеличением количества процессов до 12, а после резко. Это связано с тем, что в процессоре устройства 12 ядер, и при использовании до 12-ти процессов программа эффективна, а уже после эффективность теряется.

График ускорения/замедления программы см. на рис. 4.

Рисунок 4 – График ускорения/замедления программы

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

Вывод.

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

ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ

Название файла: 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();

printf("The program has taken %lf seconds\n", time_end - time_start);

}

MPI_Finalize();

return 0;

}

9

Соседние файлы в папке Лабы по ПарАлг 2024