forked from sevastyan_b/SSPR_25
valiulov_ilyas_lab_2 is ready
This commit is contained in:
74
valiulov_ilyas_lab_2/Main.java
Normal file
74
valiulov_ilyas_lab_2/Main.java
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import mpi.MPI;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
MPI.Init(args);
|
||||||
|
int rank = MPI.COMM_WORLD.Rank();
|
||||||
|
int size = MPI.COMM_WORLD.Size();
|
||||||
|
int[][] matrix = null;
|
||||||
|
int rows = 1000;
|
||||||
|
int cols = 1000;
|
||||||
|
long starttime = 0;
|
||||||
|
long endtime = 0;
|
||||||
|
|
||||||
|
if (rank == 0) {
|
||||||
|
matrix = MatrixGenerator.generateMatrix(rows, cols);
|
||||||
|
starttime = System.nanoTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
int halfRows = rows / 2;
|
||||||
|
int[] localMatrixFlat = new int[halfRows * cols];
|
||||||
|
|
||||||
|
if (rank == 0) {
|
||||||
|
int index = 0;
|
||||||
|
for (int i = halfRows; i < rows; i++) {
|
||||||
|
for (int j = 0; j < cols; j++) {
|
||||||
|
localMatrixFlat[index++] = matrix[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MPI.COMM_WORLD.Send(localMatrixFlat, 0, localMatrixFlat.length, MPI.INT, 1, 0);
|
||||||
|
index = 0;
|
||||||
|
for (int i = 0; i < halfRows; i++) {
|
||||||
|
for (int j = 0; j < cols; j++) {
|
||||||
|
localMatrixFlat[index++] = matrix[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (rank == 1) {
|
||||||
|
MPI.COMM_WORLD.Recv(localMatrixFlat, 0, localMatrixFlat.length, MPI.INT, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int[][] localMatrix = new int[halfRows][cols];
|
||||||
|
int index = 0;
|
||||||
|
for (int i = 0; i < halfRows; i++) {
|
||||||
|
for (int j = 0; j < cols; j++) {
|
||||||
|
localMatrix[i][j] = localMatrixFlat[index++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int localMax = findMaxInMatrix(localMatrix, rank);
|
||||||
|
System.out.println("Process " + rank + " local max: " + localMax);
|
||||||
|
|
||||||
|
int[] globalMax = new int[1];
|
||||||
|
MPI.COMM_WORLD.Reduce(new int[]{localMax}, 0, globalMax, 0, 1, MPI.INT, MPI.MAX, 0);
|
||||||
|
if (rank == 0) {
|
||||||
|
System.out.println("Global max element: " + globalMax[0]);
|
||||||
|
endtime = System.nanoTime();
|
||||||
|
long duration = (endtime - starttime);
|
||||||
|
System.out.println("Time: " + duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI.Finalize();
|
||||||
|
}
|
||||||
|
private static int findMaxInMatrix(int[][] matrix, int rank) {
|
||||||
|
int max = Integer.MIN_VALUE;
|
||||||
|
for (int[] row : matrix) {
|
||||||
|
for (int value : row) {
|
||||||
|
if (value > max) {
|
||||||
|
max = value;
|
||||||
|
System.out.println("New max "+max+" in container "+rank);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
}
|
||||||
14
valiulov_ilyas_lab_2/MatrixGenerator.java
Normal file
14
valiulov_ilyas_lab_2/MatrixGenerator.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MatrixGenerator {
|
||||||
|
public static int[][] generateMatrix(int rows, int cols) {
|
||||||
|
int[][] matrix = new int[rows][cols];
|
||||||
|
Random random = new Random();
|
||||||
|
for (int i = 0; i < rows; i++) {
|
||||||
|
for (int j = 0; j < cols; j++) {
|
||||||
|
matrix[i][j] = random.nextInt(100000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
}
|
||||||
66
valiulov_ilyas_lab_2/Readme.md
Normal file
66
valiulov_ilyas_lab_2/Readme.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
## Лабораторная работа №1.
|
||||||
|
|
||||||
|
Разработка параллельного MPI приложения на языке Java.
|
||||||
|
|
||||||
|
Вариант 5: Нужно определить максимальный элемент матрицы
|
||||||
|
|
||||||
|
**Необходимо:**
|
||||||
|
1. Разработать параллельный вариант алгоритма с применением MPI, где должны быть две копии приложения,
|
||||||
|
которые соединяются между собой по сети.
|
||||||
|
2. Замерить время работы алгоритма
|
||||||
|
|
||||||
|
**Используемые технологии**
|
||||||
|
1. MPJ Express - библиотека, реализующая MPI для Java.
|
||||||
|
|
||||||
|
**Запуск лабораторной работы**
|
||||||
|
1. `mpjdaemon -boot 192.168.5.107` - включение демона mpj-express на первом контейнере
|
||||||
|
2. `mpjdaemon -boot 192.168.5.106` - включение демона mpj-express на втором контейнере
|
||||||
|
3. `mpjrun.sh -np 2 -dev niodev Main` - запуск приложения
|
||||||
|
|
||||||
|
**Что делает программа**
|
||||||
|
1. Генерирация матрицы
|
||||||
|
2. Матрица разделяется на две половины. Половина матрицы отправляется во второй контейнер
|
||||||
|
3. Обработка матрицы и поиск локального максимального элемента в каждой половине
|
||||||
|
4. Определение глобального максимума
|
||||||
|
|
||||||
|
**Тесты**
|
||||||
|
```
|
||||||
|
mpjrun.sh -np 2 -dev niodev Main
|
||||||
|
MPJ Express (0.44) is started in the cluster configuration with niodev
|
||||||
|
Starting process <0> on <CT107>
|
||||||
|
Starting process <1> on <secondcontainer>
|
||||||
|
New max 36703 in container 0
|
||||||
|
New max 40049 in container 0
|
||||||
|
New max 93370 in container 1
|
||||||
|
New max 95505 in container 0
|
||||||
|
New max 97047 in container 0
|
||||||
|
New max 99536 in container 0
|
||||||
|
New max 99823 in container 0
|
||||||
|
New max 99875 in container 0
|
||||||
|
New max 99896 in container 0
|
||||||
|
New max 99901 in container 0
|
||||||
|
New max 99988 in container 0
|
||||||
|
New max 94820 in container 1
|
||||||
|
New max 98237 in container 1
|
||||||
|
New max 99825 in container 1
|
||||||
|
New max 99929 in container 1
|
||||||
|
New max 99965 in container 1
|
||||||
|
New max 99966 in container 1
|
||||||
|
New max 99975 in container 1
|
||||||
|
New max 99981 in container 1
|
||||||
|
New max 99996 in container 1
|
||||||
|
New max 99998 in container 1
|
||||||
|
New max 99999 in container 1
|
||||||
|
New max 99996 in container 0
|
||||||
|
New max 99998 in container 0
|
||||||
|
New max 99999 in container 0
|
||||||
|
Process 1 local max: 99999
|
||||||
|
Process 0 local max: 99999
|
||||||
|
Global max element: 99999
|
||||||
|
Time: 485045144
|
||||||
|
Stopping Process <0> on <CT107>
|
||||||
|
Stopping Process <1> on <secondcontainer>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вывод**
|
||||||
|
С помощью MPI можно реализировать паралельный алгоритм некоторой программы. Если сравнивать время поиска максимального элемента с алгоритмами, реализованными в прошлой лабораторной работе(ForkJoinPool и ThreadPoolExecutor), то на одних и тех же значения алгоритм с MPI работает быстрее.
|
||||||
2
valiulov_ilyas_lab_2/machines
Normal file
2
valiulov_ilyas_lab_2/machines
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
192.168.5.107
|
||||||
|
192.168.5.106
|
||||||
Reference in New Issue
Block a user