diff --git a/gusev_vladislav_lab_6/README.md b/gusev_vladislav_lab_6/README.md new file mode 100644 index 0000000..64e08f4 --- /dev/null +++ b/gusev_vladislav_lab_6/README.md @@ -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 diff --git a/gusev_vladislav_lab_6/gusev_vladislav_lab_6.py b/gusev_vladislav_lab_6/gusev_vladislav_lab_6.py new file mode 100644 index 0000000..ffd555b --- /dev/null +++ b/gusev_vladislav_lab_6/gusev_vladislav_lab_6.py @@ -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) + diff --git a/gusev_vladislav_lab_6/images/img.png b/gusev_vladislav_lab_6/images/img.png new file mode 100644 index 0000000..dede4e7 Binary files /dev/null and b/gusev_vladislav_lab_6/images/img.png differ diff --git a/gusev_vladislav_lab_6/images/img_1.png b/gusev_vladislav_lab_6/images/img_1.png new file mode 100644 index 0000000..256c38e Binary files /dev/null and b/gusev_vladislav_lab_6/images/img_1.png differ diff --git a/gusev_vladislav_lab_6/images/img_2.png b/gusev_vladislav_lab_6/images/img_2.png new file mode 100644 index 0000000..12cc2e1 Binary files /dev/null and b/gusev_vladislav_lab_6/images/img_2.png differ diff --git a/gusev_vladislav_lab_6/images/img_3.png b/gusev_vladislav_lab_6/images/img_3.png new file mode 100644 index 0000000..a79bf49 Binary files /dev/null and b/gusev_vladislav_lab_6/images/img_3.png differ