DAS_2024_1/pupkov_alexey_lab_6/README.md

67 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Пупков Алексей ИСЭбд-41
# Отчет по вычислению детерминанта матрицы
## Описание
В данной лабораторной работе реализовано вычисление детерминанта квадратной матрицы двумя способами: последовательно и параллельно. Для параллельного вычисления используется библиотека concurrent.futures в Python. Программа позволяет задавать количество процессов, что позволяет наблюдать за изменением производительности при увеличении числа потоков.
## Как работает код:
1. Импорт библиотек
- numpy используется для работы с матрицами и для вычислений
- concurrent.futures помогает запускать параллельные задачи с использованием потоков
- time используется для измерения времени выполнения алгоритмов
- argparse для обработки аргументов командной строки
2. Функция determinant_sequential(matrix)
- Вычисляет детерминант матрицы, используя метод Гаусса (прямой ход преобразования матрицы в верхнетреугольную форму)
3. Функция calculate_minor(matrix, i, j)
- Возвращает минор элемента матрицы, находящегося в позиции (i, j)
4. Функция determinant_parallel(matrix, num_threads)
- Рассчитывает детерминант параллельно, распределяя вычисление миноров между потоками
5. Функция benchmark(matrix_sizes, num_threads_list)
- Тестирует и сравнивает скорость последовательного и параллельного алгоритмов для матриц разных размеров
## Результаты
Размер матрицы: 100x100
Последовательный алгоритм занял: 0.0150 секунд
Параллельный алгоритм с 1 потоками занял: 0.0170 секунд
Параллельный алгоритм с 2 потоками занял: 0.0200 секунд
Параллельный алгоритм с 4 потоками занял: 0.0200 секунд
Параллельный алгоритм с 8 потоками занял: 0.0200 секунд
Размер матрицы: 300x300
Последовательный алгоритм занял: 0.1492 секунд
Параллельный алгоритм с 1 потоками занял: 0.1510 секунд
Параллельный алгоритм с 2 потоками занял: 3.1997 секунд
Параллельный алгоритм с 4 потоками занял: 1.8139 секунд
Параллельный алгоритм с 8 потоками занял: 1.6556 секунд
Размер матрицы: 500x500
Последовательный алгоритм занял: 0.4196 секунд
Параллельный алгоритм с 1 потоками занял: 0.4201 секунд
Параллельный алгоритм с 2 потоками занял: 6.0421 секунд
Параллельный алгоритм с 4 потоками занял: 8.1776 секунд
Параллельный алгоритм с 8 потоками занял: 5.3308 секунд
## Выводы
Время параллельного алгоритма (с любым количеством потоков) оказывается немного выше, чем у последовательного. Это объясняется затратами на создание и управление потоками, которые не компенсируются выигрышем от параллельных вычислений для маленьких задач. В случае малых матриц лучше использовать последовательный алгоритм. С увеличением размеров матриц (300x300 и 500x500) время параллельного вычисления увеличивается, что указывает на неэффективность при использовании большого количества процессов.
## Запуск
Python main.py threads 1 2 4 8
[Ссылка на демонстрацию работы программы](https://vk.com/video547368103_456239606?list=ln-1NucWuxvOOBqHDCdvn)