valiulov_ilyas_lab_2 is ready

This commit is contained in:
IlyasValiulov
2025-03-14 16:19:03 +04:00
parent 2e06257c82
commit 72f65194ab
4 changed files with 156 additions and 0 deletions

View 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;
}
}

View 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;
}
}

View 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 работает быстрее.

View File

@@ -0,0 +1,2 @@
192.168.5.107
192.168.5.106