67 lines
4.8 KiB
Markdown
67 lines
4.8 KiB
Markdown
|
# Пупков Алексей ИСЭбд-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)
|