diff --git a/shadaev_anton_lab_6/README.md b/shadaev_anton_lab_6/README.md new file mode 100644 index 0000000..49b3e99 --- /dev/null +++ b/shadaev_anton_lab_6/README.md @@ -0,0 +1,27 @@ +# Лабораторная работа №6 +Цель: +1. Реализовать нахождение детерминанта квадратной матрицы. + +## Запуск +Запускаем скрипт `main.py`, вывод будет консольным. + +## Код: +![img.png](img.png) + +`determinant_block`: Эта функция принимает квадратный блок матрицы и использует функцию np.linalg.det из библиотеки NumPy для вычисления его детерминанта. + +![img_1.png](img_1.png) + +`determinant_parallel`: Эта функция осуществляет разбиение исходной матрицы на квадратные блоки, а затем применяет библиотеку multiprocessing для параллельного вычисления детерминантов блоков. Путем создания пула процессов, она разделяет матрицу на блоки и передает каждый блок в пул процессов для параллельного вычисления детерминанта. После этого результаты собираются и перемножаются для получения общего детерминанта матрицы. + +![img_2.png](img_2.png) + +В блоке `if __name__ == "__main__":` генерируется случайная матрица указанного размера, после чего функция determinant_parallel вызывается с различным числом процессов (num_processes). Замеряется время выполнения для каждого размера матрицы и каждого количества процессов. Также проводится измерение времени выполнения для последовательного (однопоточного) вычисления детерминанта с использованием функции determinant_block. + +# Работа программы + +Вывод: + +![img.png](screenshots/img.png) + +Из полученных результатов видно, что реализованный алгоритм не проявляет эффективность при использовании различного числа потоков для указанных размеров матрицы. Вероятно, это связано с процессом разбиения квадратной матрицы на более мелкие блоки во время вычислений. \ No newline at end of file diff --git a/shadaev_anton_lab_6/img.png b/shadaev_anton_lab_6/img.png new file mode 100644 index 0000000..2beed20 Binary files /dev/null and b/shadaev_anton_lab_6/img.png differ diff --git a/shadaev_anton_lab_6/img_1.png b/shadaev_anton_lab_6/img_1.png new file mode 100644 index 0000000..f4850fb Binary files /dev/null and b/shadaev_anton_lab_6/img_1.png differ diff --git a/shadaev_anton_lab_6/img_2.png b/shadaev_anton_lab_6/img_2.png new file mode 100644 index 0000000..334b378 Binary files /dev/null and b/shadaev_anton_lab_6/img_2.png differ diff --git a/shadaev_anton_lab_6/main.py b/shadaev_anton_lab_6/main.py new file mode 100644 index 0000000..e213372 --- /dev/null +++ b/shadaev_anton_lab_6/main.py @@ -0,0 +1,40 @@ +import numpy as np +from multiprocessing import Pool +import time + + +def determinant_block(matrix_block): + return np.linalg.det(matrix_block) + + +def determinant_parallel(matrix, num_processes): + size = matrix.shape[0] + step = size // num_processes + + pool = Pool(processes=num_processes) + blocks = [] + for i in range(0, size, step): + blocks.append(matrix[i:i+step, i:i+step]) + + dets = pool.map(determinant_block, blocks) + return np.product(dets) + + +if __name__ == "__main__": + sizes = [100, 300, 500] + processes = [2, 4, 8] + + for size in sizes: + matrix = np.random.rand(size, size) + + for p in processes: + start = time.time() + det = determinant_parallel(matrix, p) + end = time.time() + print(f"{size}x{size} матрица с {p} процессами заняла {end - start:.5f} сек") + + start = time.time() + det_seq = determinant_block(matrix) + end = time.time() + print(f"{size}x{size} умн. последовательно заняло {end - start:.5f} сек") + print("=======================================") \ No newline at end of file diff --git a/shadaev_anton_lab_6/screenshots/img.png b/shadaev_anton_lab_6/screenshots/img.png new file mode 100644 index 0000000..a126af6 Binary files /dev/null and b/shadaev_anton_lab_6/screenshots/img.png differ