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

2
Цель работы.
Изучить коллективные функции в библиотеке MPI и их использование.
Написать параллельную программу с использованием данной функцией.
Проанализировать результаты работы с построением графика
ускорения/замедления, а также с построением сети Петри.
Задание.
Вариант 7
В каждом процессе дан набор из K + 5 целых чисел, где K – количество
процессов. Используя функцию MPI_Reduce для операции MPI_SUM,
просуммировать элементы данных наборов с одним и тем же порядковым
номером и вывести полученные суммы в главном процессе.
Выполнение работы.
Написана программа MPI с замером времени выполнения, в которой
выполняется коллективная операция суммирования между процессами.
Каждый процесс генерирует набор чисел от -10 до 10 фиксированного
размера, равного количеству процессов + 5. Затем с помощью функции
MPI_Reduce с операцией MPI_SUM собираются данные от всех процессов и
суммируются по индексам. Далее 0 процесс получает результирующий
массив, содержащий итоговые суммы по каждому индексу.
Время выполнения программы приведено в таблице 1.
Таблица 1 – Время выполнения программы на разном количестве процессов
Кол-во процессов
Время работы, с
Кол-во процессов
Время работы, с
2
0.000019
10
0.000497
3
0.000104
11
0.000720
4
0.000044
12
0.001057
5
0.000210
13
0.001401
6
0.000271
14
0.002030
7
0.000277
15
0.002809
8
0.000328
16
0.005865
9
0.000504

3
Вывод программы на 5 процессах см. рис. 1.
Рисунок 1 – Вывод программы
Анализируя вывод программы, видим, что некоторые строки выведены в
неправильном порядке. Это происходит, скорее всего, потому что объем
вычислительных операций несравнимо мал и поэтому случайные факторы
сильно сказываются на выводе программы.
Сеть Петри см. рис. 2.
Рисунок 2 – Сеть Петри
Разработанный программный код см. в приложении А.

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

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

6
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: lb4.c
#include <mpi.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;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
int array_size = num_procs + 5;
int* all = (int*) malloc(num_procs * array_size *
sizeof(int));
int* data = (int*) malloc(array_size * sizeof(int));
int* result = NULL;
// Заполнение массива разными значениями для каждого процесса
for (int i = 0; i < num_procs * array_size; i++)
all[i] = (rand() % 21) - 10;
printf("Процесс %d: ", proc_rank);
for (int i = 0; i < array_size; i++) {
data[i] = all[proc_rank * array_size + i];
printf("%d ", data[i]);
}
printf("\n");
// Процесс 0 получает результирующий массив
if (proc_rank == 0)
result = (int*) malloc(array_size * sizeof(int));
// Суммирование
time_start = MPI_Wtime();
MPI_Reduce(data, result, array_size, MPI_INT, MPI_SUM, 0,
MPI_COMM_WORLD);
time_end = MPI_Wtime();
// Вывод результатов
if (proc_rank == 0) {
printf("\nРезультат: \n");
for (int i = 0; i < array_size; i++) {
printf("%d ", result[i]);
}
printf("\n");
printf("The program has taken %lf seconds\n", time_end -
time_start);
}
free(result);

7
free(data);
free(all);
MPI_Finalize();
return 0;
}
Соседние файлы в папке Лабы по ПарАлг 2024
