Merge pull request 'basharin_sevastyan_lab_6 is ready' (#29) from basharin_sevastyan_lab_6 into main
Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/29
This commit is contained in:
commit
6699354369
25
basharin_sevastyan_lab_6/README.md
Normal file
25
basharin_sevastyan_lab_6/README.md
Normal 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 "")
|
||||||
|
|
||||||
|
### Вывод
|
||||||
|
Из результатов работы видно, что написанный алгоритм не эффективен на приведенных размерах матрицы при различном
|
||||||
|
количестве потоков. Вероятнее всего на это влияет процесс разделение квадратной матрицы на меньшие блоки для вычисления.
|
39
basharin_sevastyan_lab_6/main.py
Normal file
39
basharin_sevastyan_lab_6/main.py
Normal 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")
|
BIN
basharin_sevastyan_lab_6/res.png
Normal file
BIN
basharin_sevastyan_lab_6/res.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
Loading…
Reference in New Issue
Block a user