degtyarev_mikhail_lab_6 is ready

This commit is contained in:
sodaler 2024-01-21 21:58:10 +04:00
parent a346187851
commit 0b5e519b93
3 changed files with 87 additions and 0 deletions

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

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