110 likes | 235 Views
Parallel Virtual Machine (PVM) Überblick. PVM unterstützt: verteilungstransparente Programmierung Kommunikation durch Nachrichten einfache Lastverteilung dynamische Integration/Ausschluss von Rechnern
E N D
Parallel Virtual Machine (PVM)Überblick • PVM unterstützt: • verteilungstransparente Programmierung • Kommunikation durch Nachrichten • einfache Lastverteilung • dynamische Integration/Ausschluss von Rechnern • PVM unterstützt heterogene Applikationen (bzgl. Programmiersprache, Rechnerarchitektur),ABERhier Einsatz einer speziellen Java-Version.
PVM-Installation • Gesamtpaket/Bibliotheken liegen unterhttp://www.inf.fu-berlin.de/lehre/WS99/VS/(Aufgaben Material) • jpvm.jar und die Applikationsklassen müssen im CLASSPATH liegen, d.h. die Variable CLASSPATH muss richtig gesetzt sein (Kommandozeilenparameter reicht nicht).
PVM-Initialisierung # Starten eines Dämons auf allen Rechnern hi > java jpvm.jpvmDaemon jpvm daemon: hi, port #pi # Starten der Console+Dämon auf lokalem Rechner > java jpvm.jpvmConsole jpvm> # Jeden entfernten Rechner eintragen (für alle ilokal) jpvm> add Host name : hi Port number : pi # Testen, ob alle angemeldet sind jpvm> ps h1, 0 tasks: ... Local, 1 tasks: jpvm Console
PVMProgrammstart etc. • Start von PVM-Applikationen wie Java-Applikationen auf beliebigem Rechner mit Dämonen (Adresse in lokalem File, z.B. /tmp/jpvmd.USER, c:\Temp\jpvmd-USER.txt) • Herunterfahren des Gesamtsystems mit dem Befehl halt auf der PVM-KonsoleAktive PVM-Applikationen werden nicht beendet! • Bei Problemen mit dem Hochfahren von PVM alle alten Referenzdateien löschen.
JPVM-Basisklassen • JPVM-Task Instanz von jpvmEnvironment • JPVM-Task hat eindeutigen Namen jpvmTaskId • Aufsetzen von Nachrichten mittelsclass jpvmBuffer { public jpvmBuffer(); // generiert leere Instanz // Füllmethode für (fast) jeden Datentyp <t> public void pack(<t> val); public void pack(<t> vs[],int n,int stride); //Zugriffsmethode für skalare Datentypen <t> public <t> upk<t>(); public void unpack(<t> vals[],int n,int stride););jpvmBuffer dürfen nach dem Senden nicht mehr manipuliert werden! • Entgegennahme von Nachrichten mittelsclass jpvmMessage { public int messagetag; //zur Klassifizierung public jpvmTaskId sourceTid; // Quelle public jpvmBuffer buffer; // Inhalt}
JPVM - Senden und Empfangen class jpvmEnvironment { // Senden von Nachrichten // an einzelne JPVM-Tasks public void pvm_send(jpvmBuffer buf, // was jpvmTaskId tid, // wohin int tag); // Nachrichtenart // an mehrere JPVM-Tasks public void pvm_mcast(jpvmBuffer bug,jpvmTaskID tids[], int ntids, int tag); // Empfangen von Nachrichten public jpvmMessage pvm_recv(); // blockierend public jpvmMessage pvm_nrecv(); // nichtblockierend public boolean pvm_probe();// Test, ob Nachricht da ist }
JPVM-Erzeugen neuer Tasks • Methode in jpvmEnvironment:int pvm_spawn(String cls, //Name der Java-Klasse int num, // Anzahl der neuen Tasks jpvmTaskId tids[]// Container für ); // die neuen TaskIDs • Erzeugung von num JVM • Aufruf von cls.main({}) in jeder JVM • Anzahl erzeugter Tasks als Rückgabe (-1 Fehler) • Zeit- und speicheraufwendiges Starten paralleler verteilter Tasks • Kontaktaufnahme zum PVM-System durch Instanziierung von jpvmEnvironment • Neue Tasks haben keine Standard Ein-/Ausgabe. (Debugging mit Files, flush() nicht vergessen).
JPVM-Was noch fehlt... • Eigene TaskId: jpvmTaskId pvm_mytid() • falls Erzeugung mit spawn, TaskID des Vaters jpvmTaskId pvm_parent() • Abmelden beim JPVM Systemvoid pvm_exit(); • Möglicher Programmieransatz SPMD (Single Program Multiple Data) • jede verteilte, parallele Komponente benutzt das gleiche Programm (die gleiche Java-Klasse) • die Ausführung ist abhängig von internen Daten (z.B. „Wurde ich mit spawn erzeugt oder direkt vom Nutzer?“)
JPVM- Ein einfaches Beispiel import jpvm.*; public class Hello { public static void main(String args[]) { // connect to JPVM jpvmEnvironment jpvm = new jpvmEnvironment(); if (jpvm.pvm_parent() == null) { // I‘m the master, create servants... jpvmTaskId servants = new jpvmTaskId[5]; int res = jpvm.pvm_spawn(“Hello“,5, servants);} else { // I‘m the servant.. out = new FileWriter(jpvm.mytid.toString()); out.write(“I‘m alive...“); } jpvm.exit(); // finished } }
Bewertung von parallelen Applikationen • Beschleunigung (Speedup): • Effizienz (Efficiency): • Für t1 sollte eine sequentielle Programmversion gemessen werden. • Amdahls Gesetz: Lineare Beschleunigung S Übliche Beschleunigung n
GnuPlot in 5 Minuten # n t(ms) 1 100 2 60 3 45 4 40 5 37 • Zweidimensionale Messdaten in einem File plot.dat • Starten von GnuPlot: Hostname> gnuplot gnuplot> plot “plot.dat“ title “Aufgabe2“ gnuplot> set output “plot.eps“ gnuplot> set terminal postscript eps gnuplot> replot gnuplot> quit Hostname>