Лабораторная работа 6 — Параллельное вычисление детерминанта матрицы
1. Цель работы
Изучение параллельного программирования на примере реализации алгоритмов вычисления детерминанта (определителя) квадратных матриц с использованием многопроцессности Python.
2. Как запустить лабораторную работу
Предварительные требования:
- Python 3.9+
- Библиотека NumPy
Установка зависимостей
pip install numpy
Запуск программы
python matrix.py
Программа автоматически выполнит:
- Тесты корректности на известных матрицах
- Бенчмарки на матрицах размером 100×100, 300×300 и 500×500 элементов
- Сравнение последовательного и параллельного алгоритмов
3. Структура проекта
matrix.py # Основной файл с реализацией алгоритмов
README.md # Документация проекта
4. Результаты тестирования
Матрицы 100×100
Результат:
| Алгоритм | Время (сек) | Ускорение |
|---|---|---|
| Последовательный (LU) | 0.01-0.03 | 1.00x |
| Параллельный (2 процесса) | 2.5-3.5 | 0.01x |
| Параллельный (4 процесса) | 1.8-2.8 | 0.01x |
| Параллельный (8 процессов) | 1.5-2.5 | 0.01x |
Вывод:
На матрицах 100×100 параллелизм крайне неэффективен. Overhead от создания процессов (2-3 сек) во много раз превышает время самих вычислений (0.01-0.03 сек). Последовательный LU-алгоритм работает мгновенно и является оптимальным выбором.
Матрицы 300×300
Результат:
| Алгоритм | Время (сек) | Ускорение |
|---|---|---|
| Последовательный (LU) | 0.15-0.25 | 1.00x |
| Параллельный (2 процесса) | 45-55 | 0.004x ❌ |
| Параллельный (4 процесса) | 25-35 | 0.007x ❌ |
| Параллельный (8 процессов) | 15-20 | 0.01x ❌ |
Вывод:
Даже на матрицах 300×300 параллелизм через разложение по строке остается неэффективным. LU-разложение работает за доли секунды, в то время как параллельное разложение требует десятков секунд на вычисление 300 миноров размером 299×299.
Матрицы 500×500
Результат:
| Алгоритм | Время (сек) | Ускорение | Детерминант |
|---|---|---|---|
| Последовательный (LU) | 0.5-0.8 | 1.00x | ~10¹⁰⁰⁰ |
| Параллельный (2 процесса) | 180-220 | 0.003x ❌ | ~10¹⁰⁰⁰ |
| Параллельный (4 процесса) | 100-130 | 0.006x ❌ | ~10¹⁰⁰⁰ |
| Параллельный (8 процессов) | 60-80 | 0.009x ❌ | ~10¹⁰⁰⁰ |
Вывод:
На больших матрицах 500×500 ситуация не улучшается. LU-разложение остается самым эффективным (менее 1 секунды), в то время как параллельное разложение по строке требует минут работы.
13. Видео
ВидеоСсылка на видео работы алгоритма: Rutube