diff --git a/kamyshov_danila_lab_5/README.md b/kamyshov_danila_lab_5/README.md new file mode 100644 index 0000000..00b9603 --- /dev/null +++ b/kamyshov_danila_lab_5/README.md @@ -0,0 +1,32 @@ +# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц + +Задание: + +Кратко: реализовать умножение двух больших квадратных матриц. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности. + +Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100, 300x300, 500x500 элементов. + +

+

Код
+ +

+

+

Код
+ +

+

+

Код
+ +

+

+

Работа программы
+ +

+ +Вывод: Параллельный алгоритм в условии данной задачи не имеет смысла использовать + +# Видео + +Видео с разбором лабораторной работы - https://drive.google.com/file/d/1Utik4HitmCrlgQ_1WLUZL2Rvek9uGVnR/view?usp=sharing diff --git a/kamyshov_danila_lab_5/screens/img1.png b/kamyshov_danila_lab_5/screens/img1.png new file mode 100644 index 0000000..91256f6 Binary files /dev/null and b/kamyshov_danila_lab_5/screens/img1.png differ diff --git a/kamyshov_danila_lab_5/screens/img2.png b/kamyshov_danila_lab_5/screens/img2.png new file mode 100644 index 0000000..86d96f3 Binary files /dev/null and b/kamyshov_danila_lab_5/screens/img2.png differ diff --git a/kamyshov_danila_lab_5/screens/img3.png b/kamyshov_danila_lab_5/screens/img3.png new file mode 100644 index 0000000..50e5337 Binary files /dev/null and b/kamyshov_danila_lab_5/screens/img3.png differ diff --git a/kamyshov_danila_lab_5/screens/img4.png b/kamyshov_danila_lab_5/screens/img4.png new file mode 100644 index 0000000..b4ab5e8 Binary files /dev/null and b/kamyshov_danila_lab_5/screens/img4.png differ diff --git a/kamyshov_danila_lab_5/src/main/java/org/example/MatrixMultiplication.java b/kamyshov_danila_lab_5/src/main/java/org/example/MatrixMultiplication.java new file mode 100644 index 0000000..309b371 --- /dev/null +++ b/kamyshov_danila_lab_5/src/main/java/org/example/MatrixMultiplication.java @@ -0,0 +1,100 @@ +package org.example; + +import java.util.Random; +import java.util.Scanner; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class MatrixMultiplication { + + public static int[][] sequentialMatrixMultiply(int[][] matrixA, int[][] matrixB) { + int rowsA = matrixA.length; + int colsA = matrixA[0].length; + int colsB = matrixB[0].length; + + int[][] result = new int[rowsA][colsB]; + + for (int i = 0; i < rowsA; i++) { + for (int j = 0; j < colsB; j++) { + for (int k = 0; k < colsA; k++) { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + } + + return result; + } + + public static int[][] parallelMatrixMultiply(int[][] matrixA, int[][] matrixB, int numThreads) throws InterruptedException { + int rowsA = matrixA.length; + int colsA = matrixA[0].length; + int colsB = matrixB[0].length; + + int[][] result = new int[rowsA][colsB]; + + ExecutorService executor = Executors.newFixedThreadPool(numThreads); + int chunkSize = rowsA / numThreads; + + for (int i = 0; i < numThreads; i++) { + int startRow = i * chunkSize; + int endRow = (i + 1) * chunkSize; + + executor.submit(() -> { + for (int row = startRow; row < endRow; row++) { + for (int col = 0; col < colsB; col++) { + for (int k = 0; k < colsA; k++) { + result[row][col] += matrixA[row][k] * matrixB[k][col]; + } + } + } + }); + } + + executor.shutdown(); + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); + + return result; + } + + public static void main(String[] args) { + int[] matrixSizes = {100, 300, 500}; + Scanner scanner = new Scanner(System.in); + + System.out.print("Введите количество потоков: "); + int numThreads = scanner.nextInt(); + + Random random = new Random(); + + for (int size : matrixSizes) { + int[][] matrixA = new int[size][size]; + int[][] matrixB = new int[size][size]; + + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + matrixA[i][j] = random.nextInt(10); + matrixB[i][j] = random.nextInt(10); + } + } + + long startTime = System.currentTimeMillis(); + int[][] sequentialResult = sequentialMatrixMultiply(matrixA, matrixB); + long sequentialTime = System.currentTimeMillis() - startTime; + + startTime = System.currentTimeMillis(); + try { + int[][] parallelResult = parallelMatrixMultiply(matrixA, matrixB, numThreads); + long parallelTime = System.currentTimeMillis() - startTime; + + System.out.println("Matrix size: " + size + "x" + size); + System.out.println("Sequential algorithm time: " + sequentialTime + " milliseconds"); + System.out.println("Parallel algorithm time (" + numThreads + " threads): " + parallelTime + " milliseconds"); + System.out.println("============================="); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + scanner.close(); + } +}