diff --git a/karamushko_maxim_lab_5/README.md b/karamushko_maxim_lab_5/README.md new file mode 100644 index 0000000..559c5e9 --- /dev/null +++ b/karamushko_maxim_lab_5/README.md @@ -0,0 +1,17 @@ +# Лабораторная работа №5 - Параллельное перемножение матриц +## ПИбд-42 || Карамушко Максим + +### Цель лабораторной работы +Изучить приципы работы с параллельными вычислениями и узнать насколько они оправданы в зависимости от объемов вычислений. + +### Описание: +В данной лабораторной работе было реализовано параллельное перемножение матриц различных размеров (100x100, 300x300 и 500x500). Помимо этого были сделаны замеры времени выполнения в зависимости от количества потоков и размеров матриц. + +### Результаты: +![Изображение 1](./result.png) + +### Выводы: +Распараллеливание вычислений дает хороший прирост производительности для больших матриц, однако для маленьких матриц с увеличением числа потоков в какой-то момент расходы ресурсов на создание потоков и параллельные вычисления лишь увеличивают время вычислений. + +### Видео с демонстрацией работы: +https://disk.yandex.ru/i/1a4-VeWhXP8gtQ \ No newline at end of file diff --git a/karamushko_maxim_lab_5/main.py b/karamushko_maxim_lab_5/main.py new file mode 100644 index 0000000..728626f --- /dev/null +++ b/karamushko_maxim_lab_5/main.py @@ -0,0 +1,57 @@ +import random +import time +import multiprocessing + +# Генерация матрицы +def matrix_generate(size): + return [[random.randint(0, 50) for _ in range(size)] for _ in range(size)] + +# Умножение строк +def row_multi(i, A, B, result): + size = len(A) + for j in range(size): + for k in range(size): + result[i][j] += A[i][k] * B[k][j] + +# параллельное умножение с помощью multiprocessing +def matrix_mulit_parallel(A, B, num_processes): + size = len(A) + result = [[0] * size for _ in range(size)] + + with multiprocessing.Pool(processes=num_processes) as pool: + pool.starmap(row_multi, [(i, A, B, result) for i in range(size)]) + + return result + +# Замер времени +def measure_time(size, num_processes=1): + A = matrix_generate(size) + B = matrix_generate(size) + + start_time = time.time() + matrix_mulit_parallel(A, B, num_processes) + par_time = time.time() - start_time + + return par_time + +def main(): + # Размеры матриц + matrix_sizes = [100, 300, 500] + # Количество потоков + num_processes_list = [1, 2, 4, 6, 8] + # Таблица с замерами времени + print("-*" * 40) + print(f"{'Количество потоков':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}") + print("-*" * 40) + + for num_processes in num_processes_list: + row = f"{num_processes:<20}" + + for size in matrix_sizes: + par_time = measure_time(size, num_processes) + row += f"|{par_time:.4f}".ljust(20) + print(row) + print("-*" * 40) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/karamushko_maxim_lab_5/result.png b/karamushko_maxim_lab_5/result.png new file mode 100644 index 0000000..a528df4 Binary files /dev/null and b/karamushko_maxim_lab_5/result.png differ