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:
Alexey 2023-12-28 11:07:34 +04:00
commit a5f9016bb5
6 changed files with 81 additions and 0 deletions

View 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

View 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB