# Кашин Максим ПИбд-42

# Отчет по вычислению детерминанта матрицы

## Описание

В данной лабораторной работе реализовано вычисление детерминанта квадратной матрицы двумя способами: последовательно и параллельно. Для параллельного вычисления используется библиотека `multiprocessing` в Python. Программа позволяет задавать количество процессов, что позволяет наблюдать за изменением производительности при увеличении числа потоков.

## Как работает код

1. **Импорт библиотек**: 
   - `numpy` используется для работы с матрицами и вычисления детерминанта.
   - `multiprocessing` позволяет создавать несколько процессов для параллельного вычисления.
   - `time` используется для замера времени выполнения.
   - `argparse` для обработки аргументов командной строки.

2. **Функция `determinant_block(matrix_block)`**: 
   - Вычисляет детерминант переданного блока матрицы с помощью `numpy.linalg.det`.

3. **Функция `determinant_parallel(matrix, num_processes)`**: 
   - Делит исходную матрицу на блоки, каждый из которых передается в отдельный процесс для вычисления детерминанта.
   - Возвращает произведение детерминантов блоков.

4. **Функция `benchmark(size, num_processes)`**:
   - Генерирует случайную матрицу заданного размера.
   - Запускает параллельное и последовательное вычисление детерминанта, измеряя время выполнения и выводя результаты.

5. **Основная часть программы**:
   - Использует `argparse` для получения количества процессов.
   - Запускает бенчмарки для матриц размером 100x100, 300x300 и 500x500.

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

В процессе тестирования были получены следующие результаты:

### Сравнение времени выполнения:

| Размер матрицы | Количество процессов | Время (сек. параллельно) | Время (сек. последовательно) |
|----------------|----------------------|---------------------------|-------------------------------|
| 100x100        | 1                    | 0.52331                   | 0.04900                       |
| 300x300        | 1                    | 0.51905                   | 0.00700                       |
| 500x500        | 1                    | 0.53077                   | 0.01000                       |
| 100x100        | 2                    | 0.49886                   | 0.00299                       |
| 300x300        | 2                    | 0.87159                   | 0.00799                       |
| 500x500        | 2                    | 1.25856                   | 0.01200                       |
| 100x100        | 4                    | 0.59433                   | 0.00152                       |
| 300x300        | 4                    | 0.56344                   | 0.00700                       |
| 500x500        | 4                    | 1.51391                   | 0.01600                       |
| 100x100        | 8                    | 0.87769                   | 0.00200                       |
| 300x300        | 8                    | 0.80332                   | 0.00600                       |
| 500x500        | 8                    | 0.81058                   | 0.01700                       |
| 100x100        | 16                   | 1.58553                   | 0.00300                       |
| 300x300        | 16                   | 1.44331                   | 0.00900                       |
| 500x500        | 16                   | 1.48519                   | 0.06000                       |

## Выводы

1. **Производительность**: Параллельное вычисление показывает значительное замедление по сравнению с последовательным для малых матриц (например, 100x100). Это связано с накладными расходами на создание и управление процессами.

2. **Эффективность**: С увеличением размеров матриц (300x300 и 500x500) время параллельного вычисления увеличивается, что указывает на неэффективность при использовании большого количества процессов. В некоторых случаях, например, для матрицы 500x500 с 4 и 8 процессами, время выполнения параллельного алгоритма оказывается больше, чем у последовательного.

## Запуск

Запустите программу с нужным числом процессов:

```
python main.py --processes <число процессов>
```


## Ссылка на видео
[Видео-отчёт Кашин Максим ПИбд-42](https://disk.yandex.ru/i/0zlwA89Pk_5dXQ)