DAS_2023_1/alexandrov_dmitrii_lab_5/readme.md

37 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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