Hauptseminar 2001 „Parallele Programmierung in Java“ - JPVM- Java Parallel Virtual Machine...

Post on 06-Apr-2015

105 views 1 download

Tags:

Transcript of Hauptseminar 2001 „Parallele Programmierung in Java“ - JPVM- Java Parallel Virtual Machine...

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