DAS_2023_1/kutygin_andrey_lab_5
2024-01-16 12:23:28 +04:00
..
.idea kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00
out/production/lab5 kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00
src kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00
lab5.iml kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00
README.md kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00
screen.png kutygin_andrey_lab_5_ready 2024-01-16 12:23:28 +04:00

Задание

Кратко: реализовать умножение двух больших квадратных матриц.

Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.

Ход работы

Последовательный алгоритм

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

Из данных скриншотов видно, что в случае с матрицей 100х100 последовательный алгоритм работает лучше, чем параллельный, в других случаях наоборот.

Для остальных матриц параллельный алгоритм работает лучше, а также увеличение кол-ва потоков уменьшает время выполнения алгоритма. (хотя в случае матрицы 100х100 - сильно увеличивает)

Видео: https://disk.yandex.ru/d/zeVdy1b0mC79cQ