# Лабораторная №2
Разработка параллельного MPI приложения на языке Java.
Необходимо разработать параллельный вариант алгоритма с применением MPI и
замерить время его работы. В рамках работы программы должно быть две копии
приложения, которые соединяются друг с другом по сети. Сообщения о статусе
соединения (например, что соединение установлено) должны выводиться в консоль.
Запуск каждого экземпляра MPI происходит в своём LXC контейнере. Такие
сервисы, как Docker, использовать нельзя.
**ВАЖНО**: Массив генерируется до работы всех вариантов алгоритмов. Все три
алгоритма обрабатывают три одинаковых массива. 
## Вариант и задание
22 Упорядочить столбцы матрицы по возрастанию первых элементов.
## Как запустить лабораторную работу
Минимальная требуемая версия jdk - 21.0.2
Я реализовывал на двух контейнерах Almalinux
Для запуска лабораторной работы нужно в директории с java файлами (внутри папки src) выполнить следующее:
* Скачать MPJ Express (последнюю версию, я скачивал через sourceforge.net) 2 контейнерах
* >wget https://sourceforge.net/projects/mpjexpress/files/latest/download -O mpjexpress.tar.gz
   tar -xvzf mpjexpress.tar.gz
   mv mpj-v*/ ~/mpjexpress
* Для удобства добавить переменные окружения MPJ_HOME PATH CLASSPATH
* При компиляции программы нужно использовать скачанные классы
  > javac -cp ~$MPJ_HOME/lib/mpj.jar Main.java
* .class Файлы у меня находятся на обоих контейнерах. 
* Запустить MPJ Daemon в каждом контейнере
  > mpjdaemon &
* Запуск программы
  > mpjrun.sh -np 2 -dev niodev Main 
* P.S. mpj для кластерного режима использует использует ssh. Так что отдельно нужно настроить ssh таким образом, чтобы коммуникация 
между контейнерами могла происходить без пароля. 
## Какие технологии использовались
В этой лабораторной использовались следующие технологии:
* MPJExpress - реализация MPI на Java.
* SSH - сетевой протокол для управления удаленными операционными системами
## Что она делает
Согласно заданию программа создает матрицу состоящую из 5000 строчек и 5000 столбцов. (достаточного объема)
Программа запускается с одним мастером и одним работником
в кластерном режиме. Программа разбивает матрицу попалам и передает половину матрицы 
второму контейнеру. Затем происходит сортировка внутри второго контейнера и возвращается матрица в первый контейнер.

## Результаты работы на матрице 5000 на 5000
```
MPJ Express (0.44) is started in the cluster configuration with niodev
Starting process <0> on <CT119>
Starting process <1> on <CT120>
Process 0 is running on: CT119 (192.168.19.119)
Process 1 is running on: CT120 (192.168.19.120)
Master: Sorted small matrix:
[1,      2,     3,   4,  5,   6]
[1410,   0,     50,  40, 80,  120]
[114200, 12300, 2100,400,100, 12400]
Master: Sorted small matrix:
[1,      2,     3,   4,  5,   6]
[1410,   0,     50,  40, 80,  120]
[114200, 12300, 2100,400,100, 12400]


Master: Sent large matrix parts to workers
Worker 1 on CT120 (192.168.19.120): Received submatrix:
640 317 194 535 331 827 899 127 172 175 401 218 729 762 70
184 515 365 553 87 351 26 260 637 12 961 657 114 938 562
68 772 244 810 827 461 329 230 380 260 989 412 885 938 264
189 794 648 104 359 628 153 579 300 381 873 732 582 3 275
326 309 857 256 528 416 21 369 154 206 102 549 914 947 414
203 266 795 892 462 673 3 686 186 858 863 19 752 881 449
990 267 891 707 613 619 699 407 859 406 321 97 540 196 311
874 721 941 287 957 12 407 778 313 778 6 162 649 546 853
797 751 941 724 865 511 654 860 283 643 962 107 916 919 245
815 8 992 17 646 736 802 954 802 589 243 716 692 898 154
954 602 562 700 779 726 445 488 810 793 482 207 697 691 736
841 757 190 409 992 354 806 967 722 943 425 601 862 797 176
226 145 876 491 57 653 603 972 585 692 4 527 201 420 291
270 475 90 769 914 205 333 207 160 165 586 10 24 216 732
445 32 717 114 761 344 761 722 109 866 867 667 140 160 960
Worker 1 on CT120 (192.168.19.120): Sorted submatrix sent back to master


Master: Final sorted large matrix (showing a small portion):
0   0  0   0   0   0   0   1  1   1   1   2   2   2   2
710 84 616 611 188 479 941 84 474 184 471 941 947 342 59
500 573 459 355 728 334 451 256 551 41 610 85 679 74 620
902 570 774 235 967 306 980 69 6 156 707 931 142 327 782
905 24 860 564 952 706 389 812 790 798 226 328 778 790 962
677 681 535 543 326 77 528 716 85 350 293 69 740 515 243
673 14 309 156 889 828 574 425 877 716 654 940 277 948 841
955 957 454 53 446 408 967 252 12 87 894 418 976 900 914
889 331 884 921 68 144 422 452 906 571 569 644 760 927 122
467 647 972 293 324 778 193 524 641 707 235 172 67 382 450
836 517 715 546 884 824 685 920 88 719 922 124 834 15 820
33 958 547 403 15 38 35 863 203 862 480 343 727 447 66
712 922 85 413 950 24 39 883 100 60 136 988 981 33 259
377 160 566 423 818 262 278 508 670 125 309 460 850 197 104
951 98 588 354 607 465 557 952 124 744 312 464 848 60 856


Sorting large matrix took 11441 milliseconds.
Stopping Process <0> on <CT119>
Stopping Process <1> on <CT120>
```
## Вывод
Итак, можно сделать вывод, что контейнеры успешно между собой взаимодействуют. 
Обмениваются данными и выдают корректный результат.

