60 lines
2.2 KiB
Markdown
60 lines
2.2 KiB
Markdown
|
# Отчет по лабораторной работе №5
|
|||
|
|
|||
|
Выполнил студент гр. ИСЭбд-41 Савицкий А.В.
|
|||
|
|
|||
|
## Создание приложения
|
|||
|
|
|||
|
Выбрал язык C#, Консольное приложение.
|
|||
|
|
|||
|
Проверяю правильность работы алгоритма
|
|||
|
|
|||
|
```cs
|
|||
|
public int[,] MultiplicationMatrix(int[,] matrix1, int[,] matrix2, int threadCount)
|
|||
|
{
|
|||
|
var result = new int[matrix1.GetLength(0), matrix1.GetLength(1)];
|
|||
|
for(int i = 0; i < result.GetLength(0); i++)
|
|||
|
{
|
|||
|
for (int j = 0; j < result.GetLength(1); j++)
|
|||
|
{
|
|||
|
result[i, j] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i < matrix1.GetLength(0); i++)
|
|||
|
{
|
|||
|
Parallel.For(0, matrix2.GetLength(1), new ParallelOptions() { MaxDegreeOfParallelism = threadCount },
|
|||
|
(j) =>
|
|||
|
{
|
|||
|
|
|||
|
for (int k = 0; k < matrix2.GetLength(0); k++)
|
|||
|
{
|
|||
|
var value = matrix1[i, k] * matrix2[k, j];
|
|||
|
Interlocked.Add(ref result[i, j], value);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
![](pic/1.png)
|
|||
|
|
|||
|
Установил библиотеку BenchmarkDotNet для замера производительности алгоритма.
|
|||
|
|
|||
|
## Бенчмарки
|
|||
|
|
|||
|
Делаю 6 пробных запусков
|
|||
|
Матрицы 100х100, 300х300, 500х500
|
|||
|
Количество потоков 1,12
|
|||
|
|
|||
|
![](pic/2.png)
|
|||
|
|
|||
|
Нас интересуют преимущественно две колонки - Mean и Allocated.
|
|||
|
|
|||
|
Mean показывает среднее время выполнения бенчмарка
|
|||
|
Allocated показывает количество выделенной памяти
|
|||
|
|
|||
|
Для матриц 100х100 однопоточный алгоритм отработал быстрее чем многопоточный, однако для более больших матриц время выполнения серьезно уменшилось.
|
|||
|
|
|||
|
Вывод: Параллельный алгоритм работает быстрее чем однопоточный, если мы обрабатываем большие данные. Также многопоточное выполнение занимает больше памяти.
|