.. | ||
src | ||
README.md | ||
result.png |
Лабораторная работа №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 потоках
Выводы
-
На матрице 100x100 последовательное вычисление быстрее, затрачивается всего 3 мс.
-
На матрице 300x300 вычисления занимают примерно одинаковое время.
-
На матрице 500x500 параллельное вычисление выполняется уже в 4 раза быстрее