Hauptseminar 2001 „Parallele Programmierung in Java“ - JPVM- Java Parallel Virtual Machine Referent: Sebastian Steininger
Einführung zWas ist MPI? zWas ist PVM? zWas ist jPVM? zWas ist JPVM?
was ist MPI? z„message passing interface“ zweltweiter Standard für „message passing programs“ zvereint die Vorteile mehrerer bereits bestehender Systeme
Was ist PVM? zStandard Software für distributed computing zNetzwerk agiert als ein großes System zin C/C++ und Fortran
Was ist jPVM? zin Java geschriebenes Interface zur PVM zbedient sich der native methods capability von Java zRechner müssen Java und PVM unterstützen
Was ist jPVM? zbestehende PVM-Programme wiederverwendbar
Was ist JPVM? zPVM in Java implementiert zexplizites message passing wie in PVM zdiverse syntaktische und semantische Veränderungen zur Anpassung an den Java-Programmierstil
Was ist JPVM? zUmstieg von PVM nach JPVM unkompliziert zVerbesserungen durch thread safety, multiple communication end-points (CEP) pro Task, maximale Portabilität
Was ist JPVM? zerschließung bis dato vom Network Parallel Computing ausgeschlossener Architekturen, wie Mac und Windows NT
Arbeitsweise der JPVM zInterface zErzeugung von Tasks zmessage passing zKommunikationsimplementierung zSystemkonfiguration
JPVM: Interface zwichtigste Klasse: jpvmEnviroment zjpvmEnviroment-Objekt entspricht CEP zwerden mit Identifikatoren vom Typ jpvmTaskId versehen zSchnittstelle zu den wichtigsten JPVM- Diensten
JPVM: Interface
JPVM: Taskgenerierung zpvm_spawn() zJeder neue Task erzeugt seine eigene Instanz der JVM. zVerteilung dieser Instanzen auf den Hostpool
JPVM: Taskgenerierung zJede JVM-Instanz verwaltet ein Task- Objekt (z. B. der Klasse „worker“). zpvm_spawn() gibt die ID des ersten erzeugten jpvmEnviroment-Objekts in einem neuen Task zurück zBeibehaltung der PVM-Signatur
JPVM: Message Passing zpvm_send() und pvm_recv() zZusammenfassung der Daten in einem jpvmBuffer
JPVM: Message Passing class jpvmBuffer { //ctor public jpvmBuffer(); //buffering public void pack(int v[], int n, int stride); public void pack(int s); public void pack(float v[], int n, int stride); public void pack(float s);... //extracting public void unpack(int v[], int n, int stride); public int upkint(); public void unpack(float v[], int n, int stride); public float upkfloat();... };
JPVM: Message Passing zzwei Methodengruppen: Packen und Extrahieren zÜberladung => einfacherer Code zOperationen für alle Grundtypen in skalarer Form und Vektorform
JPVM: Message Passing zasynchrones message passing zSendeparameter: Task-ID und message tag zEmpfangsparameter: keine, Task-ID oder message tag, Task-ID und message tag
JPVM: Message Passing zblock bis Nachricht empfangen zRückgabe einer jpvmMessage
JPVM: Message Passing class jpvmMessage { public int messageTag; public jpvmTaskId sourceTid; public jpvmBuffer buffer; };
JPVM: Kommunikation zTCP zein server socket pro jpvmEnviroment zjpvmTaskId kapselt IP und Port für TCP- Verbindung zthread safety
JPVM: Kommunikation
zinterne Warteschlange synchronisiert zmehrere Leser und Schreiber gleichzeitig zpvm_recv() fragt Warteschlange ab zpvm_send() synchronized
JPVM: Systemkonfiguration zein Daemon pro CPU zmanuelles Erzeugen von jpvmDaemon- Objekten zDaemons hauptsächlich für Taskgenerierung zuständig
JPVM: Systemkonfiguration zAnmeldung der Daemons über Konsolenprogramm: jpvmConsole zDaemon wartet auf Anfragen von Clients zdirekte Antwort auf Anfragen wie Taskstatus und Systeminformationen
JPVM: Systemkonfiguration zStarten eines neuen Threads bei Taskgenerierung => niedrigere Wartezeiten für andere Anfragen
JPVM: Beispiel import jpvm.*; class example { public static void main(String args[]) { try { jpvmEnvironment jpvm = new jpvmEnvironment(); // Spawn N worker tasks jpvmTaskId tids[] = new jpvmTaskId[N]; jpvm.pvm_spawn("worker",N,tids); for (int i=0;i<N; i++) { // Farm out work jpvmBuffer buf = new jpvmBuffer(); int work = getWork(i); buf.pack(data); jpvm.pvm_send(buf, tids[i], 123); } for (int i=0;i<N; i++) { // Receive results jpvmMessage message = jpvm.pvm_recv(tids[i]); int result = message.buffer.upkint(); processResult(result); } jpvm.pvm_exit(); } catch (jpvmException jpe) { System.out.println("Error - jpvm exception"); } } };
JPVM: Performance
JPVM/jPVM/PVM: Performancevergleich
Folgerungen zJPVM noch nicht „getuned“ zVerbesserungen im Bereich der JITs möglich zJPVM-Anwendungen portabler und viel einfacher zu warten als PVM- oder jPVM- Anwendungen