DAS_2023_1/alexandrov_dmitrii_lab_5/readme.md

37 lines
4.0 KiB
Markdown
Raw Normal View History

2023-12-22 16:08:59 +04:00
## Задание
Создать программу, производящую параллельные умножения реализовать двух больших квадратных матриц.
## Выполнение
Программа состоит из модуля-сервиса service и модуля для вычислений matrix.
В модуле для вычислений реализовано:
* метод do_multiplication, который в обычном режиме одним потоком умножает матрицы. Не используется, т.к. слишком медленный.
* метод multiply_row, который получает строку матрицы A, транспонированную матрицу B, строку выходной матрицы C, размер матриц и заполняет эту строку проходя по строкам транспонированной матрицы B. Возвращает заполненную строку.
* метод do_multiplication_parallel, использующий предыдущий, который получает размер матриц и количество процессов, генерирует случайные матрицы заданного размера и производит вычисления.
* метод прогона эксперимента с заполнением данных результатами. Методы интерфейса доступа.
Способ вычисления: в методе do_multiplication_parallel матрица B транспонируется, создаётся объект ProcessPoolExecutor с переданным количеством процессов, который их создаёт и распределяет по ним строки вычисляемой матрицы, а именно передавая им метод multiply_row.
Если передать методу число 1 в качестве количества процессов, то соответственно вычисление произойдёт в одном потоке.
2023-12-22 16:08:59 +04:00
## Результаты
Был создан Flask сервис, позволяющий получать результаты умножения случайных квадратных матриц.
Возможно задать размер и количество процессов.
2023-12-22 16:08:59 +04:00
Дополнительно возможно провести эксперимент и получить результаты умножения матриц размера 100, 300 и 500 одним, десятью и ста потоками.
2023-12-22 16:48:46 +04:00
Поскольку распараллеливание основано на процессах, а в системе имеется 6 ядер (+2 виртуальных), то максимальное увеличение производительности будет достигнуто при выборе такого количества процессов.
Более 61 потока урезается до 61 из-за системных ограничений.
Как видно из бенчмарка:
* во всех случаях скорость максимальна при выборе 10 процессов, т.е. при ближайшем к 8 числу процессов.
* в случае 100 процессов из-за издержек создания процессов малые матрицы обрабатываются на порядок дольше, нежели одним потоком.
* в случае 100 процессов благодаря распараллеливанию скорость обработки оказалась в 3 раза выше скорости обработки одним потоком.
2023-12-22 16:08:59 +04:00
Результаты:
![RabbitMQ](screens/get5.png)
![MediaWiki](screens/get15.png)
Бенчмарк:
![MediaWiki](screens/bench.png)
## Ссылка на видео
2023-12-22 16:48:46 +04:00
https://drive.google.com/file/d/1_bIyLL8YGwDePwWdCFk4KxntJip6mP0t/view?usp=drive_link