100 lines
4.9 KiB
Markdown
100 lines
4.9 KiB
Markdown
# Отчет по лабораторной работе №5
|
||
|
||
Выполнила студентка гр. ИСЭбд-41 Плаксина А.В.
|
||
|
||
# Описание работы приложения
|
||
|
||
Приложение реализовнао на языке питон, использована среда PyCharm для разработки.
|
||
Было развернуто два приложения:
|
||
1. Веб приложение для умножения матриц
|
||
2. Консольное приложение для бенчмаркинга
|
||
|
||
Последовательно запускаем две программы: сначала simple_app.py, затем benchmark.py.
|
||
Веб - приложение позволяет указать размеры матрицы и используемый алгоритм, и на основании этого получить результат перемножения матриц в интерактивном режиме
|
||
|
||
Развернули два приложения
|
||
|
||
1. Приложение 1 - веб приложение для умножения матриц
|
||
2. Приложение 2 - консольное приложение для сравнения эффективности работы алгоритмов.
|
||
|
||
Первое приложение дает нам возможность умножить матрицы, получить результат в интерактивном режиме
|
||
с указанием используемого алгоритма и с указанием размера матрицы.
|
||
|
||
При запуске веб приложения с выбором последовательного умножения:
|
||
|
||
![](photo/ph23.jpg)
|
||
|
||
Результат последовательного умножения:
|
||
|
||
![](photo/ph24.jpg)
|
||
|
||
Код реализующий последовательное умножение матриц:
|
||
|
||
```cs
|
||
def multiply_matrices(matrix_a, matrix_b):
|
||
if len(matrix_a[0]) != len(matrix_b):
|
||
raise ValueError("матрицы имеют разную длину")
|
||
|
||
result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
|
||
|
||
for i in range(len(matrix_a)):
|
||
for j in range(len(matrix_b[0])):
|
||
for k in range(len(matrix_b)):
|
||
result[i][j] += matrix_a[i][k] * matrix_b[k][j]
|
||
|
||
return result
|
||
```
|
||
|
||
При запуске веб приложения с выбором параллельного умножения:
|
||
|
||
![](photo/ph25.jpg)
|
||
|
||
Результат параллельного умножения:
|
||
|
||
![](photo/ph26.jpg)
|
||
|
||
Код реализующий параллельное умножение матриц:
|
||
|
||
```cs
|
||
def multiply_matrices_parallel(matrix_a, matrix_b, threads):
|
||
if len(matrix_a[0]) != len(matrix_b):
|
||
raise ValueError("матрицы имеют разную длину")
|
||
|
||
result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
|
||
|
||
with multiprocessing.Pool(processes=threads) as pool:
|
||
args_list = [(matrix_a, matrix_b, i) for i in range(len(matrix_a))]
|
||
rows_results = pool.map(multiply_row, args_list)
|
||
|
||
for row_result, row_index in rows_results:
|
||
result[row_index] = row_result
|
||
|
||
return result
|
||
|
||
```
|
||
# Бенчмаркинг
|
||
|
||
Для сравнения времени работы двух алгоритмов умножения, проведем несколько бенчмарков
|
||
|
||
Для матриц размерностью 100x100, 300x300, 500x500, для параллельного алгоритма дополнительно для каждого введенного количества потоков (4, 16, 32)
|
||
|
||
Результаты бенчмаркинга для последовательного способа матриц различной размерности:
|
||
|
||
![](photo/ph27.jpg)
|
||
|
||
Результаты бенчмаркинга для параллельного способа матриц различной размерности с количеством потоков равном 4:
|
||
|
||
![](photo/ph28.jpg)
|
||
|
||
Результаты бенчмаркинга для параллельного способа матриц различной размерности с количеством потоков равном 16:
|
||
|
||
![](photo/ph29.jpg)
|
||
|
||
Результаты бенчмаркинга для параллельного способа матриц различной размерности с количеством потоков равном 32:
|
||
|
||
![](photo/ph30.jpg)
|
||
|
||
# Вывод
|
||
|
||
С использованием параллельного алгоритма скорость обработки существенно увеличивается, особенно при большой размерности матрицы.
|
||
В данном примере оптимальная скорость достигается при количестве потоков равном 16. |