MPJ Express

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).

Przydatne zasoby:

Konfiguracja

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;

MPJ API

MPJ udostępnia klasę MPI ze statycznymi polami/metodami, np.
  • MPI.Init
  • MPI.Finalize
  • MPI.COMM_WORLD.Size
  • MPI.COMM_WORLD.Rank
  • MPI.COMM_WORLD.Send
  • MPI.COMM_WORLD.Recv

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();
}

Zadanie 1

Pobierz projekt dla Eclipse IDE, a następnie dokonaj importu (File|Import, Existing Projects into Workspace, gdzie wybierając opcję Select archive file wskaż pobrany plik Browse...). Projekt zawiera:
  • szkielet klasy HelloEclipseWorld
  • plik jar z biblioteką MPJ (dodany do buildpath)
  • źródła do pliku jar (podpięte pod jar)
  • konfigurację uruchomieniową (launch configuration).

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
...

Zadanie 2

Przygotuj aplikację w oparciu o MPJ Express, symulującą token ring (patrz lab. 1). W tym celu zaimplementuj klasę MPINode, która:
  • w konstruktorze pobierze swoje id (rank) oraz rozmiar grupy COMM_WORLD
  • będzie posiadać dwie statyczne metody prywatne: sendInt oraz receiveInt
  • metodę isMasterNode
  • metodę process.

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);

Zadanie 3

W oparciu o MPJ Express zaimplementuj zadanie 2 z laboratorium 1.