# Лабораторная №1
Разработка параллельного MPI приложения на языке Java.
Необходимо разработать параллельный вариант алгоритма с применением MPI и
замерить время его работы. В рамках работы программы должно быть две копии
приложения, которые соединяются друг с другом по сети. Сообщения о статусе
соединения (например, что соединение установлено) должны выводиться в консоль.
Запуск каждого экземпляра MPI происходит в своём LXC контейнере. Такие
сервисы, как Docker, использовать нельзя.

## Вариант и задание
17 Упорядочить строки матрицы по убыванию суммы элементов.

## Как запустить лабораторную работу
* Скачать MPJ Express на два (или более) контейнера
* Добавить переменные окружения MPJ_HOME
  > export MPJ_HOME=/path/to/mpj/
  > export PATH=$MPJ_HOME/bin:$PATH
* При компиляции программы нужно использовать скачанные классы, скомпилировать во всех контейнерах
  > javac -cp ~$MPJ_HOME/lib/mpj.jar MatrixSortMPI.java
* Запустить MPJ Daemon в каждом контейнере (используется файл macines с IP)
  > mpjboot machines
* Запуск программы (с отключением всего вывода кроме консольного)
  > mpjrun.sh -np 2 -dev niodev MatrixSortMPI 2>/dev/null
mpj для кластерного режима использует использует ssh, поэтому надо настроить его между контейнерами.

## Какие технологии использовались
Программа использует MPI (Message Passing Interface) для параллельных вычислений и обмена данными между процессами, Java для реализации алгоритма (работа с массивами, генерация случайных чисел, измерение времени) и LXC-контейнеры для изоляции процессов и эмуляции распределённой системы.

## Что она делает
Программа генерирует матрицу, распределяет её части между процессами, вычисляет суммы строк, собирает результаты на главном процессе, сортирует строки по убыванию суммы и переставляет их. В конце выводится время выполнения каждого этапа для анализа производительности.

## Результаты работы
```
MPJ Express (0.44) is started in the cluster configuration with niodev
Starting process <0> on <CT116>
Starting process <1> on <CT118>
Процесс 0 запущен на 192.168.16.116
Процесс 0: генерация матрицы
Процесс 1 запущен на 192.168.16.118
Процесс 0: генерация матрицы
Процесс 1: получение данных через Scatter
Процесс 0: получение данных через Scatter
Процесс 0: вычисление сумм строк
Процесс 1: вычисление сумм строк
Процесс 1: получение отсортированных индексов через Bcast
Процесс 0: сортировка строк по сумме
Процесс 0: получение отсортированных индексов через Bcast
Процесс 0: перестановка строк
Процесс 1: перестановка строк
Процесс 0: отправка данных через Gather
Процесс 1: отправка данных через Gather
Процесс 0: финальные результаты
Время генерации: 117 мс
Время суммирования: 31 мс
Время сортировки: 101 мс
Время перестановки: 58 мс
Общее время: 421 мс
Stopping Process <0> on <CT116>
Stopping Process <1> on <CT118>
```

## Вывод
Программа успешно выполняет параллельную сортировку строк матрицы по убыванию суммы их элементов с использованием MPI. Время выполнения каждого этапа выводится в консоль, что позволяет оценить эффективность работы программы. Контейнеры успешно взаимодействуют между собой, обмениваются данными и выдают результат.


