distributed-computing/tasks/ostrovskaya-sf/lab_5/README.md
Софья Островская a308ede4ad laba done
2023-12-17 13:37:17 +04:00

73 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Отчет по лабораторной работе №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.