Biblioteka MPJ Express jest implementacją MPI (ang. Message Passing Interface) dla języka Java. Umożliwia przetwarzanie w ramach jednej maszyny (mutlicore), bądź w wersji rozproszonej (clustered).
Dodaj export zmiennej środowiskowej $MPJ_HOME:
export MPJ_HOME=/a/local/proactive/mpj-v0_38
Jeżeli chcemy uruchomić MPJ na komputerach tworzących klaster, można skorzystać ze skryptu mpjboot machines, gdzie plik machines zawiera nazwy hostów. Wykorzystuje on protokól ssh do zdalnego wykonywania poleceń. Dlatego warto dodać swój klucz publiczny do ssh-agenta, by móc logować się do innych komputerów bez podawania hasła. W tym celu wygeneruj klucz oraz dodaj go do uwierzytelnionych kluczy. Aby móc skorzystać z klucza, uruchom ssh-agenta:
ssh-keygen cat .ssh/id_rsa.pub >> .ssh/authorized_keys; ssh-agent; ssh-add;
Przykładowa metoda main inicjalizująca środowisko MPJ:
public static void main(String[] args) throws Exception { MPI.Init(args); // Tutaj możemy umieścić kod: // MpiNode node = new MpiNode(); // node.process(); MPI.Finalize(); }
Edycja konfiguracji uruchomieniowej w Eclipse: Run|Run configurations..., wybór odpowiedniej pozycji w poddrzewie Java Application. Ustawienia znajdują się np. w zakładce Arguments. W zakładce Environment dodaj zmienną MPJ_HOME.
Przetestuj program dodając metodę sayHello() do klasy MpiNode
final String hostname = Inet4Address.getLocalHost().getHostName(); final StringBuilder sb = new StringBuilder(); sb.append("Hello from ").append(hostname); System.out.println(sb.toString());
Aby uruchomić program na kilku węzłach (komputerach), dopisz do argumentów JVM konfiguracji uruchomieniowej (Run|Run configurations...|Arguments) opcję -dev niodev. W pliku machines umieść nazwy komputerów, na których ma być uruchomiona aplikacja, np.:
lab-143-6 lab-143-5 ...
Wysyłanie można zrealizować w sposób przedstawiony poniżej. Odbiór jest analogiczny, przy czym można użyć stałej MPI.ANY_SOURCE oraz MPI.ANY_TAG:
int[] buff = new int[] { payload }; MPI.COMM_WORLD.Send(buff, 0, 1, MPI.INT, sendto, DEFAULT_TAG); // odbiór: MPI.COMM_WORLD.Recv(.., MPI.ANY_SOURCE, MPI.ANY_TAG);
W oparciu o MPJ Express zaimplementuj zadanie 2 z laboratorium 1.