64 lines
2.3 KiB
Markdown
64 lines
2.3 KiB
Markdown
|
# Отчет по лабораторной работе №5
|
|||
|
|
|||
|
Выполнила студентка гр. ИСЭбд-41 Зиновьева А. Д.
|
|||
|
|
|||
|
## Создание приложения
|
|||
|
|
|||
|
Было выбрано консольное приложение, язык программирования - c#.
|
|||
|
|
|||
|
Обычный алгоритм:
|
|||
|
|
|||
|
```cs
|
|||
|
static int[,] MultiplyMatrices(int[,] matrixA, int[,] matrixB, int size)
|
|||
|
{
|
|||
|
int[,] result = new int[size, size];
|
|||
|
for (int i = 0; i < size; i++)
|
|||
|
{
|
|||
|
for (int j = 0; j < size; j++)
|
|||
|
{
|
|||
|
result[i, j] = 0;
|
|||
|
for (int k = 0; k < size; k++)
|
|||
|
{
|
|||
|
result[i, j] += matrixA[i, k] * matrixB[k, j];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
Параллельный алгоритм:
|
|||
|
|
|||
|
```cs
|
|||
|
static int[,] ParallelMultiplyMatrices(int[,] matrixA, int[,] matrixB, int size, int threads)
|
|||
|
{
|
|||
|
int[,] result = new int[size, size];
|
|||
|
Parallel.For(0, size, new ParallelOptions { MaxDegreeOfParallelism = threads }, i =>
|
|||
|
{
|
|||
|
for (int j = 0; j < size; j++)
|
|||
|
{
|
|||
|
result[i, j] = 0;
|
|||
|
for (int k = 0; k < size; k++)
|
|||
|
{
|
|||
|
result[i, j] += matrixA[i, k] * matrixB[k, j];
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|

|
|||
|
|
|||
|
В результате обычный алгоритм выполнился за ``0,0003575`` секунды, а паралелльный за ``0,0193432`` секунды.
|
|||
|
|
|||
|
## Бенчмарки
|
|||
|
|
|||
|
Протестируем обычный и параллельный алгоритмы на матрицах различных размеров: 100х100, 300х300 и 500х500.
|
|||
|
|
|||
|
Количество потоков: ``4``
|
|||
|

|
|||
|
|
|||
|
Количество потоков: ``12``
|
|||
|

|
|||
|
|
|||
|
``Вывод``: Последовательный алгоритм работает быстрее, если количество элементов не слишком большое. Параллельный же алгоритм работает быстрее только при наличии большого количества операций и данных. Оптимальное количество потоков для эффективной работы - 12 (так в сравнении с 4 получилось быстрее).
|