Pull to refresh

Java как язык для параллельных вычислений. Установка, настройка, первая программа

Reading time 2 min
Views 19K
Здравствуйте,

Ни разу не видел за определённый промежуток своей работы с HPC людей, пишущих на Java параллельные программы. Сам писал кое-что на С, разглядывал Фортран, но душа всегда тянулась к Java. В конце концов сел и попробовал разобраться.

Содержание:
1) Имплементации MPI for Java; Что это? Где взять?
2) Как установить всё это? Как настроить?
3) Напишем свою самую-самую простую программу. Как её запустить?


Для вводной по параллельным технологиям можно обратиться к моему предыдущему посту.

1) Имплементации MPI for Java; Что это? Где взять?

Для Java имплементаций MPI существует две — mpiJava, насколько я знаю, уже дропнутая автором, и MPJ Express, имеющая в своем коллективе автора mpiJava и ещё нескольких талантливых разработчиков. Реализация нативно поддерживает две технологии — NIO и Myrinet. Поскольку Myrinet у меня под рукой не оказалось, тестировалось с NIO. Реализация работает подобно MPICH — на нужных узлах создаются процессы демонов, которые разговаривают между собой.

Сайт реализации. Довольно скудный, маловато примеров.

2) Как установить всё это? Как настроить?

Поехали. Площадка: SuSe 10.3 64-битная на 4 узлах; Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_16-b02, mixed mode).

//качаем 0.35 версию потому, что 0.36 ещё недостаточно обкатанная и возникают глюки, что //вылилось в трёхдневную переписку с разработчиком :-). Внимание: необходимо, чтобы на всех //узлах была установлена JVM одинаковых версий!

wget «sourceforge.net/projects/mpjexpress/files/releases/mpj-v0_35.tar.gz/download»
tar xvf mpj-v0_35.tar.gz
cd mpj-v0_35
ant (если не установлен ant, его надо бы установить)


Лучше всего будет, если папка MPJ Express будет каким бы то ни было образом расшарена на все узлы, чтобы не возникало необходимости ложить ее по одному и тому же пути вручную.

Теперь необходимо поправить пути. Я пользуюсь ZSH, от Bash отличается только названием файла.
В файл /etc/zshenv надо добавить следующее:
export JAVA_HOME=путь_к_java
export MPJ_HOME=путь_к_MPJ
export PATH=$PATH:$MPJ_HOME/bin


Просто в /.zshrc не прокатит — нужно, чтобы пути выдавались и по выполнению команды SSH.
Сделать это, разумеется, надо на всех узлах.

Для удобства положим самую нужную библиотеку (/путь_к_mpj/lib/mpj.jar) в /ext/lib. На всех узлах!

Можно пробовать запускать демоны. Создадим файл machines, где укажем нужные узлы:
node-1
node-2
node-3

и запустим /путь_к_mpj/bin/mpjboot machines — наших демонов. Проверить работоспособность можно прямо тут — если создались файлы *.pid по одному для каждого демона, значит всё ОК. Если создались и пропали через пару секунд — значит проблемы с JVM. Не создались — JVM вообще нет. :-) Диагностировать все проблемы можно с помощью утилиты, лежащей тут же в bin — mpjdaemon_linux_x86_64 с ключом console.

Готово.

3) Напишем свою самую-самую простую программу. Как её запустить?

Программа — проще не бывает.
import mpi.*;

public class HelloWorld {

        public static void main(String args[]) throws Exception {
                  MPI.Init(args);
                  int me = MPI.COMM_WORLD.Rank();
                  int size = MPI.COMM_WORLD.Size();
                  System.out.println("Hello world from <"+me+"> from <"+size);
                  MPI.Finalize();
               }
}



Пояснения:
Инициализируем параллельную секцию (.Init), создаём два примитива me & size (идентификатор узла и количество узлов в пуле), выведем «Привет, мир!» и закроем параллельную секцию.

На этом всё. Будут достижения — буду делиться. А пока, может, этот пост заинтересовал кого-нибудь и сподвиг на более великие свершения.

Tags:
Hubs:
+28
Comments 43
Comments Comments 43

Articles