basharin_sevastyan_lab_6 is ready #29

Merged
Alexey merged 1 commits from basharin_sevastyan_lab_6 into main 2023-12-05 22:38:08 +04:00
3 changed files with 64 additions and 0 deletions

View File

@ -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 "")
### Вывод
Из результатов работы видно, что написанный алгоритм не эффективен на приведенных размерах матрицы при различном
количестве потоков. Вероятнее всего на это влияет процесс разделение квадратной матрицы на меньшие блоки для вычисления.

View File

@ -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")

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB