70 lines
4.4 KiB
Markdown
70 lines
4.4 KiB
Markdown
|
# Пупков Алексей ИСЭбд-41
|
|||
|
# Отчет по умножению матриц
|
|||
|
## Описание
|
|||
|
|
|||
|
В данной лабораторной работе реализованы два алгоритма для умножения больших квадратных матриц: последовательный и параллельный. Для параллельного вычисления используется библиотека concurrent.futures в Python. Программа позволяет задавать количество процессов, что позволяет наблюдать за изменением производительности при увеличении числа потоков.
|
|||
|
|
|||
|
## Как работает код:
|
|||
|
|
|||
|
1. Импорт библиотек
|
|||
|
- concurrent.futures помогает запускать параллельные задачи с использованием потоков
|
|||
|
- time используется для измерения времени выполнения алгоритмов
|
|||
|
- numpy используется для работы с матрицами и для вычислений
|
|||
|
- argparse для обработки аргументов командной строки
|
|||
|
|
|||
|
2. Функция matrix_multiply_sequential(A, B)
|
|||
|
- Выполняет последовательное умножение двух матриц A и B.
|
|||
|
|
|||
|
3. Функция worker(A, B, C, start_row, end_row)
|
|||
|
- Выполняет умножение для части строк матрицы, параметры start_row и end_row определяют диапазон строк, которые нужно вычислить
|
|||
|
|
|||
|
4. Функция matrix_multiply_parallel(A, B, num_threads)
|
|||
|
- Реализует параллельное умножение матриц
|
|||
|
|
|||
|
5. Функция benchmark(matrix_sizes, num_threads_list)
|
|||
|
|
|||
|
- Выполняет бенчмаркинг (измерение времени выполнения) для обоих методов умножения
|
|||
|
|
|||
|
## Результаты
|
|||
|
|
|||
|
Размер матриц: 100x100
|
|||
|
Последовательное умножение заняло: 0.0558 секунд
|
|||
|
|
|||
|
Параллельное умножение с 2 потоками заняло: 0.0886 секунд
|
|||
|
|
|||
|
Параллельное умножение с 4 потоками заняло: 0.0876 секунд
|
|||
|
|
|||
|
Параллельное умножение с 8 потоками заняло: 0.0868 секунд
|
|||
|
|
|||
|
Параллельное умножение с 16 потоками заняло: 0.0914 секунд
|
|||
|
|
|||
|
Размер матриц: 300x300
|
|||
|
Последовательное умножение заняло: 1.6149 секунд
|
|||
|
|
|||
|
Параллельное умножение с 2 потоками заняло: 2.4936 секунд
|
|||
|
|
|||
|
Параллельное умножение с 4 потоками заняло: 2.4383 секунд
|
|||
|
|
|||
|
Параллельное умножение с 8 потоками заняло: 2.4458 секунд
|
|||
|
|
|||
|
Параллельное умножение с 16 потоками заняло: 2.4899 секунд
|
|||
|
|
|||
|
Размер матриц: 500x500
|
|||
|
Последовательное умножение заняло: 7.9416 секунд
|
|||
|
|
|||
|
Параллельное умножение с 2 потоками заняло: 11.8896 секунд
|
|||
|
|
|||
|
Параллельное умножение с 4 потоками заняло: 11.8901 секунд
|
|||
|
|
|||
|
Параллельное умножение с 8 потоками заняло: 12.0230 секунд
|
|||
|
|
|||
|
Параллельное умножение с 16 потоками заняло: 11.8548 секунд
|
|||
|
|
|||
|
|
|||
|
## Выводы
|
|||
|
Во всех случаях параллельный алгоритм выполняется дольше, чем последовательный. На рассматриваемых матрицах (100x100, 300x300, 500x500) последовательное умножение оказывается более выгодным. Это связано с тем, что накладные расходы на параллельное исполнение и синхронизацию между потоками превышают время, которое можно сэкономить за счёт многопоточности.
|
|||
|
|
|||
|
## Запуск
|
|||
|
Python main.py – threads 2 4 8 16
|
|||
|
|
|||
|
[Ссылка на демонстрацию работы программы](https://vk.com/video547368103_456239605?list=ln-ZAsjrYkuwZp6I4ghXC)
|