diff --git a/chernyshov_nikita_lab_6/README.md b/chernyshov_nikita_lab_6/README.md new file mode 100644 index 0000000..73c78e6 --- /dev/null +++ b/chernyshov_nikita_lab_6/README.md @@ -0,0 +1,36 @@ +# Лабораторная работа 6: Определение детерминанта матрицы с помощью параллельных вычислений + +## Описание + +В лабраторной работе программа вычисляет определитель матрицы двумя способами: параллельным методом с использованием нескольких процессов и последовательным методом, а также сравнивает их производительность. Функция determinant_block вычисляет детерминант переданного блока матрицы с помощью функции np.linalg.det из библиотеки NumPy. Функция determinant_parallel разделяет исходную матрицу на блоки (строго по строкам и столбцам) в зависимости от количества процессов, заданного аргументом num_processes. После этого каждый блок обрабатывается отдельным процессом в пуле процессов (Pool), и вычисленные детерминанты блоков перемножаются, чтобы получить общий детерминант матрицы. Функция benchmark генерирует случайную квадратную матрицу заданного размера, измеряет время выполнения параллельного и последовательного вычисления детерминанта, а затем выводит результаты. Основная часть программы запускается, если файл выполняется напрямую. Используется модуль argparse для получения аргумента командной строки --processes, который задает количество процессов для параллельного вычисления (по умолчанию 4). В цикле for функция benchmark выполняется для матриц размеров 100x100, 300x300 и 500x500, сравнивая производительность последовательного и параллельного подходов. + +## Результаты + +В процессе тестирования были получены следующие результаты: + +### Скриншоты результатов + +#### Результат бенчамарка при 1 процессе: +![img1.png](img1.png) + +#### Результат бенчамарка при 2 процессах: +![img2.png](img2.png) + +#### Результат бенчамарка при 3 процессах: +![img3.png](img3.png) + +#### Результат бенчамарка при 4 процессах: +![img4.png](img4.png) + + + +## Выводы + +1. **Производительность**: Для небольших матриц (например, 100x100) параллельное вычисление демонстрирует замедление по сравнению с последовательным методом из-за накладных расходов на создание и управление процессами. + +2. **Эффективность**: С увеличением размера матриц (300x300 и 500x500) время выполнения параллельного алгоритма также растёт, что свидетельствует о снижении его эффективности при использовании большего числа процессов. В некоторых тестах, например, для матрицы 500x500 при использовании 3 и 4 процессов, параллельный алгоритм оказался медленнее последовательного. + + + +## Ссылка на видео +https://vkvideo.ru/video286865610_456239229?list=ln-59QwPscwM3KZRLxg1E \ No newline at end of file diff --git a/chernyshov_nikita_lab_6/application.py b/chernyshov_nikita_lab_6/application.py new file mode 100644 index 0000000..384ff55 --- /dev/null +++ b/chernyshov_nikita_lab_6/application.py @@ -0,0 +1,50 @@ +import numpy as np +from multiprocessing import Pool +import time +import argparse + + +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 + + blocks = [] + for i in range(num_processes): + start_row = i * step + end_row = start_row + step if i < num_processes - 1 else size + blocks.append(matrix[start_row:end_row, start_row:end_row]) + + pool = Pool(processes=num_processes) + dets = pool.map(determinant_block, blocks) + pool.close() + pool.join() + + return np.prod(dets) + + +def benchmark(size, num_processes): + matrix = np.random.rand(size, size) + + start = time.time() + det_parallel = determinant_parallel(matrix, num_processes) + end = time.time() + print(f"Матрица {size}x{size} с {num_processes} процессами заняла {end - start:.5f} сек (Параллельно)") + + start = time.time() + det_seq = determinant_block(matrix) + end = time.time() + print(f"Матрица {size}x{size} последовательный вычисление заняло {end - start:.5f} сек (Последовательно)") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Вычисление детерминанта с параллельной обработкой") + parser.add_argument("--processes", type=int, default=4) + args = parser.parse_args() + + sizes = [100, 300, 500] + for size in sizes: + benchmark(size, args.processes) diff --git a/chernyshov_nikita_lab_6/img1.png b/chernyshov_nikita_lab_6/img1.png new file mode 100644 index 0000000..2222439 Binary files /dev/null and b/chernyshov_nikita_lab_6/img1.png differ diff --git a/chernyshov_nikita_lab_6/img2.png b/chernyshov_nikita_lab_6/img2.png new file mode 100644 index 0000000..539af97 Binary files /dev/null and b/chernyshov_nikita_lab_6/img2.png differ diff --git a/chernyshov_nikita_lab_6/img3.png b/chernyshov_nikita_lab_6/img3.png new file mode 100644 index 0000000..9f0c841 Binary files /dev/null and b/chernyshov_nikita_lab_6/img3.png differ diff --git a/chernyshov_nikita_lab_6/img4.png b/chernyshov_nikita_lab_6/img4.png new file mode 100644 index 0000000..2a11f58 Binary files /dev/null and b/chernyshov_nikita_lab_6/img4.png differ