diff --git a/sergeev_evgenii_lab_5/README.md b/sergeev_evgenii_lab_5/README.md new file mode 100644 index 0000000..176cd52 --- /dev/null +++ b/sergeev_evgenii_lab_5/README.md @@ -0,0 +1,36 @@ +# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц + +Задание + +Кратко: реализовать умножение двух больших квадратных матриц. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - +реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков +(число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в +рамках своей зоны ответственности + +Код: +![Alt text](images/img.png) + +Код: +![Alt text](images/img_1.png) + +Код: +![Alt text](images/img_2.png) + +Вывод программы: +![Alt text](images/img_3.png) + +Заключение + +Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100, +300x300, 500x500 элементов. + + +Вывод: Параллельный алгоритм работает намного быстрее, так как вычисления происходят в различных потоках в одно и то же +время. Его следует использовать, если в матрице присутствуют огромные числа или сама матрица большой размерности + +# Видео + +Видео с разбором лабораторной работы: +https://youtu.be/dcVWNjDzG8M \ No newline at end of file diff --git a/sergeev_evgenii_lab_5/images/img.png b/sergeev_evgenii_lab_5/images/img.png new file mode 100644 index 0000000..083c2b3 Binary files /dev/null and b/sergeev_evgenii_lab_5/images/img.png differ diff --git a/sergeev_evgenii_lab_5/images/img_1.png b/sergeev_evgenii_lab_5/images/img_1.png new file mode 100644 index 0000000..f8de560 Binary files /dev/null and b/sergeev_evgenii_lab_5/images/img_1.png differ diff --git a/sergeev_evgenii_lab_5/images/img_2.png b/sergeev_evgenii_lab_5/images/img_2.png new file mode 100644 index 0000000..449cb30 Binary files /dev/null and b/sergeev_evgenii_lab_5/images/img_2.png differ diff --git a/sergeev_evgenii_lab_5/images/img_3.png b/sergeev_evgenii_lab_5/images/img_3.png new file mode 100644 index 0000000..c7119d5 Binary files /dev/null and b/sergeev_evgenii_lab_5/images/img_3.png differ diff --git a/sergeev_evgenii_lab_5/matrix.py b/sergeev_evgenii_lab_5/matrix.py new file mode 100644 index 0000000..30d4839 --- /dev/null +++ b/sergeev_evgenii_lab_5/matrix.py @@ -0,0 +1,48 @@ +import numpy as np +import time +from concurrent.futures import ThreadPoolExecutor + + +def sequential_matrix_multiply(matrix_a, matrix_b): + return np.dot(matrix_a, matrix_b) + + +def parallel_matrix_multiply(matrix_a, matrix_b, num_threads): + result = np.zeros_like(matrix_a) + rows, cols = matrix_a.shape + + def multiply_row(row): + nonlocal matrix_a, matrix_b, result + result[row, :] = np.dot(matrix_a[row, :], matrix_b) + + with ThreadPoolExecutor(max_workers=num_threads) as executor: + executor.map(multiply_row, range(rows)) + + return result + + +def benchmark(matrix_size, num_threads=1): + matrix_a = np.random.rand(matrix_size, matrix_size) + matrix_b = np.random.rand(matrix_size, matrix_size) + + start_time = time.time() + sequential_result = sequential_matrix_multiply(matrix_a, matrix_b) + sequential_time = time.time() - start_time + + start_time = time.time() + parallel_result = parallel_matrix_multiply(matrix_a, matrix_b, num_threads) + parallel_time = time.time() - start_time + + return sequential_time, parallel_time + + +# Пример использования для матриц размером 100x100, 300x300, 500x500 элементов +matrix_sizes = [100, 300, 500] +threads_count = 4 # Указать желаемое количество потоков + +for size in matrix_sizes: + sequential_time, parallel_time = benchmark(size, threads_count) + print(f"Размер матрицы: {size}x{size}") + print(f"Время с последовательным выполнением: {sequential_time:.6f} секунд") + print(f"Время с параллельной обработкой ({threads_count} потоков): {parallel_time:.6f} секунд") + print("=" * 30)