
ПРО-432_ЛР3_ПВ
.docxМинистерство науки и образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Кафедра вычислительной математики и кибернетики
ОТЧЁТ
По лабораторной работе №3
«ПАРАЛЛЕЛЬНОЕ ВЫЧИСЛЕНИЕ СУММЫ ЧИСЛОВОГО РЯДА СРЕДСТВАМИ MPI»
по дисциплине «Параллельные вычисления»
Выполнили:
студент группы ПРО-429
Видманов А. А., Ихсанова А. А.,
Мустафин А. А.
Проверила:
проф. каф. ВМИК,
канд. физ.-мат. наук Шерыхалина Н.М.
Уфа — 2024 г.
Цель работы
Для многопроцессорных вычислительных систем с распределенной памятью на примере задачи параллельного вычисления суммы числового научиться программно реализовывать простейшие параллельные вычислительные алгоритмы и проводить анализ их эффективности.
Ход работы
Была выполнена программная реализация на языке С последовательного алгоритма суммирования функционального ряда согласно 9 варианту. Предусмотрели вывод на экран времени работы программы.
#include <stdio.h>
#include <mpi.h>
int main(int argc, char** argv) {
int rank, size;
int N;
double local_sum = 0.0, global_sum = 0.0;
double start_time, end_time;
// Инициализация MPI
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Ввод количества членов ряда
if (rank == 0) {
printf("Введите количество членов ряда N: ");
scanf("%d", &N);
start_time = MPI_Wtime(); // Запуск таймера
}
// Рассылка N всем процессам
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
// Вычисление локальной суммы
for (int i = rank; i < N; i += size) {
local_sum += 1.0 / (i + 1);
}
// Суммирование результатов всех процессов
MPI_Reduce(&local_sum, &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
// Вывод результата
if (rank == 0) {
end_time = MPI_Wtime(); // Остановка таймера
printf("Сумма ряда 1/n для N = %d равна %.15f\n", N, global_sum);
printf("Время выполнения: %f секунд\n", end_time - start_time);
}
// Завершение MPI
MPI_Finalize();
return 0;
}
Для каждой программы последовательно просчитали варианты запуска на 1, 2, 4, 6, 8 процессорах, выбрали N так, чтобы время работы на одном процессоре T1 в первом случае составляло порядка 15 с (N = N1 = 58 000 000):
на 2-х процессорах:
на 4-х:
на 6-сти:
на 8-ми:
Для второго случая, чтобы время работы последовательной работы одного процессора составляло 30–40 с (N = N2), подобрали значение N = 140 000 000.
По полученным результатам выполнения программы составили таблицу:
p |
Tp, c |
|
N1 |
N2 |
|
1 |
15,322 |
37,077 |
2 |
7,764 |
20,059 |
4 |
3,83 |
10,086 |
6 |
2,56 |
6,36 |
8 |
1,93 |
4,668 |
Вычислили ускорение и эффективность и занесли данные в таблицу:
p |
S*p |
E*p |
||
N1 |
N2 |
N1 |
N2 |
|
1 |
1 |
1 |
1 |
1 |
2 |
1,97346728 |
1,84839723 |
0,98673364 |
0,92419861 |
4 |
4,00052219 |
3,67608566 |
1,00013055 |
0,91902142 |
6 |
5,98515625 |
5,82971698 |
0,99752604 |
0,9716195 |
8 |
7,9388601 |
7,94280206 |
0,99235751 |
0,99285026 |
По данным ускорения был построен график зависимости S*p1 и S*p2:
По данным эффективности E*p1 и E*p2:
Вывод
В ходе выполнения лабораторной работы мы научились программно реализовывать простейшие параллельные вычислительные алгоритмы и проводить анализ их эффективности на примере задачи параллельного вычисления суммы числового.