# Лабораторная работа №5 - Параллельное вычисление детерминант матриц

## Задание
В данной лабораторной работе было необходимо реализовать вычисление детерминанта квадратной матрицы двумя способами:
1. Последовательное вычисление.
2. Параллельное вычисление с возможностью задания количества потоков.

Основная цель — изучить эффект параллельных вычислений и оценить прирост производительности при увеличении количества потоков.

## Запуск
Для запуска алгоритма вычисления детерминанта потребуется Python и модуль `multiprocessing`.

Запуск теста производительности:
```
    python main.py
```


## Результаты

Ниже представлены результаты бенчмарков для различных размеров матриц и разного количества потоков:

| Размер матрицы | Потоки | Время (последовательное) | Время (параллельное) | Ускорение |
|----------------|--------|--------------------------|-----------------------|-----------|
| **100x100**    | 1      | 0.0100 s                | 0.1957 s             | 0.05      |
|                | 2      | 0.0100 s                | 0.1805 s             | 0.06      |
|                | 4      | 0.0100 s                | 0.2080 s             | 0.05      |
|                | 6      | 0.0100 s                | 0.3015 s             | 0.03      |
|                | 8      | 0.0100 s                | 0.2370 s             | 0.04      |
|                | 12     | 0.0100 s                | 0.2850 s             | 0.04      |
|                | 16     | 0.0100 s                | 0.3188 s             | 0.03      |

| Размер матрицы | Потоки | Время (последовательное) | Время (параллельное) | Ускорение |
|----------------|--------|--------------------------|-----------------------|-----------|
| **300x300**    | 1      | 0.0970 s                | 0.2766 s             | 0.35      |
|                | 2      | 0.0970 s                | 0.2570 s             | 0.38      |
|                | 4      | 0.0970 s                | 0.2360 s             | 0.41      |
|                | 6      | 0.0970 s                | 0.2856 s             | 0.34      |
|                | 8      | 0.0970 s                | 0.3120 s             | 0.31      |
|                | 12     | 0.0970 s                | 0.3692 s             | 0.26      |
|                | 16     | 0.0970 s                | 0.5351 s             | 0.18      |

| Размер матрицы | Потоки | Время (последовательное) | Время (параллельное) | Ускорение |
|----------------|--------|--------------------------|-----------------------|-----------|
| **500x500**    | 1      | 0.3000 s                | 0.5301 s             | 0.57      |
|                | 2      | 0.3000 s                | 0.3850 s             | 0.78      |
|                | 4      | 0.3000 s                | 0.3512 s             | 0.85      |
|                | 6      | 0.3000 s                | 0.3000 s             | 1.00      |
|                | 8      | 0.3000 s                | 0.3300 s             | 0.91      |
|                | 12     | 0.3000 s                | 0.3979 s             | 0.75      |
|                | 16     | 0.3000 s                | 0.4740 s             | 0.63      |

| Размер матрицы | Потоки | Время (последовательное) | Время (параллельное) | Ускорение |
|----------------|--------|--------------------------|-----------------------|-----------|
| **1000x1000**  | 1      | 1.1871 s                | 1.3527 s             | 0.88      |
|                | 2      | 1.1871 s                | 1.1602 s             | 1.02      |
|                | 4      | 1.1871 s                | 0.7971 s             | 1.49      |
|                | 6      | 1.1871 s                | 0.6782 s             | 1.75      |
|                | 8      | 1.1871 s                | 0.6263 s             | 1.90      |
|                | 12     | 1.1871 s                | 0.6636 s             | 1.79      |
|                | 16     | 1.1871 s                | 0.7715 s             | 1.54      |

| Размер матрицы | Потоки | Время (последовательное) | Время (параллельное) | Ускорение |
|----------------|--------|--------------------------|-----------------------|-----------|
| **1200x1200**  | 1      | 1.7012 s                | 1.8796 s             | 0.91      |
|                | 2      | 1.7012 s                | 1.5037 s             | 1.13      |
|                | 4      | 1.7012 s                | 1.0827 s             | 1.57      |
|                | 6      | 1.7012 s                | 0.8606 s             | 1.98      |
|                | 8      | 1.7012 s                | 0.8093 s             | 2.10      |
|                | 12     | 1.7012 s                | 0.8072 s             | 2.11      |
|                | 16     | 1.7012 s                | 0.9291 s             | 1.80      |

## Выводы
Из результатов видно, что ускорение при использовании параллельного алгоритма зависит от размера матрицы и количества потоков:
- Для небольших матриц (например, 100x100) параллельный алгоритм не даёт значительного ускорения из-за накладных расходов на создание потоков.
- Для больших матриц (например, 1000x1000 и 1200x1200) параллельный алгоритм даёт существенное ускорение, достигая оптимальных значений при использовании 8–12 потоков.
- Увеличение количества потоков сверх количества ядер процессора не улучшает производительность и даже может её снижать из-за накладных расходов на управление потоками.

Таким образом, для эффективного параллельного вычисления детерминанта матриц важно учитывать размер данных и правильно подбирать количество потоков.

## [Видео](https://disk.yandex.ru/i/Tov7E9dy7Kt5vA)