DAS_2023_1/tepechin_kirill_lab_5/README.md

1.9 KiB
Raw Blame History

Лабораторная работа №5, Тепечин Кирилл

Код

Обычный код

public static int[][] multiplySync(int[][] a, int[][] b) {
    final int[][] result = new int[a.length][b[0].length];
    for (int i = 0; i < a.length; ++i) {
        for (int j = 0; j < b[0].length; ++j) {
            result[i][j] = calculateSingleValue(i, j, a, b);
        }
    }
    return result;
}

private static int calculateSingleValue(int i, int j, int[][] a, int[][] b) {
    int result = 0;
    for (int k = 0; k < a[0].length; ++k) {
        result += a[i][k] * b[k][j];
    }
    return result;
}

Параллельный код

final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

public static int[][] multiplyAsync(int[][] a, int[][] b, ExecutorService executor) throws InterruptedException {
    final int[][] result = new int[a.length][b[0].length];
    for (int i = 0; i < a.length; ++i) {
        final int fi = i;
        executor.execute(() -> {
            for (int j = 0; j < b[0].length; ++j) {
                for (int k = 0; k < a[0].length; ++k) {
                    result[fi][j] += a[fi][k] * b[k][j];
                }
            }
        });
    }
    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.DAYS);
    return result;
}

Тесты

Тесты проводились на 16 потоках

result

Выводы

  • На матрице 100x100 последовательное вычисление быстрее, затрачивается всего 3 мс.

  • На матрице 300x300 вычисления занимают примерно одинаковое время.

  • На матрице 500x500 параллельное вычисление выполняется уже в 4 раза быстрее

Ссылка на видео

https://youtu.be/GPjedqzwvt4