From b70ce2a9afbde820badb70e1d1a3d2de569cdb4d Mon Sep 17 00:00:00 2001 From: Tyurner Date: Sun, 10 Nov 2024 18:00:17 +0400 Subject: [PATCH] turner_ilya_lab_6 is ready --- turner_ilya_lab_6/README.md | 21 +++++++++ turner_ilya_lab_6/main.py | 84 ++++++++++++++++++++++++++++++++++ turner_ilya_lab_6/results.png | Bin 0 -> 10089 bytes 3 files changed, 105 insertions(+) create mode 100644 turner_ilya_lab_6/README.md create mode 100644 turner_ilya_lab_6/main.py create mode 100644 turner_ilya_lab_6/results.png diff --git a/turner_ilya_lab_6/README.md b/turner_ilya_lab_6/README.md new file mode 100644 index 0000000..b8b6e84 --- /dev/null +++ b/turner_ilya_lab_6/README.md @@ -0,0 +1,21 @@ +# Лабораторная работа №6 - Параллельный поиск значения детерминанта матрицы +## ПИбд-42 || Тюрнер Илья + +### Цель лабораторной работы +Изучение принципов работы праллельных вычислений, когда они оправданы, а когда нет. + +### Описание: +Был реализован механизм для параллельного вычисления детерминанта матриц с возможностью задания потоков, в том числе и 1 (обычное вычисление). Был применен на матрицах размером 9x9, 10x10 и 11x11. Были сделаны замеры времени для каждого вычисления, проведен анализ и сделаны выводы. + +### Результаты: +![Изображение 1](./results.png) + +### Выводы: +При параллельном поиске детерминанта мы нацелены уменьшить временные затраты за счет увеличения числа потоков. Это действительно дает свои плоды, но есть некоторые нюансы. +Из результатов видно, что для вычисления детерминанта матрицы в одном потоке потребовалось 322 секунды, тогда как в 8 потоках время составило 142 секунды, а это значит, что мы произвели вычисления более чем вдвое быстрее. +При этом при применении такого подхода к малым вычислениям, мы наоборот можем просесть по затратам, т. к. для управления многопоточностью тоже требуются ресурсы, поэтому определять целесообразность разбиения задачи на потоки следует исходя из ее объема. +Следующий момент - это определение оптимального числа потоков, не всегда больше = лучше, ведь на менеджмент новых потоков также придется тратить ресурсы. + +### Видео с демонстрацией работы: +Размещено на платформе VK видео +https://vk.com/video303312410_456239082?t=5s \ No newline at end of file diff --git a/turner_ilya_lab_6/main.py b/turner_ilya_lab_6/main.py new file mode 100644 index 0000000..a4952a5 --- /dev/null +++ b/turner_ilya_lab_6/main.py @@ -0,0 +1,84 @@ +import random +import time +import multiprocessing +import numpy as np + +# Генерация матрицы +def generate_matrix(size): + return [[random.randint(0, 10) for _ in range(size)] for _ in range(size)] + +# Вычисление детерминанта матрицы (рекурсивно) +def determinant(matrix): + size = len(matrix) + if size == 2: + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] + + det = 0 + for col in range(size): + submatrix = [row[:col] + row[col+1:] for row in matrix[1:]] + det += ((-1) ** col) * matrix[0][col] * determinant(submatrix) + return det + +# Вычисление детерминанта параллельно +def parallel_determinant(matrix, num_processes): + size = len(matrix) + if size <= 2: + return determinant(matrix) + + # Разбиение задачи по строкам на несколько потоков + chunk_size = size // num_processes + chunks = [] + + # Создание задач для потоков + for i in range(num_processes): + start_row = i * chunk_size + end_row = (i + 1) * chunk_size if i < num_processes - 1 else size + chunks.append((matrix[start_row:end_row], i)) + + with multiprocessing.Pool(processes=num_processes) as pool: + results = pool.starmap(calculate_determinant_chunk, [(matrix, chunk[0], chunk[1]) for chunk in chunks]) + + det = sum(results) + return det + +# Вычисление детерминанта для части матрицы в одном процессе +def calculate_determinant_chunk(matrix, chunk, chunk_index): + size = len(matrix) + det = 0 + for row in chunk: + for col in range(size): + submatrix = [r[:col] + r[col+1:] for r in matrix[1:]] + det += ((-1) ** (chunk_index + col)) * matrix[0][col] * determinant(submatrix) + return det + +# Замер времени для параллельного вычисления детерминанта +def benchmark(size, num_processes=1): + matrix = generate_matrix(size) + + start_time = time.time() + parallel_determinant(matrix, num_processes) + par_time = time.time() - start_time + + return par_time + +def main(): + # Размеры матриц + matrix_sizes = [9, 10, 11] + # Количество потоков + num_processes_list = [1, 2, 4, 6, 8] + # Таблица с бенчмарками + print("-*" * 40) + print(f"{'Количество потоков':<20}{'|9x9 (сек.)':<20}{'|10x10 (сек.)':<20}{'|11x11 (сек.)'}") + print("-*" * 40) + + for num_processes in num_processes_list: + row = f"{num_processes:<20}" + + for size in matrix_sizes: + par_time = benchmark(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/turner_ilya_lab_6/results.png b/turner_ilya_lab_6/results.png new file mode 100644 index 0000000000000000000000000000000000000000..09c49abac2b6e47d5f33e6c6f65a446c326520c0 GIT binary patch literal 10089 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