From 66525b2d4b441372542fe5d32c0d175352354b6d Mon Sep 17 00:00:00 2001 From: yulia Date: Wed, 10 Jan 2024 03:52:28 +0400 Subject: [PATCH] podkorytova_yulia_lab_5 is ready --- podkorytova_yulia_lab_5/README.md | 62 ++++++++++++++++++ podkorytova_yulia_lab_5/app/src/Main.java | 74 ++++++++++++++++++++++ podkorytova_yulia_lab_5/images/result.JPG | Bin 0 -> 35358 bytes 3 files changed, 136 insertions(+) create mode 100644 podkorytova_yulia_lab_5/README.md create mode 100644 podkorytova_yulia_lab_5/app/src/Main.java create mode 100644 podkorytova_yulia_lab_5/images/result.JPG diff --git a/podkorytova_yulia_lab_5/README.md b/podkorytova_yulia_lab_5/README.md new file mode 100644 index 0000000..1b73b50 --- /dev/null +++ b/podkorytova_yulia_lab_5/README.md @@ -0,0 +1,62 @@ +# Лабораторная работа 5. Параллельное умножение матриц +### Задание на лабораторную работу +Кратко: реализовать умножение двух больших квадратных матриц. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности. +*** +### Описание работы +Обычный алгоритм реализован в методе `multiplySequential`: +``` +public static int[][] multiplySequential(int[][] m1, int[][] m2) { + int size = m1.length; + int[][] res = new int[size][size]; + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + for (int k = 0; k < size; k++) { + res[i][j] += m1[i][k] * m2[k][j]; + } + } + } + + return res; +} +``` +Параллельный алгоритм реализован в методе `multiplyParallel`: +``` +public static int[][] multiplyParallel(int[][] m1, int[][] m2, int threadCount) throws InterruptedException { + int size = m1.length; + int[][] res = new int[size][size]; + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < size; i++) { + int r = i; + executor.submit(() -> { + for (int j = 0; j < size; j++) { + for (int k = 0; k < size; k++) { + res[r][j] += m1[r][k] * m2[k][j]; + } + } + }); + } + executor.shutdown(); + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); + + return res; +} +``` +В методе создается пул потоков с помощью `ExecutorService` и указанным количеством потоков `threadCount`. +Затем для каждой строки матрицы m1, создается задача, которая будет выполняться параллельно в отдельном потоке. +Каждый поток берет на себя определенную строку матрицы m1 и умножает ее на соответствующие столбцы матрицы m2, результат умножения записывается в соответствующую ячейку результирующей матрицы res. +Так каждый поток работает над своей зоной ответственности в матрицах и выполняет умножение независимо от других потоков. + + +*** +### Результаты +***Результат работы*** +![](images/result.jpg) + +На матрицах размером 100x100 последовательный алгоритм справляется быстрее параллельного, а на матрицах размером 300x300 и 500x500 наоборот - параллельный алгоритм справляется быстрее последовательного. + +***Вывод:*** при небольших размерах матриц использование параллельного алгоритма дает проигрыш в производительности использованию последовательного алгоритма. Параллельное умножение матриц будет эффективнее, если размер матриц достаточно большой. + +### Ссылка на видео: +https://drive.google.com/file/d/1jnSD5FNua2payHZc3k18vfhxaAN31Q4A/view?usp=sharing \ No newline at end of file diff --git a/podkorytova_yulia_lab_5/app/src/Main.java b/podkorytova_yulia_lab_5/app/src/Main.java new file mode 100644 index 0000000..0f3a8b0 --- /dev/null +++ b/podkorytova_yulia_lab_5/app/src/Main.java @@ -0,0 +1,74 @@ +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class Main { + public static void main(String[] args) throws InterruptedException { + int[] sizes = new int[] {100, 300, 500}; + for (int i = 0; i < sizes.length; i++) { + System.out.println("Время выполнения умножения двух матриц размером " + sizes[i] + "х" + sizes[i] + ":"); + int[][] m1 = generateMatrix(sizes[i]); + int[][] m2 = generateMatrix(sizes[i]); + + long start= System.currentTimeMillis(); + int[][] resultSequential = multiplySequential(m1, m2); + long end = System.currentTimeMillis(); + long sequentialTime = end - start; + System.out.println("Обычный (последовательный) алгоритм - " + sequentialTime + " мс"); + + int threadCount = 10; + start = System.currentTimeMillis(); + int[][] resultParallel = multiplyParallel(m1, m2, threadCount); + end = System.currentTimeMillis(); + long parallelTime = end - start; + System.out.println("Параллельный алгоритм c " + threadCount + " потоками - " + parallelTime + " мс\n"); + } + } + + public static int[][] generateMatrix(int size) { + int[][] m = new int[size][size]; + Random random = new Random(); + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + m[i][j] = random.nextInt(100); + } + } + + return m; + } + + public static int[][] multiplySequential(int[][] m1, int[][] m2) { + int size = m1.length; + int[][] res = new int[size][size]; + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + for (int k = 0; k < size; k++) { + res[i][j] += m1[i][k] * m2[k][j]; + } + } + } + + return res; + } + + public static int[][] multiplyParallel(int[][] m1, int[][] m2, int threadCount) throws InterruptedException { + int size = m1.length; + int[][] res = new int[size][size]; + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < size; i++) { + int r = i; + executor.submit(() -> { + for (int j = 0; j < size; j++) { + for (int k = 0; k < size; k++) { + res[r][j] += m1[r][k] * m2[k][j]; + } + } + }); + } + executor.shutdown(); + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); + + return res; + } +} \ No newline at end of file diff --git a/podkorytova_yulia_lab_5/images/result.JPG b/podkorytova_yulia_lab_5/images/result.JPG new file mode 100644 index 0000000000000000000000000000000000000000..a822ae9bd8c266e5338d5f86e3dc6c14656118fa GIT binary patch literal 35358 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 Jp8d1%zW|wM_#glP literal 0 HcmV?d00001