lab 6 done
This commit is contained in:
parent
0c3e973307
commit
9995db128b
39
presnyakova_victoria_lab_6/main.py
Normal file
39
presnyakova_victoria_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.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")
|
59
presnyakova_victoria_lab_6/readme.md
Normal file
59
presnyakova_victoria_lab_6/readme.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
## Лабораторная работа 6. Вариант 5.
|
||||||
|
### Задание
|
||||||
|
Реализовать нахождение детерминанта квадратной матрицы.
|
||||||
|
|
||||||
|
### Как запустить
|
||||||
|
В терминале ввести команду `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
|
Loading…
Reference in New Issue
Block a user