Date post: | 06-Apr-2015 |
Category: |
Documents |
Upload: | elldrich-herb |
View: | 105 times |
Download: | 1 times |
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: Interfaceclass jpvmEnvironment {
public jpvmEnvironment(); // Constructor registers task with the JPVM systempublic void pvm_exit();
// Identity:public jpvmTaskId pvm_mytid();public jpvmTaskId pvm_parent();
// Task creation:public int pvm_spawn(String task_name, int num, jpvmTaskId tids[]);
// Send messages:public void pvm_send(jpvmBuffer buf, jpvmTaskId tid, int tag);public void pvm_mcast(jpvmBuffer buf, jpvmTaskId tids[], int ntids, int tag);
// Receive messages, blocking (non-blocking versions not depicted):public jpvmMessage pvm_recv(jpvmTaskId tid, int tag);public jpvmMessage pvm_recv(jpvmTaskId tid);public jpvmMessage pvm_recv(int tag);public jpvmMessage pvm_recv();
//Probe for message availability:public boolean pvm_probe(jpvmTaskId tid, int tag);public boolean pvm_probe(jpvmTaskId tid);public boolean pvm_probe(int tag);public boolean pvm_probe();
// System configuration and control:public jpvmConfiguration pvm_config();public jpvmTaskStatus pvm_tasks(jpvmConfiguration conf, int which);public void pvm_halt();
};
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
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: Beispielimport 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: Performance
JPVM/jPVM/PVM: Performancevergleich
JPVM/jPVM/PVM: Performancevergleich
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