degtyarev_mikhail_lab_6 is ready #168
47
degtyarev_mikhail_lab_6/README.md
Normal file
47
degtyarev_mikhail_lab_6/README.md
Normal 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
|
BIN
degtyarev_mikhail_lab_6/img.png
Normal file
BIN
degtyarev_mikhail_lab_6/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
40
degtyarev_mikhail_lab_6/main.py
Normal file
40
degtyarev_mikhail_lab_6/main.py
Normal 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("-------------------------------")
|
Loading…
Reference in New Issue
Block a user