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