66 lines
2.2 KiB
Markdown
66 lines
2.2 KiB
Markdown
|
# Отчёт по лабораторной работе №5
|
|||
|
|
|||
|
Выполнил: студент гр. ИСЭбд-41 Михайлов Ю.С.
|
|||
|
|
|||
|
## Запуск приложения
|
|||
|
|
|||
|
Было выбрано консольное приложение, язык программирования - C#.
|
|||
|
|
|||
|
Перемножение матриц обычным алгоритмом:
|
|||
|
```
|
|||
|
public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB)
|
|||
|
{
|
|||
|
int rowsA = matrixA.Length;
|
|||
|
int colsA = matrixA[0].Length;
|
|||
|
int colsB = matrixB[0].Length;
|
|||
|
|
|||
|
int[][] result = new int[rowsA][];
|
|||
|
|
|||
|
for (int i = 0; i < rowsA; i++)
|
|||
|
{
|
|||
|
result[i] = new int[colsB];
|
|||
|
|
|||
|
for (int j = 0; j < colsB; j++)
|
|||
|
{
|
|||
|
for (int k = 0; k < colsA; k++)
|
|||
|
{
|
|||
|
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Перемножение матриц параллельным алгоритмом:
|
|||
|
```
|
|||
|
public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads)
|
|||
|
{
|
|||
|
int rowsA = matrixA.Length;
|
|||
|
int colsA = matrixA[0].Length;
|
|||
|
int colsB = matrixB[0].Length;
|
|||
|
|
|||
|
int[][] result = new int[rowsA][];
|
|||
|
|
|||
|
Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i =>
|
|||
|
{
|
|||
|
result[i] = new int[colsB];
|
|||
|
|
|||
|
for (int j = 0; j < colsB; j++)
|
|||
|
{
|
|||
|
for (int k = 0; k < colsA; k++)
|
|||
|
{
|
|||
|
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Результаты
|
|||
|
|
|||
|
![](pic.PNG)
|
|||
|
Вывод: если в матрице не слишком много элементов, обычный алгоритм работает быстрее. Параллельный алгоритм следует использовать для обработки большого количества данных. В сравнении с однопоточным алгоритмом, работа параллельного в несколько раз быстрее.
|