Files
2025-03-23 12:25:33 +04:00
..
2025-03-23 11:41:24 +04:00
2025-03-23 12:25:33 +04:00

Лабораторная работа №2

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

Вариант 3

Разделить элементы матрицы на среднее арифметическое всех ее элементов.

Как запустить лабораторную работу:

Команда запускает MPJ Daemon:

mpjdaemon -boot

MPJ Express запускает вашу программу App на двух процессах (-np 2), программа будет распределена в файле machines. Вводится размер входных данных 1000:

mpjrun.sh -np 2 -dev niodev -machinesfile machines App -- 1000

Какие технологии использовали:

Используется библиотека MPJ Express, которая используется для написания параллельных программ, способные выполняться на нескольких процессах или узлах, обмениваясь данными через сообщения.

Как работает программа:

  1. Программа инициализирует MPI. Это обязательный шаг для работы с MPI:

MPI.Init(args);

  1. rank — идентификатор текущего процесса (0, 1); size — общее количество процессов:

int rank = MPI.COMM_WORLD.Rank(); int size = MPI.COMM_WORLD.Size();

  1. Процесс с рангом 0 генерирует матрицу размером matrixSize x matrixSize.
  2. Процесс 0 вычисляет среднее значение всех элементов матрицы.
  3. Процесс 0 отправляет значение sred процессу 1 с использованием MPI-функций Send и Recv.
  4. Процесс 0 разделяет матрицу на две части: im1 — первая часть (остается у процесса 0); im2 — вторая часть (отправляется процессу 1). Процесс 1 получает свою часть матрицы.
  5. Каждый процесс обрабатывает свою часть матрицы с помощью метода DoAlgorithm. Внутри DoAlgorithm матрица делится на 4 части, и каждая часть обрабатывается асинхронно с использованием CompletableFuture.

if (rank == 0) { im1 = DoAlgorithm(im1, sred); } else if (rank == 1) { im2 = DoAlgorithm(im2, sred); }

  1. Процесс 1 отправляет обработанную часть матрицы обратно процессу 0.
  2. Процесс 0 собирает обработанные части матрицы в одну.
  3. Все процессы завершают работу с MPI:

MPI.Finalize();

Тесты:

Starting process <0> on < kseniya > Starting process <1> on < ksenia > Received sred: 4.997216944501581 Matrix processing completed. Time taken: 89550398 ns Stopping Process <0> on < kseniya > Stopping Process <1> on < ksenia >

Вывод:

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