forked from Alexey/DAS_2024_1
Merge pull request 'borschevskaya_anna_lab_5 is ready' (#63) from borschevskaya_anna_lab_5 into main
Reviewed-on: Alexey/DAS_2024_1#63
This commit is contained in:
commit
430fad9ef4
30
borschevskaya_anna_lab_5/README.md
Normal file
30
borschevskaya_anna_lab_5/README.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Отчет. Лабораторная работа 5
|
||||
|
||||
## Описание
|
||||
В рамках лабораторной работы была реализована программа, которая производит умножение матриц с применением последовательного и паралелльного алгоритма.
|
||||
При этом последовательный алгоритм достигается с помощью выделения одного потока на выполнение.
|
||||
|
||||
При указании одного потока подзадачи по умножению матриц полностью выполняются одним потоком. В качестве подзадачи было
|
||||
выбрано нахождение строки результирующей матрицы.
|
||||
|
||||
По условию задания необходимо было замерить результаты выполнения алгоритмов на квадратных матрицах размерами 100x100,
|
||||
300x300, 500x500. На всех прогонах можно увидеть, что последовательное выполнение умножения матриц происходит медленнее
|
||||
в несколько раз медленее. При этом чем больше потоков выделяется для выполнения подзадач, тем быстрее выполняется
|
||||
алгоритм параллельного умножения.
|
||||
|
||||
Результаты представлены на следующих изображениях:
|
||||
![100](images/100x100.PNG)
|
||||
![300](images/300x300.PNG)
|
||||
![500](images/500x500.PNG)
|
||||
|
||||
## Как запустить
|
||||
Необходимо иметь установленную JDK 21. Можно воспользоваться встроенным в нее компилятором (javac), а затем запустить исполняемый файл (java)
|
||||
или запускать из среды разработки.
|
||||
При запуске нужно указать аргументы командной строки:
|
||||
1. размер матриц (integer)
|
||||
2. режим отладки (boolean) - позволяет выводить в консоль исходные матрицы и промежуточные результаты работы
|
||||
|
||||
## Видео-отчет
|
||||
Работоспособность лабораторной работы можно оценить в следующем [видео](https://disk.yandex.ru/i/ZafQV9CGjBIKIw).
|
||||
Запуск происходил через IDEA с различными конфигурациями запуска (отличался размер умножаемых матриц и параметр отладки),
|
||||
чтобы увидеть результаты выполнения на матрицах всех размеров, необходимых по условию задачи.
|
BIN
borschevskaya_anna_lab_5/images/100x100.PNG
Normal file
BIN
borschevskaya_anna_lab_5/images/100x100.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
borschevskaya_anna_lab_5/images/300x300.PNG
Normal file
BIN
borschevskaya_anna_lab_5/images/300x300.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
borschevskaya_anna_lab_5/images/500x500.PNG
Normal file
BIN
borschevskaya_anna_lab_5/images/500x500.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
38
borschevskaya_anna_lab_5/matrix-mul/.gitignore
vendored
Normal file
38
borschevskaya_anna_lab_5/matrix-mul/.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
17
borschevskaya_anna_lab_5/matrix-mul/pom.xml
Normal file
17
borschevskaya_anna_lab_5/matrix-mul/pom.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>ru.uni.rvip</groupId>
|
||||
<artifactId>matrix-mul</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
</project>
|
@ -0,0 +1,98 @@
|
||||
package ru.uni.rvip;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
var size = Integer.parseInt(args[0]);
|
||||
var debugMode = Boolean.parseBoolean(args[1]);
|
||||
System.out.printf("Размер матриц %dx%d\n", size, size);
|
||||
|
||||
var matrix1 = createRandomMatrix(size);
|
||||
if (debugMode) {
|
||||
printMatrix(matrix1);
|
||||
}
|
||||
var matrix2 = createRandomMatrix(size);
|
||||
if (debugMode) {
|
||||
printMatrix(matrix2);
|
||||
}
|
||||
var startTime = System.currentTimeMillis();
|
||||
var result1 = mulMatrix(matrix1, matrix2, 1); // сначала передаем в метод 1 поток-исполнитель
|
||||
var timeOfExecution = System.currentTimeMillis() - startTime;
|
||||
if (debugMode) {
|
||||
printMatrix(result1);
|
||||
}
|
||||
System.out.printf("Время умножения матриц с помощью последовательного алгоритма: %d ms\n", timeOfExecution);
|
||||
|
||||
var threadCounts = new int[] {2, 4, 6, 8};
|
||||
for (var threadCount: threadCounts) { // тестирование на разном количестве потоков-исполнителей
|
||||
startTime = System.currentTimeMillis();
|
||||
var result2 = mulMatrix(matrix1, matrix2, threadCount);
|
||||
timeOfExecution = System.currentTimeMillis() - startTime;
|
||||
if (debugMode) {
|
||||
printMatrix(result2);
|
||||
}
|
||||
System.out.printf("Время умножения матриц с помощью параллельного алгоритма (%d threads): %d ms\n",threadCount, timeOfExecution);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static int[][] createRandomMatrix(Integer size) {
|
||||
var matrix = new int[size][size];
|
||||
var random = new Random();
|
||||
for (var i = 0; i < size; i++) {
|
||||
for (var j = 0; j < size; j++) {
|
||||
matrix[i][j] = random.nextInt(100);
|
||||
}
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
|
||||
private static int[][] mulMatrix(int[][] matrix1, int[][] matrix2, Integer threadCount) {
|
||||
if (matrix1[0].length != matrix2.length) {
|
||||
throw new IllegalArgumentException("Количество столбцов первой матрицы должна соответствовать количеству строк второй матрицы");
|
||||
}
|
||||
var rows = matrix2.length;
|
||||
var columns = matrix1[0].length;
|
||||
var result = new int[columns][rows];
|
||||
try (var executorService = Executors.newFixedThreadPool(threadCount)) {
|
||||
var futures = new ArrayList<Future<Integer>>();
|
||||
for (int i = 0; i < rows; i++) {
|
||||
final int rowI = i;
|
||||
futures.add(executorService.submit(() -> calculate(rowI, matrix1, matrix2, result)));
|
||||
}
|
||||
|
||||
for (var future : futures) {
|
||||
future.get();
|
||||
}
|
||||
|
||||
executorService.shutdown();
|
||||
return result;
|
||||
} catch (Exception ignored) {
|
||||
throw new RuntimeException("Ошибка во время выполнения алгоритма");
|
||||
}
|
||||
}
|
||||
|
||||
private static int calculate(int i, int[][] matrix1, int[][] matrix2, int[][] result) {
|
||||
for (int j = 0; j < matrix1[0].length; j++) {
|
||||
result[i][j] = 0;
|
||||
for (int k = 0; k < matrix2[0].length; k++) {
|
||||
result[i][j] += matrix1[i][k] * matrix2[k][j];
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
private static void printMatrix(int[][] matrix) {
|
||||
for (int[] ints : matrix) {
|
||||
for (int elem : ints) {
|
||||
System.out.printf("%5d\t", elem);
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user