diff --git a/savenkov_alexander_lab_5/.idea/.gitignore b/savenkov_alexander_lab_5/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/savenkov_alexander_lab_5/.idea/discord.xml b/savenkov_alexander_lab_5/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml b/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_5/.idea/misc.xml b/savenkov_alexander_lab_5/.idea/misc.xml new file mode 100644 index 0000000..60cb3b1 --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_5/.idea/modules.xml b/savenkov_alexander_lab_5/.idea/modules.xml new file mode 100644 index 0000000..1756967 --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml b/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/savenkov_alexander_lab_5/.idea/savenkov_alexander_lab_5.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_5/README.md b/savenkov_alexander_lab_5/README.md new file mode 100644 index 0000000..b79deef --- /dev/null +++ b/savenkov_alexander_lab_5/README.md @@ -0,0 +1,32 @@ +# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц + +Задание: + +Кратко: реализовать умножение двух больших квадратных матриц. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности. + +Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100, 300x300, 500x500 элементов. + +

+

Код
+ +

+

+

Код
+ +

+

+

Код
+ +

+

+

Работа программы
+ +

+ +Вывод: Параллельный алгоритм намного бысрее и имеет место быть если либо в матрице используются огромные числа или сама матрица намного большей размерностью + +# Видео + +Видео с разбором лабораторной работы - https://youtu.be/XfRcCUa_QMU diff --git a/savenkov_alexander_lab_5/app.py b/savenkov_alexander_lab_5/app.py new file mode 100644 index 0000000..b02223d --- /dev/null +++ b/savenkov_alexander_lab_5/app.py @@ -0,0 +1,66 @@ +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=1): + """ + Выполняет параллельное умножение матриц с использованием заданного количества потоков. + Каждый поток обрабатывает свою часть строк матрицы A. + """ + result = np.zeros_like(matrix_a) + rows, cols = matrix_a.shape + chunk_size = rows // num_threads + + def multiply_chunk(start_row, end_row): + """Умножение части матрицы A на матрицу B.""" + nonlocal result + for i in range(start_row, end_row): + result[i] = np.dot(matrix_a[i], matrix_b) + + with ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(0, rows, chunk_size): + end_row = min(i + chunk_size, rows) + futures.append(executor.submit(multiply_chunk, i, end_row)) + + for future in futures: + future.result() + + return result + +def benchmark(matrix_size, num_threads=1): + """ + Измеряет время выполнения последовательного и параллельного умножения матриц + заданного размера с использованием заданного количества потоков. + """ + matrix_a = np.random.randint(0, 10, size=(matrix_size, matrix_size)) + matrix_b = np.random.randint(0, 10, size=(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 + +if __name__ == "__main__": + matrix_sizes = [100, 300, 500] + num_threads = int(input("Введите количество потоков: ")) + + for size in matrix_sizes: + print(f"Matrix size: {size}x{size}") + sequential_time, parallel_time = benchmark(size, num_threads) + + print(f"Sequential algorithm time: {sequential_time:.6f} seconds") + print(f"Parallel algorithm time ({num_threads} threads): {parallel_time:.6f} seconds") + + print("="*30) diff --git a/savenkov_alexander_lab_5/screens/img1.png b/savenkov_alexander_lab_5/screens/img1.png new file mode 100644 index 0000000..940d45f Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img1.png differ diff --git a/savenkov_alexander_lab_5/screens/img2.png b/savenkov_alexander_lab_5/screens/img2.png new file mode 100644 index 0000000..2021c63 Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img2.png differ diff --git a/savenkov_alexander_lab_5/screens/img3.png b/savenkov_alexander_lab_5/screens/img3.png new file mode 100644 index 0000000..b77373f Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img3.png differ diff --git a/savenkov_alexander_lab_5/screens/img4.png b/savenkov_alexander_lab_5/screens/img4.png new file mode 100644 index 0000000..9156e5e Binary files /dev/null and b/savenkov_alexander_lab_5/screens/img4.png differ