Parallel Processing in a Nutshell & kurz vorgestellt 16. Juni 2009 1 / 29
1 Das Problem 2 2 / 29
1 Das Problem 2 3 2 / 29
1 Das Problem 2 3 4 2 / 29
1 Das Problem 2 3 4 2 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: 3 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: Zeitkritische Anwendungen von Multi Core profitieren lassen 3 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: Zeitkritische Anwendungen von Multi Core profitieren lassen Langläufer optimal auf vorhandene Rechenresourcen verteilen Lösungen (naiv) 3 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: Zeitkritische Anwendungen von Multi Core profitieren lassen Langläufer optimal auf vorhandene Rechenresourcen verteilen Lösungen (naiv) Zeitkritische Sektionen in mehrere Threads aufteilen 3 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: Zeitkritische Anwendungen von Multi Core profitieren lassen Langläufer optimal auf vorhandene Rechenresourcen verteilen Lösungen (naiv) Zeitkritische Sektionen in mehrere Threads aufteilen Verteilen der Jobs per Hand oder in Skripten 3 / 29
Multi-Core Prozessoren halten Einzug (nicht nur) auf dem Desktop Neuer Rechencluster des CITEC (16 Nodes mit je 8 Kernen -> 128 Kerne) Ziele: Zeitkritische Anwendungen von Multi Core profitieren lassen Langläufer optimal auf vorhandene Rechenresourcen verteilen Lösungen (naiv) Zeitkritische Sektionen in mehrere Threads aufteilen Verteilen der Jobs per Hand oder in Skripten 3 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory per Kommandozeilenoption bspw. des GCC einschaltbar (-fopenmp) Vorteile: 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory per Kommandozeilenoption bspw. des GCC einschaltbar (-fopenmp) Vorteile: Programm compiliert/läuft auch seriell 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory per Kommandozeilenoption bspw. des GCC einschaltbar (-fopenmp) Vorteile: Programm compiliert/läuft auch seriell Programmteile lassen sich leicht parallelisieren 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory per Kommandozeilenoption bspw. des GCC einschaltbar (-fopenmp) Vorteile: Programm compiliert/läuft auch seriell Programmteile lassen sich leicht parallelisieren Threadanzahl muss nicht (aber kann) vorher festgelegt werden 4 / 29
Hello World Konzept Syntax Hello World++ API (C, C++, Fortran), von diversen Hard- und Softwareherstellern entwickelt und behütet (AMD, Cray, Fujitsu, HP, IBM, Intel, NEC, SGI, Sun, Microsoft,...) besteht aus: Compiler-Direktiven (#PRAGMA) Runtime-Library-Routinen Umgebungsvariablen Multi-Threading auf Unix/Windows NT Plattformen mit SHARED Memory per Kommandozeilenoption bspw. des GCC einschaltbar (-fopenmp) Vorteile: Programm compiliert/läuft auch seriell Programmteile lassen sich leicht parallelisieren Threadanzahl muss nicht (aber kann) vorher festgelegt werden 4 / 29
Hello World Konzept Syntax Hello World++ #include < s t d i o. h> #include < s t d l i b. h> i n t main ( i n t argc, char argv [ ] ) { #pragma omp p a r a l l e l { p r i n t f ( " Hallo Welt! \ n " ) ; } return (EXIT_SUCCESS ) ; } 1 2 3 4 5 6 7 8 9 10 5 / 29
Hello World Konzept Syntax Hello World++ mschoepf@caesar$ gcc -o HelloWorld -fopenmp HelloWorld.c mschoepf@caesar$./helloworld Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! mschoepf@caesar$ ssh arminius./helloworld Hallo Welt! 6 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared 7 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared Verschachtelte Parallelisierung von der API möglich 7 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared Verschachtelte Parallelisierung von der API möglich Dynamische Erhöhung/Reduzierung der Anzahl der Threads 7 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared Verschachtelte Parallelisierung von der API möglich Dynamische Erhöhung/Reduzierung der Anzahl der Threads KEINE explizite Unterstützung von I/O 7 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared Verschachtelte Parallelisierung von der API möglich Dynamische Erhöhung/Reduzierung der Anzahl der Threads KEINE explizite Unterstützung von I/O Threads können ihre Daten cachen. Bei geteilten Variablen muss ggf. explizit geflushed werden 7 / 29
Hello World Konzept Syntax Hello World++ Durch explizite Compileranweisungen werden Programmsektionen in Threads ( team ) aufgeteilt. Der Speicherbereich wird geshared Verschachtelte Parallelisierung von der API möglich Dynamische Erhöhung/Reduzierung der Anzahl der Threads KEINE explizite Unterstützung von I/O Threads können ihre Daten cachen. Bei geteilten Variablen muss ggf. explizit geflushed werden 7 / 29
Hello World Konzept Syntax Hello World++ #pragma omp <Direktive> [Klausel,... ] parallel - erstellt Team von Threads for - verteilt Schleife aufs Team sections - leitet Block mit Unteraufgaben ein single - Block für einen Thread parallel for - Kombi parallel & for task - Erstellen von tasks 8 / 29
Hello World Konzept Syntax Hello World++ #pragma omp <Direktive> [Klausel,... ] master Block für Master-Thread critical Block für einen Thread gleichzeitig barrier Barriere für alle Threads taskwait Warte auf beenden der tasks atomic garantiere Atomare Speicherbehandlung flush Schreibe Thread-Variablen ordered Durchlaufe Block in Schleife sortiert threadprivate Kopiere Variablen in für T. private 9 / 29
Hello World Konzept Syntax Hello World++ #pragma omp <Direktive> [Klausel,... ] Klauseln: shared (list) private (list) firstprivate (list) Initialisierung aller private lastprivate (list) Update nach Ende der Region reduction (operator:list) Update nach Ende der Region nach Regel 10 / 29
Hello World Konzept Syntax Hello World++ i n t main ( i n t argc, char argv ) { i n t a [ 5 ], i, x =1; #pragma omp p a r a l l e l for shared ( x ) for ( i =0; i < 5; i ++) { p r i n t f ( " S c h r i t t %d \ n ", i ) ; sleep ( 1 ) ; a [ i ] = x = x+x ; } for ( i =0; i <5; p r i n t f ( " a[%d ] = %d \ n ", i, a [ i + + ] ) ) ; return (EXIT_SUCCESS ) ; } 1 2 3 4 5 6 7 8 9 10 11 12 13 11 / 29
Hello World Konzept Syntax Hello World++ mschoepf@caesar$ gcc -o zweitesbeispiel-omp -fopenmp zweitesbeispiel.c mschoepf@caesar$ gcc -o zweitesbeispiel-serial zweitesbeispiel.c mschoepf@caesar$ time./zweitesbeispiel-serial Schritt 0 Schritt 1 Schritt 2 Schritt 3 Schritt 4 a[1] = 2 a[2] = 4 a[3] = 8 a[4] = 16 a[5] = 32 real 0m5.001s 12 / 29
Hello World Konzept Syntax Hello World++ mschoepf@caesar$ time./zweitesbeispiel-omp Schritt 0 Schritt 2 Schritt 4 Schritt 1 Schritt 3 a[1] = 2 a[2] = 16 a[3] = 4 a[4] = 32 a[5] = 8 real 0m2.002s 13 / 29
Hello World Konzept Syntax Hello World++ i n t main ( i n t argc, char argv ) { i n t id, i ; omp_set_num_threads ( 4 ) ; #pragma omp p a r a l l e l for p r i v a t e ( i d ) for ( i = 0; i < 4; ++ i ) { i d = omp_get_thread_num ( ) ; p r i n t f ( " Hello World from thread %d \ n ", i d ) ; #pragma omp b a r r i e r i f ( i d == 0) p r i n t f ( " There are %d threads \ n ", omp_get_num_threads ( ) ) ; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 / 29
Hello World Konzept Syntax Hello World++ mschoepf@caesar: $ gcc -o drittesbeispiel -fopenmp drittesbeispiel.c mschoepf@caesar: $./drittesbeispiel Hello World from thread 2 Hello World from thread 1 Hello World from thread 3 Hello World from thread 0 There are 4 threads 15 / 29
Hello World Konzept Syntax Hello World++ Was NICHT kann: Auf verteilten Speicher zugreifen Speichereffizienz garantieren 16 / 29
Hello World Konzept Syntax Hello World++ Was NICHT kann: Auf verteilten Speicher zugreifen Speichereffizienz garantieren Garantie gleichen Verhaltens verschiedener Implementationen 16 / 29
Hello World Konzept Syntax Hello World++ Was NICHT kann: Auf verteilten Speicher zugreifen Speichereffizienz garantieren Garantie gleichen Verhaltens verschiedener Implementationen Prüfen von Datenkonsistenz, Abhängigkeiten, deadlocks, race conditions 16 / 29
Hello World Konzept Syntax Hello World++ Was NICHT kann: Auf verteilten Speicher zugreifen Speichereffizienz garantieren Garantie gleichen Verhaltens verschiedener Implementationen Prüfen von Datenkonsistenz, Abhängigkeiten, deadlocks, race conditions Synchronisierte I/O 16 / 29
Hello World Konzept Syntax Hello World++ Was NICHT kann: Auf verteilten Speicher zugreifen Speichereffizienz garantieren Garantie gleichen Verhaltens verschiedener Implementationen Prüfen von Datenkonsistenz, Abhängigkeiten, deadlocks, race conditions Synchronisierte I/O 16 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... Eine API mit Vorwärtskompabilität 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... Eine API mit Vorwärtskompabilität API gesichert durch Gremium ( Forum) 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... Eine API mit Vorwärtskompabilität API gesichert durch Gremium ( Forum) Damit Sourcecode-kompabilität 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... Eine API mit Vorwärtskompabilität API gesichert durch Gremium ( Forum) Damit Sourcecode-kompabilität C, C++, Fortran 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Message Passing Interface - Standard zur Nachrichtenübertragung Ziele: Effizienz, Portabilität, Flexibilität Forum: IBM, Intel, HP, ncube s Vertex, p4, Zipcode, Chimp, PVM, Chameleon, PICL,... Seit 1995: 1.0, danach 1.1, 1.2 und 2.0 Freie Implementationen verfügbar: lam-mpi, CH, Open (lam-mpi Nachfolger)... Eine API mit Vorwärtskompabilität API gesichert durch Gremium ( Forum) Damit Sourcecode-kompabilität C, C++, Fortran 17 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Kommunikation auf Prozessebene Shared Memory, TCP,... Implementationen übernehmen: 18 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Kommunikation auf Prozessebene Shared Memory, TCP,... Implementationen übernehmen: Verteilen der Prozesse (bspw. mit rsh/ssh) 18 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Kommunikation auf Prozessebene Shared Memory, TCP,... Implementationen übernehmen: Verteilen der Prozesse (bspw. mit rsh/ssh) Wahl des Kommunikationsmediums 18 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Kommunikation auf Prozessebene Shared Memory, TCP,... Implementationen übernehmen: Verteilen der Prozesse (bspw. mit rsh/ssh) Wahl des Kommunikationsmediums 18 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Vorbedingungen Erster -Aufruf: _Init () Bewirkt u.a. Erstellung von _COMM_WORLD 19 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Vorbedingungen Erster -Aufruf: _Init () Bewirkt u.a. Erstellung von _COMM_WORLD Letzter ()-Aufruf _Finalize () 19 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Vorbedingungen Erster -Aufruf: _Init () Bewirkt u.a. Erstellung von _COMM_WORLD Letzter ()-Aufruf _Finalize () -Programme können mit extra Wrappern gebaut werden (mpicc, mpicxx, mpif77). 19 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Vorbedingungen Erster -Aufruf: _Init () Bewirkt u.a. Erstellung von _COMM_WORLD Letzter ()-Aufruf _Finalize () -Programme können mit extra Wrappern gebaut werden (mpicc, mpicxx, mpif77). -Programme werden mit einem Helfer verteilt und gestartet: mpirun -np 4 -hostfile hostfile.txt executable 19 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Vorbedingungen Erster -Aufruf: _Init () Bewirkt u.a. Erstellung von _COMM_WORLD Letzter ()-Aufruf _Finalize () -Programme können mit extra Wrappern gebaut werden (mpicc, mpicxx, mpif77). -Programme werden mit einem Helfer verteilt und gestartet: mpirun -np 4 -hostfile hostfile.txt executable 19 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Erstes Beispiel #include <mpi. h> i n t main ( i n t argc, char argv ) { i n t i e r r o r, rank, size ; i e r r o r = M P I _Init (& argc,& argv ) ; i f ( i e r r o r!= _SUCCESS) schade ( ) ; _Comm_rank (_COMM_WORLD, &rank ) ; _Comm_size (_COMM_WORLD, & s i z e ) ; _Finalize ( ) ; return (EXIT_SUCCESS ) ; } 1 2 3 4 5 6 7 8 9 10 11 12 20 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation synchron Sender blockiert, bis Empfänger Nachricht erhalten hat asynchron Sender schickt Nachricht ohne auf die Rückmeldung des Empfängers zu warten 21 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation synchron Sender blockiert, bis Empfänger Nachricht erhalten hat asynchron Sender schickt Nachricht ohne auf die Rückmeldung des Empfängers zu warten Wichtig In braucht jedes SEND ein entsprechendes RECEIVE. 21 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation synchron Sender blockiert, bis Empfänger Nachricht erhalten hat asynchron Sender schickt Nachricht ohne auf die Rückmeldung des Empfängers zu warten Wichtig In braucht jedes SEND ein entsprechendes RECEIVE. 21 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (blocking) _Send (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm)) (Standard: Entweder buffered oder synchron) _Ssend (...) (Synchron) 22 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (blocking) _Send (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm)) (Standard: Entweder buffered oder synchron) _Ssend (...) (Synchron) _Bsend (...) (Buffered) 22 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (blocking) _Send (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm)) (Standard: Entweder buffered oder synchron) _Ssend (...) (Synchron) _Bsend (...) (Buffered) _Rsend (...) (Ready) 22 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (blocking) _Send (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm)) (Standard: Entweder buffered oder synchron) _Ssend (...) (Synchron) _Bsend (...) (Buffered) _Rsend (...) (Ready) 22 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (non-blocking) _Isend (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm, _Request *request) _Issend (...) (Synchron) 23 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (non-blocking) _Isend (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm, _Request *request) _Issend (...) (Synchron) _Ibsend (...) (Buffered) 23 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (non-blocking) _Isend (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm, _Request *request) _Issend (...) (Synchron) _Ibsend (...) (Buffered) _Irsend (...) (Ready) 23 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (non-blocking) _Isend (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm, _Request *request) _Issend (...) (Synchron) _Ibsend (...) (Buffered) _Irsend (...) (Ready) Statusabfrage mit _Wait() oder _Test() 23 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Send (non-blocking) _Isend (void *buf, int count, _Datatype datatype, int dest, int tag, _Comm comm, _Request *request) _Issend (...) (Synchron) _Ibsend (...) (Buffered) _Irsend (...) (Ready) Statusabfrage mit _Wait() oder _Test() 23 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Receive: _Recv () (blocking) _Irecv () (non-blocking) 24 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Receive: _Recv () (blocking) _Irecv () (non-blocking) Es können beide Varianten gemischt benutz werden. 24 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Receive: _Recv () (blocking) _Irecv () (non-blocking) Es können beide Varianten gemischt benutz werden. _Waitany () _Testany () _Waitall () _Testall () _Waitsome () _Testsome () 24 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Receive: _Recv () (blocking) _Irecv () (non-blocking) Es können beide Varianten gemischt benutz werden. _Waitany () _Testany () _Waitall () _Testall () _Waitsome () _Testsome () 24 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation #define t o _ r i g h t 201 #define t o _ l e f t 102 i n t main ( i n t argc, char argv [ ] ) { i n t right, l e f t, rank, my_rank, size, other, i, sum ; _Status send_status, recv_status ; _Request request ; M P I_Init (& argc, &argv ) ; _Comm_rank (_COMM_WORLD, &my_rank ) ; _Comm_size (_COMM_WORLD, &size ) ; r i g h t = ( my_rank + 1) % size ; l e f t = ( my_rank 1) % size ; sum = 0; rank = my_rank ; for ( i = 0; i < size ; i ++) { _Issend (& rank, 1, _INT, right, to_ right,_comm_world, &request ) ; _Recv(& other, 1, _INT, l e f t, to_ right, _COMM_WORLD, &recv_status ) ; _Wait(& request, &send_status ) ; sum += other ; rank = other ; } p r i n t f ( "PE %d : \ t Sum = %d \ n ", rank, sum ) ; _Finalize ( ) ; return (EXIT_SUCCESS ) ; } 25 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Datentypen: Basic, Vektoren, Structs,... Topologien: Prozesse bspw. Carthesisch anordnenbar bishin zu allgemeinen Graphen _Barrier() analog zu 26 / 29
Vorgeplänkel Erstes Beispiel Kollektive Kommunikation Deutliche Unterschiede zu Point-to-Point: Immer über einen Communicator (z.b. _COMM_WORLD) Alle Prozesse müssen kommunizieren Mit oder ohne Synchronisation Nur blocking möglich Keine Tags Receive buffer müssen exakt die richtige Größe haben _Bcast(), _Scatter(), _Gather, _Reduce(), _All_to_all() 27 / 29
2003: 16 PCs unter brachten 0.5 GFLOPS (AG NI) 2009: 1 QuadCore bringt 3.2 GFLOPS () bzw. 2.0 () (vgl. 1.2 GFLOPS Single Thread) Mittels einfache Parallelisierung (parallel for / sections) Mittel bspw. durch Master-Worker Aufteilung Nutzung großer Rechenrescourcen BTW: & können zusammen benutzt werden 28 / 29
Writing Message-Passing Parallel Programs with - University of Edinburgh - http://www.lrz-muenchen.de/services/software/parallel/mpi /epcc-course/ -Primer / Developing with LAM- - University of Ohio - http://www.lam-mpi.org Cluster Quick Start Version 0.1 - Douglas Eadline - http://www.xtreme-machines.com/x-cluster-qs.html Message Passing Interface () FAQ - comp.parallel.mpi - http://www.faqs.org/faqs/mpi-faq/ Forum - http://www.mpi-forum.org Wikipedia www.openmp.org 29 / 29