diff --git a/sergeev_evgenii_lab_6/README.md b/sergeev_evgenii_lab_6/README.md new file mode 100644 index 0000000..45434bb --- /dev/null +++ b/sergeev_evgenii_lab_6/README.md @@ -0,0 +1,32 @@ +# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений + +Задание: + +Кратко: реализовать нахождение детерминанта квадратной матрицы. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - +реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков +(число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы +множителей + +Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером +100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете. + +Код: +![Alt text](images/img.png) + +Код: +![Alt text](images/img_1.png) + +Код: +![Alt text](images/img_2.png) + +Вывод: + +С увеличением количества потоков параллельный способ работает быстрее. При меньшем количестве потоков обычный способ +обрабатывает задачу эффективнее + +# Видео + +Видео с разбором лабораторной: +https://youtu.be/ty9KQNjDrWM diff --git a/sergeev_evgenii_lab_6/images/img.png b/sergeev_evgenii_lab_6/images/img.png new file mode 100644 index 0000000..1f6c732 Binary files /dev/null and b/sergeev_evgenii_lab_6/images/img.png differ diff --git a/sergeev_evgenii_lab_6/images/img_1.png b/sergeev_evgenii_lab_6/images/img_1.png new file mode 100644 index 0000000..d16dc45 Binary files /dev/null and b/sergeev_evgenii_lab_6/images/img_1.png differ diff --git a/sergeev_evgenii_lab_6/images/img_2.png b/sergeev_evgenii_lab_6/images/img_2.png new file mode 100644 index 0000000..cbf569c Binary files /dev/null and b/sergeev_evgenii_lab_6/images/img_2.png differ diff --git a/sergeev_evgenii_lab_6/matrix.py b/sergeev_evgenii_lab_6/matrix.py new file mode 100644 index 0000000..0dfbab3 --- /dev/null +++ b/sergeev_evgenii_lab_6/matrix.py @@ -0,0 +1,58 @@ +import numpy as np +import time +from concurrent.futures import ThreadPoolExecutor + + +def sequential_determinant(matrix): + return np.linalg.det(matrix) + + +def parallel_determinant(matrix, num_threads): + determinant = 1.0 + n = len(matrix) + + def calculate_partial_determinant(start, end): + nonlocal determinant + for i in range(start, end): + determinant *= matrix[i, i] + + with ThreadPoolExecutor(max_workers=num_threads) as executor: + chunk_size = n // num_threads + futures = [] + + for i in range(0, n, chunk_size): + start = i + end = min(i + chunk_size, n) + futures.append(executor.submit(calculate_partial_determinant, start, end)) + + # Wait for all threads to finish + for future in futures: + future.result() + + return determinant + + +def benchmark(matrix_size, num_threads=1): + matrix = np.random.rand(matrix_size, matrix_size) + + start_time = time.time() + sequential_result = sequential_determinant(matrix) + sequential_time = time.time() - start_time + + start_time = time.time() + parallel_result = parallel_determinant(matrix, num_threads) + parallel_time = time.time() - start_time + + return sequential_time, parallel_time + + +# Пример использования для матриц размером 100x100, 300x300, 500x500 элементов +matrix_sizes = [100, 300, 500] +num_threads = 1 # Указать желаемое количество потоков + +for size in matrix_sizes: + sequential_time, parallel_time = benchmark(size, num_threads) + print(f"Размер матрицы: {size}x{size}") + print(f"Время с последовательным выполнением: {sequential_time:.6f} секунд") + print(f"Время с параллельной обработкой ({num_threads} потоков): {parallel_time:.6f} секунд") + print("=" * 30)