diff --git a/basharin_sevastyan_lab_6/README.md b/basharin_sevastyan_lab_6/README.md new file mode 100644 index 0000000..adf7379 --- /dev/null +++ b/basharin_sevastyan_lab_6/README.md @@ -0,0 +1,25 @@ +## Лабораторная работа 6. Вариант 5. +### Задание +Реализовать нахождение детерминанта квадратной матрицы. + +### Как запустить +В терминале ввести команду `python main.py` из директории с файлом. + +### Описание работы ++ `determinant_block`: Эта функция принимает квадратный блок матрицы и вычисляет его детерминант с использованием +функции `np.linalg.det` из библиотеки **NumPy**. ++ `determinant_parallel`: Эта функция разбивает исходную матрицу на квадратные блоки, а затем +использует библиотеку `multiprocessing` для распараллеливания вычислений детерминантов блоков. Она создает пул +процессов, разбивает матрицу на блоки и передает каждый блок в пул процессов для параллельного вычисления детерминанта. +Затем результаты собираются и перемножаются для получения общего детерминанта матрицы. ++ В блоке `if __name__ == "__main__"`: создается случайная матрица заданного размера, и затем функция `determinant_parallel` +вызывается с разным числом процессов `num_processes`. Замеряется время выполнения для каждого размера матрицы и +каждого числа процессов. Также измеряется время выполнения для последовательного (однопоточного) расчета детерминанта +с использованием `determinant_block`. + +### Результат работы +![](res.png "") + +### Вывод +Из результатов работы видно, что написанный алгоритм не эффективен на приведенных размерах матрицы при различном +количестве потоков. Вероятнее всего на это влияет процесс разделение квадратной матрицы на меньшие блоки для вычисления. \ No newline at end of file diff --git a/basharin_sevastyan_lab_6/main.py b/basharin_sevastyan_lab_6/main.py new file mode 100644 index 0000000..c29b41a --- /dev/null +++ b/basharin_sevastyan_lab_6/main.py @@ -0,0 +1,39 @@ +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} matrix with {p} processes took {end - start:.5f} secs") + + start = time.time() + det_seq = determinant_block(matrix) + end = time.time() + print(f"{size}x{size} matrix sequential took {end - start:.5f} secs") \ No newline at end of file diff --git a/basharin_sevastyan_lab_6/res.png b/basharin_sevastyan_lab_6/res.png new file mode 100644 index 0000000..a211ec1 Binary files /dev/null and b/basharin_sevastyan_lab_6/res.png differ