diff --git a/presnyakova_victoria_lab_6/main.py b/presnyakova_victoria_lab_6/main.py new file mode 100644 index 0000000..a8edbed --- /dev/null +++ b/presnyakova_victoria_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.prod(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/presnyakova_victoria_lab_6/readme.md b/presnyakova_victoria_lab_6/readme.md new file mode 100644 index 0000000..6bc1285 --- /dev/null +++ b/presnyakova_victoria_lab_6/readme.md @@ -0,0 +1,59 @@ +## Лабораторная работа 6. +### Задание +Реализовать нахождение детерминанта квадратной матрицы. + +### Как запустить +В терминале ввести команду `python main.py` из директории с файлом. + +### Описание работы +####Функция determinant_block: +Принимает на вход блок матрицы и вычисляет его определитель с помощью np.linalg.det. + +####Функция determinant_parallel: +Делит входную матрицу на блоки по диагонали (размер блоков определяется количеством процессов). +Использует multiprocessing.Pool для параллельного вычисления определителей этих блоков. +Вычисленные определители перемножаются для получения общего определителя матрицы. Это приближение. + +####Основной код (if __name__ == "__main__"): +Создает случайные квадратные матрицы размером 100x100, 300x300 и 500x500. +Для каждой матрицы сравнивает время вычисления определителя: +Параллельно: с использованием 2, 4 и 8 процессов. +Последовательно: вызов determinant_block для всей матрицы + +### Результат работы +100x100 matrix with 2 processes took 0.20610 secs + +100x100 matrix with 4 processes took 0.23741 secs + +100x100 matrix with 8 processes took 0.29459 secs + +100x100 matrix sequential took 0.02152 secs + +300x300 matrix with 2 processes took 1.13662 secs + +300x300 matrix with 4 processes took 0.22154 secs + +300x300 matrix with 8 processes took 0.30495 secs + +300x300 matrix sequential took 0.26311 secs + +500x500 matrix with 2 processes took 1.51184 secs + +500x500 matrix with 4 processes took 3.05409 secs + +500x500 matrix with 8 processes took 0.39279 secs + +500x500 matrix sequential took 0.28332 secs + +### Вывод +####Проблема производительности: + +Для малых матриц (100x100) последовательное вычисление работает намного быстрее, чем параллельное. Это связано с накладными расходами на создание процессов и управление их взаимодействием. +Например, для 100x100 последовательное вычисление занимает 0.02152 сек, тогда как параллельное с 8 процессами — 0.29459 сек. + +Для больших матриц (300x300, 500x500): +Параллельное выполнение с увеличением числа процессов не показывает стабильного ускорения. Это может быть связано с неэффективным делением матрицы на блоки или накладными расходами на коммуникацию между процессами. +Например, для 300x300 с 4 процессами время составляет 0.22154 сек, что лучше, чем последовательное (0.26311 сек). Однако при 2 или 8 процессах производительность хуже. + +#Ссылка на видео: +https://drive.google.com/file/d/1_h8chcro35oqFTaxSzCNjCIfacYDH9w0/view?usp=drive_link \ No newline at end of file