## Лабораторная работа №5, Тепечин Кирилл ### Код #### Обычный код ````java 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; } ```` #### Параллельный код ````java 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](result.png) ### Выводы * На матрице 100x100 последовательное вычисление быстрее, затрачивается всего 3 мс. * На матрице 300x300 вычисления занимают примерно одинаковое время. * На матрице 500x500 параллельное вычисление выполняется уже в 4 раза быстрее ### Ссылка на видео https://youtu.be/GPjedqzwvt4