73 lines
2.5 KiB
Markdown
73 lines
2.5 KiB
Markdown
# Отчет по лабораторной работе №5
|
||
|
||
Выполнила студентка гр. ИСЭбд-41 Островская С.Ф.
|
||
|
||
## Создание приложения
|
||
|
||
Было выбрано консольное приложение, язык программирования - c#.
|
||
|
||
Обычный алгоритм:
|
||
|
||
```cs
|
||
static int[][] MultiplyMatrix(int[][] matrix1, int[][] matrix2)
|
||
{
|
||
int rows = matrix1.Length;
|
||
int columns = matrix2[0].Length;
|
||
int[][] result = new int[rows][];
|
||
for (int i = 0; i < rows; i++)
|
||
{
|
||
result[i] = new int[columns];
|
||
for (int j = 0; j < columns; j++)
|
||
{
|
||
result[i][j] = 0;
|
||
for (int k = 0; k < matrix1[i].Length; k++)
|
||
{
|
||
result[i][j] += matrix1[i][k] * matrix2[k][j];
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
```
|
||
Параллельный алгоритм:
|
||
|
||
```cs
|
||
static int[][] MultiplyMatrixParallel(int[][] matrix1, int[][] matrix2, int numThreads)
|
||
{
|
||
int rows = matrix1.Length;
|
||
int columns = matrix2[0].Length;
|
||
int[][] result = new int[rows][];
|
||
|
||
|
||
Parallel.For(0, rows, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i =>
|
||
{
|
||
result[i] = new int[columns];
|
||
for (int j = 0; j < columns; j++)
|
||
{
|
||
result[i][j] = 0;
|
||
Parallel.For(0, matrix1[i].Length, k =>
|
||
{
|
||
result[i][j] += matrix1[i][k] * matrix2[k][j];
|
||
});
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
```
|
||
|
||
![](pic/pic1.jpg)
|
||
![](pic/pic2.jpg)
|
||
|
||
В результате обычный алгоритм выполнился за ``0,0002112`` секунды, а паралелльный за ``0,0064956`` секунды.
|
||
|
||
## Бенчмарки
|
||
|
||
Протестируем обычный и параллельный алгоритмы на матрицах различных размеров: 100х100, 300х300 и 500х500.
|
||
|
||
Количество потоков: ``4``
|
||
![](pic/pic3.jpg)
|
||
|
||
Количество потоков: ``12``
|
||
![](pic/pic4.jpg)
|
||
|
||
``Вывод``: Обыный алгоритм работает быстрее, если количество элементов не слишком много. Параллельный же алгоритм работает быстрее только при наличии большого количества операций и данных. Оптимальное количество потоков для эффективной работы - 12. |