62 lines
3.1 KiB
Markdown
62 lines
3.1 KiB
Markdown
|
## Задание
|
|||
|
Кратко: реализовать умножение двух больших квадратных матриц.
|
|||
|
|
|||
|
Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.
|
|||
|
|
|||
|
### Ход работы
|
|||
|
**Последовательный алгоритм**
|
|||
|
|
|||
|
public static int[][] multiplyMatricesSequential(int[][] matrix1, int[][] matrix2) {
|
|||
|
|
|||
|
int rows1 = matrix1.length;
|
|||
|
|
|||
|
int columns1 = matrix1[0].length;
|
|||
|
|
|||
|
int columns2 = matrix2[0].length;
|
|||
|
|
|||
|
var matrixResult = new int[size][size];
|
|||
|
for (int i = 0; i < size; i++) {
|
|||
|
for (int j = 0; j < size; j++) {
|
|||
|
for (int m = 0; m < size; m++) {
|
|||
|
matrixResult[i][j] += matrix1[i][m] * matrix2[m][j];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return matrixResult;
|
|||
|
Параллельный алгоритм
|
|||
|
public static int[][] multiplyMatricesParallel(int[][] matrix1, int[][] matrix2) {
|
|||
|
int rows1 = matrix1.length;
|
|||
|
int columns1 = matrix1[0].length;
|
|||
|
int columns2 = matrix2[0].length;
|
|||
|
|
|||
|
var matrixResult = new int[size][size];
|
|||
|
|
|||
|
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
|
|||
|
int blockSize = size / nThreads;
|
|||
|
|
|||
|
for (int i = 0; i < nThreads; i++) {
|
|||
|
int startRow = i * blockSize;
|
|||
|
int endRow = (i + 1) * blockSize;
|
|||
|
if (i == nThreads - 1) {
|
|||
|
endRow = size;
|
|||
|
}
|
|||
|
|
|||
|
int finalEndRow = endRow;
|
|||
|
executorService.submit(() -> {
|
|||
|
for (int row = startRow; row < finalEndRow; row++) {
|
|||
|
for (int col = 0; col < size; col++) {
|
|||
|
for (int m = 0; m < size; m++) {
|
|||
|
matrixResult[row][col] += matrix1[row][m] * matrix2[m][col];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
Результат
|
|||
|
Была проверка времени выполнения алгоритма для матриц размером 100х100, 300х300, 500х500 с разным количеством потоков.
|
|||
|
![sreenshot](screen.png)
|
|||
|
|
|||
|
Из данных скриншотов видно, что в случае с матрицей 100х100 последовательный алгоритм работает лучше, чем параллельный, в других случаях наоборот.
|
|||
|
|
|||
|
Для остальных матриц параллельный алгоритм работает лучше, а также увеличение кол-ва потоков уменьшает время выполнения алгоритма. (хотя в случае матрицы 100х100 - сильно увеличивает)
|
|||
|
|
|||
|
Видео: https://disk.yandex.ru/d/zeVdy1b0mC79cQ
|