From 05293340a33df1df5b14b24f005cf4eb65e2490c Mon Sep 17 00:00:00 2001 From: yasha Date: Sun, 15 Dec 2024 01:36:56 +0400 Subject: [PATCH] fadeeva_nastya_lab_6 --- fadeeva_nastya_lab_6/README.md | 32 ++++++++++++++++++ fadeeva_nastya_lab_6/RVIP_lab_6.png | Bin 0 -> 62209 bytes fadeeva_nastya_lab_6/main.py | 50 ++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 fadeeva_nastya_lab_6/README.md create mode 100644 fadeeva_nastya_lab_6/RVIP_lab_6.png create mode 100644 fadeeva_nastya_lab_6/main.py diff --git a/fadeeva_nastya_lab_6/README.md b/fadeeva_nastya_lab_6/README.md new file mode 100644 index 0000000..f08a068 --- /dev/null +++ b/fadeeva_nastya_lab_6/README.md @@ -0,0 +1,32 @@ + Лабораторная работа 6. Определение детерминанта матрицы с помощью параллельных вычислений + +## Задание + +Требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять нахождение отдельной группы множителей. + + +### Описание работы программы + +Программа реализует вычисление детерминанта квадратной матрицы с использованием двух алгоритмов: *обычного и параллельного*. + +  1. Обычный алгоритм + +      Использует функцию ```numpy.linalg.det()``` для вычисления детерминанта. + +  2. Параллельный алгоритм + +      Разбивает матрицу на части и использует несколько потоков для параллельного вычисления детерминанта. Количество потоков задается вручную. Реализован с использованием библиотеки ```concurrent.futures```. + +Для каждого размера матрицы программа выводит полученные значения детерминантов и время выполнения обычного и параллельного алгоритмов. + +### Результат работы программы + +![](RVIP_lab_6.png "") + +#### Вывод + +Параллельное выполнение нахождения детерминанта может привести к ускорению, особенно на больших матрицах. Однако, для некоторых матриц, результаты детерминантов могут отличаться между обычным и параллельным выполнением. + +# Видеозапись работы программы + +https://vkvideo.ru/video186826232_456239557 \ No newline at end of file diff --git a/fadeeva_nastya_lab_6/RVIP_lab_6.png b/fadeeva_nastya_lab_6/RVIP_lab_6.png new file mode 100644 index 0000000000000000000000000000000000000000..be55818f80380e89374ce93eee0d50044873f57e GIT binary patch literal 62209 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 literal 0 HcmV?d00001 diff --git a/fadeeva_nastya_lab_6/main.py b/fadeeva_nastya_lab_6/main.py new file mode 100644 index 0000000..130e806 --- /dev/null +++ b/fadeeva_nastya_lab_6/main.py @@ -0,0 +1,50 @@ +import numpy as np +import time +import concurrent.futures + +def calculate_determinant(matrix): + return np.linalg.det(matrix) + +def calculate_determinant_parallel(matrix, num_threads): + result = 1.0 + chunk_size = matrix.shape[0] // num_threads + + def calculate_chunk(start, end): + nonlocal result + for i in range(start, end): + result *= matrix[i, i] + + with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(0, matrix.shape[0], chunk_size): + futures.append(executor.submit(calculate_chunk, i, i + chunk_size)) + + for future in concurrent.futures.as_completed(futures): + future.result() + + return result + +def benchmark(matrix_size, num_threads_list=[1, 2, 4]): + # Генерация квадратной матрицы + matrix = np.random.rand(matrix_size, matrix_size) + + # Бенчмарк для обычного нахождения детерминанта + start_time = time.time() + det_normal = calculate_determinant(matrix) + end_time = time.time() + print(f"Размер матрицы {matrix_size}x{matrix_size}") + print(f"Последовательный: Детерминант: {det_normal} Время выполнения: {end_time - start_time:.6f} секунд") + + # Бенчмарк для параллельного нахождения детерминанта + for num_threads in num_threads_list: + start_time = time.time() + det_parallel = calculate_determinant_parallel(matrix, num_threads) + end_time = time.time() + print(f"Параллельный ({num_threads} поток): Детерминант: {det_parallel} Время выполнения: {end_time - start_time:.6f} секунд") + + print() + +# Запуск бенчмарков +benchmark(100) +benchmark(300) +benchmark(500) \ No newline at end of file