Merge pull request 'gusev_vladislav_lab_6 is ready' (#64) from gusev_vladislav_lab_6 into main
Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/64
This commit is contained in:
commit
a5f9016bb5
35
gusev_vladislav_lab_6/README.md
Normal file
35
gusev_vladislav_lab_6/README.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Лабораторная работа №6 - Параллельный поиск значения детерминанта матрицы
|
||||
|
||||
1) Реализовать алгоритм последовательного вычисления детерминанта матрицы
|
||||
2) Реализовать алгоритм параллельного вычисления детерминанта матрицы
|
||||
|
||||
# Как запустить
|
||||
Выполняем файл gusev_vladislav_lab_5.py, решение будет в консоли.
|
||||
|
||||
|
||||
# Методы:
|
||||
Для последовательного умножения матриц используется следующий метод:
|
||||
|
||||
![img.png](images%2Fimg.png)
|
||||
|
||||
Для параллельного следующие методы:
|
||||
|
||||
![img_1.png](images%2Fimg_1.png)
|
||||
|
||||
Для тестов соответственно:
|
||||
|
||||
![img_2.png](images%2Fimg_2.png)
|
||||
|
||||
|
||||
# Работа программы
|
||||
|
||||
Запускаем программу, получаем следующее:
|
||||
|
||||
![img_3.png](images%2Fimg_3.png)
|
||||
|
||||
Как видно по числам, параллельное умножение проиграло во всевозможных тестах, что может говорить
|
||||
о том, что задача плохо распараллеливается.
|
||||
|
||||
|
||||
|
||||
Видео -> https://drive.google.com/file/d/1tMRk8QETnIHlVxT02aSRbpFFEYCVTrHV/view?usp=sharing
|
46
gusev_vladislav_lab_6/gusev_vladislav_lab_6.py
Normal file
46
gusev_vladislav_lab_6/gusev_vladislav_lab_6.py
Normal file
@ -0,0 +1,46 @@
|
||||
import time
|
||||
import random
|
||||
from scipy.linalg import det
|
||||
from multiprocessing import Pool
|
||||
|
||||
def sequential_matrix_determinant(matrix):
|
||||
return det(matrix)
|
||||
|
||||
def parallel_matrix_determinant_worker(args):
|
||||
matrix, row_start, row_end = args
|
||||
submatrix = [row[:min(row_end - row_start, len(matrix[0]))] for row in matrix[row_start:row_end]]
|
||||
return det(submatrix)
|
||||
|
||||
def parallel_matrix_determinant(matrix, num_processes=2):
|
||||
num_rows = len(matrix)
|
||||
chunk_size = num_rows // num_processes
|
||||
pool = Pool(processes=num_processes)
|
||||
results = pool.map(parallel_matrix_determinant_worker, [(matrix, i * chunk_size, (i + 1) * chunk_size) for i in range(num_processes)])
|
||||
pool.close()
|
||||
pool.join()
|
||||
return results[0]
|
||||
|
||||
def run_determinant_test(matrix_size, num_processes=2):
|
||||
matrix = [[random.random() for _ in range(matrix_size)] for _ in range(matrix_size)]
|
||||
|
||||
start_time = time.time()
|
||||
result_sequential = sequential_matrix_determinant(matrix)
|
||||
sequential_time = time.time() - start_time
|
||||
print(f"Sequential determinant calculation time ({matrix_size}x{matrix_size}): {sequential_time} seconds")
|
||||
print(f"Sequential determinant result: {result_sequential}")
|
||||
|
||||
start_time = time.time()
|
||||
result_parallel = parallel_matrix_determinant(matrix, num_processes)
|
||||
parallel_time = time.time() - start_time
|
||||
print(f"Parallel determinant calculation time ({matrix_size}x{matrix_size}) with {num_processes} processes: {parallel_time} seconds")
|
||||
print(f"Parallel determinant result: {result_parallel} \n")
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Тесты для квадратных матриц размером 100x100, 300x300 и 500x500 с разным числом процессов
|
||||
run_determinant_test(100, num_processes=2)
|
||||
run_determinant_test(100, num_processes=4)
|
||||
run_determinant_test(300, num_processes=2)
|
||||
run_determinant_test(300, num_processes=4)
|
||||
run_determinant_test(500, num_processes=2)
|
||||
run_determinant_test(500, num_processes=4)
|
||||
|
BIN
gusev_vladislav_lab_6/images/img.png
Normal file
BIN
gusev_vladislav_lab_6/images/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.0 KiB |
BIN
gusev_vladislav_lab_6/images/img_1.png
Normal file
BIN
gusev_vladislav_lab_6/images/img_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
gusev_vladislav_lab_6/images/img_2.png
Normal file
BIN
gusev_vladislav_lab_6/images/img_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
gusev_vladislav_lab_6/images/img_3.png
Normal file
BIN
gusev_vladislav_lab_6/images/img_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 102 KiB |
Loading…
Reference in New Issue
Block a user