diff --git a/degtyarev_mikhail_lab_6/README.md b/degtyarev_mikhail_lab_6/README.md new file mode 100644 index 0000000..4410d67 --- /dev/null +++ b/degtyarev_mikhail_lab_6/README.md @@ -0,0 +1,47 @@ +# Лабораторная 6 +## Вариант 9 + +## Задание +Кратко: реализовать нахождение детерминанта квадратной матрицы. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять нахождение отдельной группы множителей. + +## Описание Программы + +### Алгоритмы: + +**Базовый алгоритм** + +Он работает, с помощью уже встроенной функции из библиотеки numpy + +``` +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) +``` + +## Результат + +Был проведен замер времени работы алгоритмов для каждого типа матрицы: 100x100, 300x300, 500x500 с разным количеством процессов + +![](img.png) + +Из скриншота выше видно, что для каждого типа матрицы оказалось быстрее выполнение последовательно, причем гораздо. + + +Ссылка на видео: https://vk.com/video151119348_456239203?list=ln-GQ61rRxQRWzAoVg2SZ \ No newline at end of file diff --git a/degtyarev_mikhail_lab_6/img.png b/degtyarev_mikhail_lab_6/img.png new file mode 100644 index 0000000..ea34583 Binary files /dev/null and b/degtyarev_mikhail_lab_6/img.png differ diff --git a/degtyarev_mikhail_lab_6/main.py b/degtyarev_mikhail_lab_6/main.py new file mode 100644 index 0000000..eca1924 --- /dev/null +++ b/degtyarev_mikhail_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("-------------------------------")