320 likes | 429 Views
Hauptseminar 2001 „Parallele Programmierung in Java“ - JPVM- Java Parallel Virtual Machine Referent: Sebastian Steininger. Einführung. Was ist MPI? Was ist PVM? Was ist jPVM? Was ist JPVM?. was ist MPI?. „message passing interface“ weltweiter Standard für „message passing programs“
E N D
Hauptseminar 2001 „Parallele Programmierung in Java“ - JPVM- Java Parallel Virtual Machine Referent: Sebastian Steininger
Einführung • Was ist MPI? • Was ist PVM? • Was ist jPVM? • Was ist JPVM?
was ist MPI? • „message passing interface“ • weltweiter Standard für „message passing programs“ • vereint die Vorteile mehrerer bereits bestehender Systeme
Was ist PVM? • Standard Software für distributed computing • Netzwerk agiert als ein großes System • in C/C++ und Fortran
Was ist jPVM? • in Java geschriebenes Interface zur PVM • bedient sich der native methods capability von Java • Rechner müssen Java und PVM unterstützen
Was ist jPVM? • bestehende PVM-Programme wiederverwendbar
Was ist JPVM? • PVM in Java implementiert • explizites message passing wie in PVM • diverse syntaktische und semantische Veränderungen zur Anpassung an den Java-Programmierstil
Was ist JPVM? • Umstieg von PVM nach JPVM unkompliziert • Verbesserungen durch thread safety, multiple communication end-points (CEP) pro Task, maximale Portabilität
Was ist JPVM? • erschließung bis dato vom Network Parallel Computing ausgeschlossener Architekturen, wie Mac und Windows NT
Arbeitsweise der JPVM • Interface • Erzeugung von Tasks • message passing • Kommunikationsimplementierung • Systemkonfiguration
JPVM: Interface • wichtigste Klasse: jpvmEnviroment • jpvmEnviroment-Objekt entspricht CEP • werden mit Identifikatoren vom Typ jpvmTaskId versehen • Schnittstelle zu den wichtigsten JPVM-Diensten
JPVM: Taskgenerierung • pvm_spawn() • Jeder neue Task erzeugt seine eigene Instanz der JVM. • Verteilung dieser Instanzen auf den Hostpool
JPVM: Taskgenerierung • Jede JVM-Instanz verwaltet ein Task-Objekt (z. B. der Klasse „worker“). • pvm_spawn() gibt die ID des ersten erzeugten jpvmEnviroment-Objekts in einem neuen Task zurück • Beibehaltung der PVM-Signatur
JPVM: Message Passing • pvm_send() und pvm_recv() • Zusammenfassung der Daten in einem jpvmBuffer
JPVM: Message Passing class jpvmBuffer {//ctorpublic jpvmBuffer();//bufferingpublic 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); ...//extractingpublic 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 • zwei Methodengruppen:Packen und Extrahieren • Überladung => einfacherer Code • Operationen für alle Grundtypen in skalarer Form und Vektorform
JPVM: Message Passing • asynchrones message passing • Sendeparameter: Task-ID und message tag • Empfangsparameter: keine, Task-ID oder message tag, Task-ID und message tag
JPVM: Message Passing • block bis Nachricht empfangen • Rückgabe einer jpvmMessage
JPVM: Message Passing class jpvmMessage {public int messageTag;public jpvmTaskId sourceTid;public jpvmBuffer buffer;};
JPVM: Kommunikation • TCP • ein server socket pro jpvmEnviroment • jpvmTaskId kapselt IP und Port für TCP-Verbindung • thread safety
JPVM: Kommunikation • interne Warteschlange synchronisiert • mehrere Leser und Schreiber gleichzeitig • pvm_recv() fragt Warteschlange ab • pvm_send() synchronized
JPVM: Systemkonfiguration • ein Daemon pro CPU • manuelles Erzeugen von jpvmDaemon-Objekten • Daemons hauptsächlich für Taskgenerierung zuständig
JPVM: Systemkonfiguration • Anmeldung der Daemons über Konsolenprogramm: jpvmConsole • Daemon wartet auf Anfragen von Clients • direkte Antwort auf Anfragen wie Taskstatus und Systeminformationen
JPVM: Systemkonfiguration • Starten 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 tasksjpvmTaskId tids[] = new jpvmTaskId[N];jpvm.pvm_spawn("worker",N,tids);for (int i=0;i<N; i++) { // Farm out workjpvmBuffer 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"); } }};
Folgerungen • JPVM noch nicht „getuned“ • Verbesserungen im Bereich der JITs möglich • JPVM-Anwendungen portabler und viel einfacher zu warten als PVM- oder jPVM-Anwendungen