Parallele Programmierung mit OpenMP und MPI



Ähnliche Dokumente
Parallele Programmierung mit OpenMP

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

OpenMP am Beispiel der Matrizenmultiplikation

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Technische Universität München SS 2006 Fakultät für Informatik 12. Oktober 2006 Prof. Dr. A. Knoll. Aufgabe 1 Transferfragen (Lösungsvorschlag)

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg.

Modellierung und Programmierung 1

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Constraint-Algorithmen in Kürze - Mit der Lösung zur Path-Consistency-Aufgabe 9

Objektorientierte Programmierung für Anfänger am Beispiel PHP

SharePoint Workspace 2010 Installieren & Konfigurieren

.NET Code schützen. Projekt.NET. Version 1.0

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Übungen Programmieren 1 Felix Rohrer. Übungen

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Professionelle Seminare im Bereich MS-Office

Projektseminar Parallele Programmierung

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009

Updatehinweise für die Version forma 5.5.5

Programmierkurs Java

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Tutorium Rechnerorganisation

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant?

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Einführung in die Programmierung

Print2CAD 2017, 8th Generation. Netzwerkversionen

Anleitung über den Umgang mit Schildern

Monitore. Klicken bearbeiten

Erwin Grüner

Zahlen und das Hüten von Geheimnissen (G. Wiese, 23. April 2009)

Hilfe zur Urlaubsplanung und Zeiterfassung

Version 0.3. Installation von MinGW und Eclipse CDT

C++ Tutorial: Timer 1

Dow Jones am im 1-min Chat

Java Kurs für Anfänger Einheit 5 Methoden

Grundlagen von Python

SJ OFFICE - Update 3.0

1 Vom Problem zum Programm

Tevalo Handbuch v 1.1 vom

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Speicher in der Cloud

Deklarationen in C. Prof. Dr. Margarita Esponda

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

Leichte-Sprache-Bilder

Anwendungsbeispiele. Neuerungen in den s. Webling ist ein Produkt der Firma:

Objektbasierte Entwicklung

Windows Server 2008 (R2): Anwendungsplattform

Task: Nmap Skripte ausführen

Zählen von Objekten einer bestimmten Klasse

8. Bintec Router Redundancy Protocol (BRRP) 8.1 Einleitung

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Dämon-Prozesse ( deamon )

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

1. Einführung in OpenMP

DOKUMENTATION VOGELZUCHT 2015 PLUS

Bauteilattribute als Sachdaten anzeigen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Lizenzen auschecken. Was ist zu tun?

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

C++ mit Eclipse & GCC unter Windows

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Was meinen die Leute eigentlich mit: Grexit?

Vorkurs C++ Programmierung

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Lokale Installation von DotNetNuke 4 ohne IIS

Bitte verwenden Sie nur dokumentenechtes Schreibmaterial!

Access und die andern (Office) Programme. Armin Hess

Proxy. Krishna Tateneni Übersetzer: Stefan Winter

SAP Memory Tuning. Erfahrungsbericht Fritz Egger GmbH & Co OG. Datenbanken sind unsere Welt

Windows 10 > Fragen über Fragen

4D Server v12 64-bit Version BETA VERSION

Der Kalender im ipad

Hier ist die Anleitung zum Flashen des MTK GPS auf der APM 2.0. Prinzipiell funktioniert es auch auf der APM 2.5 und APM 1.

Formular»Fragenkatalog BIM-Server«

Systeme 1. Kapitel 10. Virtualisierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Wir arbeiten mit Zufallszahlen

HorstBox (DVA-G3342SD) Anleitung zur Einrichtung der Telefonie

METTLER TOLEDO USB-Option Installation der Treiber unter Windows XP

Online Newsletter III

Woche 1: Was ist NLP? Die Geschichte des NLP.

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Tipps und Tricks zu Netop Vision und Vision Pro

Die neue Aufgabe von der Monitoring-Stelle. Das ist die Monitoring-Stelle:

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Datenübernahme easyjob 3.0 zu easyjob 4.0

Fax einrichten auf Windows XP-PC

Transkript:

Parallele Programmierung mit OpenMP und MPI oder Wieso früher alles besser war Robin Geyer 08.10.2010 Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 1 / 52

Fahrplan Einführung / Umfrage Parallelrechner OpenMP (Open)MPI Fazit Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 2 / 52

Folien In ein paar Tagen pinguinstall.org oder nrtm.de oder clug.de? Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 3 / 52

Umfrage I Einführung / Umfrage Umfrage Hände hoch! Programmiersprache Welche Programmiersprachen werden benutzt? C / C++ FORTRAN Java Python.NET Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 4 / 52

Umfrage II Einführung / Umfrage Umfrage Multicore System Wer hat mehr als 2 Cores in seinem Rechner? Wer hat den Eindruck das dies wirklich was bringt? Parallele Programmierung Wer hat schon parallel Programmiert? Mit (Open)MPI Mit OpenMP Andere Methode Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 5 / 52

Einführung / Umfrage Geschichte Geschichte der Workstations/PCs I Figure: Moores Law Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 6 / 52

Figure: Leistung pro CPU-Core Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 7 / 52 Einführung / Umfrage Geschichte Geschichte der Workstations/PCs II

Einführung / Umfrage Geschichte der Supercomputer I Geschichte Figure: Entwicklung der Top500 Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 8 / 52

Einführung / Umfrage Geschichte Geschichte der Supercomputer II Figure: Summe der Prozessoren in der Top500 Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 9 / 52

Einführung / Umfrage Geschichte Geschichte der Supercomputer III Figure: -Rechenleistung / -Prozessoren, mit Korrektur pro Core Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 10 / 52

Probleme Einführung / Umfrage Probleme Konsequenzen von Moores Law treffen nicht mehr für einzelne Cores zu Große Teile der heute genutzen Software ist nicht parallelisiert Programmierer müssen sich mit (ganz neuer) Klasse von Bugs auseinandersetzen Race Conditions Deadlocks in Kommunikation Heisenbugs False Sharing Optimierung ist bei parallelen Programmen um ein Vielfaches komplexer Optimierung durch warten ist nicht mehr möglich Ein serielles Programm läuft in Zukunft vielleicht eher langsamer Zahl der Cores pro PC übersteigt bald die Anzahl der normalerweise laufenden Prozesse Konsequenz: Ohne Parallelisierung idlen bald die meisten Cores in meinem Laptop vor sich hin Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 11 / 52

Einführung / Umfrage Probleme Aber Eins nach dem Anderen... Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 12 / 52

Parallelrechner Begriffe / Definitionen Begriffe I Parallelrechner Computer oder Rechnerverbund dem mehrere eigenständige Prozessoren zur Verfügung stehen, die alle zeitgleich benutzt werden können. Ein Core soll hier als eigenständiger Prozessor gesehen werden. Verbindung zwischen den Prozessoren Es gibt grundsätzlich zwei verschiedene Möglichkeiten die Prozessoren eines Parallelrechners kommunizieren zu lassen: Mit einer -wie auch immer gearteten- Form eines Netzwerkes Über einen gemeinsamen Speicher Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 13 / 52

Begriffe II Parallelrechner Begriffe / Definitionen Parallelisierung / Parallelverarbeitung Methode um schneller zu Ergebnissen zu kommen Nutzung mehrere Recheneinheiten gleichzeitig zum lösen eines Problems Im Gegensatz zur Optimierung (serieller Programme) werden hier zusätzliche Ressourcen benutzt Wallclock Time vs. CPU Time Wallclock Time = Rechenzeit eines Jobs unabhängig von der Anzahl verwendeter Prozessoren Wird bei Parallelisierung (meist) kürzer CPU Time = Rechenzeit jeder CPU für den Job 1 Steigt bei Parallelisierung immer an, da nie perfekte Skalierung Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 14 / 52

Parallelrechner Begriffe / Definitionen Begriffe III Speedup, Effizienz, Skalierung Speedup n = T 1 T n mit (1 Speedup n) Effizienz = Speedup n n Man sagt: Ein Programm skaliert bis n Prozessoren wenn seine Effizienz erst bei mehr als n Prozessoren unter 0.9 fällt. 2 1 einfach: Wallclock Anzahl CPUs 2 0.9 hier frei von mir gewählt Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 15 / 52

Parallelrechner Begriffe / Definitionen Unsere Vorteile als Linux-Normal-User Wir kämpfen (noch) nicht mit mehr als 20 CPUs Wir haben immer einen gemeinsamen Speicher mit Cache Koherenz (noch) Unsere Rechner kosten weder im Betrieb noch in der Anschaffung so viel das wir auf 99% Effizienz kommen müssen Hura? Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 16 / 52

Parallelrechner Zwei Modelle Die Qual der Wahl Message Passing Kommunikation zw. CPUs per Nachrichtenaustausch Programmiermodell besitzt keinen gemeinsamen Speicher Eigenständiger Prozess auf jeder CPU/Core Unabhängig von der Verbindung zw. CPUs (zur Not ginge auch IPoAC ;-) ) Distribution über Bibliothek + Tools (OpenMPI, MPICH, MVAPICH,...) Programmierung durch Nutzung der Bibliotheksfunktionen Gilt allgemein als skalierbarer OpenMP Programmiermodell ausschließlich für gemeinsamen Speicher Kommunikation über gemeinsame Variablen, Speicherbereiche Parallelität durch Threads Programmierung durch setzten von Compiler-Direktiven um Codeblöcke Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 17 / 52

Allgemeines zu OpenMP OpenMP OpenMP allgemein Im Grunde Standard für Shared Memory Parallelisierung in C/C++ und FORTRAN Besteht aus: Compiler Direktiven, ENV Vars, Laufzeitroutinen Aktuell in Version 3.0 Viel mehr Möglichkeiten als bei Compiler-Parallelisierung Datenabhängigkeiten können manuell gelöst werden Grobgranulare Parallelisierung überblicken die Compiler nicht Optimierung Bessere Skalierung (falls gut Programmiert ;-) ) OpenMP Programme sind portabel zwischen einer Vielzahl von Compilern (gcc, intel, cray, ibm, sun, nec,...) Schon vorhandene Programme können ohne viel Aufwand angepasst werden Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 18 / 52

Fork-Join Modell OpenMP OpenMP allgemein * MPI Fork Join CUDA Fork Join Fork Join Figure: Fork-Join Modell von OpenMP, sei ein Masterthread d.h. immer TID 0 Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 19 / 52

OpenMP Einführungsbeispiel OpenMP Einführungs Beispiel 1 for ( i =0;i<n ; i++){ 2 a [ i ] = b [ i ] + c [ i ] ; 3 } Figure: Schleife 1 # pragma omp p a r a l l e l for 2 for ( i =0;i<n ; i++){ 3 c [ i ] = a [ i ] + b [ i ] ; 4 } 5 6 ## gcc fopenmp... bsp omp. c 7 ## e x p o r t OMP NUM THREADS=4 8 ##. / a. out Figure: OpenMP parallelisierte Schleife Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 20 / 52

Direktiven OpenMP Einführungs Beispiel C vs. FORTRAN C Direktiven und Clauses sind Case-Sensitive #pragma omp directive [clause [clause]...] Fortsetzung des pragma durch \ OPENMP Macro FORTRAN!$OMP directive [clause [clause]...] Direktiven und Clauses sind Case-Insensitive Fortsetzung des pragma durch & Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 21 / 52

OpenMP Einführungs Beispiel Grundlegende clauses für parallel-direktive if(scalar expr): Nur Parallel wenn scalar expr gleich wahr private(list): Jeder Thread bekommt Variablen aus Liste als eigene, für andere unsichtbare, uninitialisierte Variable shared(list): Jeder Thread sieht Variablen aus Liste und kann sie verändern firstprivate(list): Wie private nur das jeder Thread den Originalwert (vor parallel) der Variable übernimmt lastprivate(list): Wie firstprivate nur das die Originalvariable nach der Parallel-Region geupdatet wird reduction(operator:list): Wie lastprivate nur das die Originalvariable nach der Parallel-Region unter anwendung des Operators auf jede Variable der Liste geupdatet wird Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 22 / 52

Zurück zum Beispiel OpenMP Einführungs Beispiel 1 # pragma omp p a r a l l e l for 2 for ( i =0;i<n ; i++){ 3 c [ i ] = a [ i ] + b [ i ] ; 4 } 5 6 ## gcc fopenmp... bsp omp. c 7 ## e x p o r t OMP NUM THREADS=4 8 ##. / a. out = 1 # pragma omp p a r a l l e l for s h a r e d ( n, a, b, c ) p r i v a t e ( i ) 2 for ( i =0;i<n ; i++){ 3 c [ i ] = a [ i ] + b [ i ] ; 4 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 23 / 52

OpenMP Datenbehandlung private, shared, or what? Aus den OpenMP 3.0 Specs Variables appearing in threadprivate directives are threadprivate. Variables with automatic storage duration that are declared in a scope inside the C/C++ construct are private. Variables with heap allocated storage are shared. Static data members are shared. The loop iteration variable(s) in the associated for-loop(s) of a for or parallel for construct is(are) private. Variables with const-qualified type having no mutable member are shared. Static variables which are declared in a scope inside the construct are shared. Im Zweifelsfall immer explizit angeben welche Eigenschaft eine Variable besitzen soll. Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 24 / 52

Einige Beispiele OpenMP Datenbehandlung 1 # include < s t d i o. h> 2 # include <omp. h> 3 4 int main ( ) { 5 int i ; 6 i = 4 2 ; 7 printf ( " serial says : i = % i \ n ", i ) ; 8 omp_set_num_threads ( 6 ) ; 9 # pragma omp p a r a l l e l p r i v a t e ( i ) 10 { 11 printf ( " id % i says : i =% i \ n ", omp_get_thread_num ( ), i ) ; 12 } 13 return 0 ; 14 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 25 / 52

OpenMP Datenbehandlung Einige Beispiele Ausgabe serial says: i = 42 id 1 says: i=0 id 0 says: i=0 id 2 says: i=0 id 3 says: i=0 id 4 says: i=0 id 5 says: i=0 private Variablen werden nicht initialisiert Reihenfolge der Threads nicht terministisch Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 26 / 52

Einige Beispiele II OpenMP Datenbehandlung 1 # include < s t d l i b. h> 2 # include <s t d i o. h> 3 # include <omp. h> 4 5 int main ( ) { 6 int tmp ; 7 8 tmp = malloc (3 sizeof ( int ) ) ; 9 10 tmp [ 0 ] = 1 ; 11 tmp [ 1 ] = 2 ; 12 tmp [ 2 ] = 3 ; 13 14 omp_set_num_threads ( 6 ) ; 15 # pragma omp p a r a l l e l p r i v a t e ( tmp ) 16 { 17 tmp [ 0 ] = rand ( ) ; 18 } 19 return 0 ; 20 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 27 / 52

Einige Beispiele II OpenMP Datenbehandlung Ausgabe Segmentation fault malloc für dynamische private-variablen in parallelen Bereichen ist zwingend. Alternativ firstprivate benutzen. Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 28 / 52

Einige Beispiele II OpenMP Datenbehandlung 1 # include < s t d l i b. h> 2 # include <s t d i o. h> 3 # include <omp. h> 4 5 int main ( ) { 6 int tmp ; 7 8 tmp = malloc (3 sizeof ( int ) ) ; 9 10 tmp [ 0 ] = 1 ; 11 tmp [ 1 ] = 2 ; 12 tmp [ 2 ] = 3 ; 13 14 omp_set_num_threads ( 6 ) ; 15 # pragma omp p a r a l l e l f i r s t p r i v a t e ( tmp ) 16 { 17 tmp [ 0 ] = rand ( ) ; 18 printf ( " %i, %i, % i \ n ", tmp [ 0 ], tmp [ 1 ], tmp [ 2 ] ) ; 19 } 20 return 0 ; 21 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 29 / 52

Einige Beispiele III OpenMP Datenbehandlung 1 # include < s t d l i b. h> 2 # include <s t d i o. h> 3 # include <math. h> 4 # include <omp. h> 5 6 int iter ( double cx, double cy, double max_bq, double max_iter ) { 7 /* ganz viel code in for - schleife */ 8 return iter ; 9 } 10 11 int main ( int argc, char argv [ ] ) { 12 omp_set_num_threads ( 3 ) ; 13... 14 # pragma omp p a r a l l e l for p r i v a t e ( p i x y, p i x x, cx, cy ) s h a r e d ( m a x i t e r, m a x p i x y, m a x p i x x, x min, y min, max bq ) 15 for ( pix_y=1 ; pix_y <= max_pix_y ; pix_y++){ 16 for ( pix_x =1; pix_x <= max_pix_x ; pix_x++){ 17 cx = x_min + ( ( x_max x_min ) / max_pix_x ) pix_x ; 18 cy = y_min + ( ( y_max y_min ) / max_pix_y ) pix_y ; 19 20 field [ pix_x ] [ pix_y ] = iter ( cx, cy, max_bq, max_iter ) ; 21 } 22 } 23... 24 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 30 / 52

Einige Beispiele III OpenMP Datenbehandlung Figure: Unterschiedliche Zeiten für je einen Schleifendurchlauf und Abhängigkeit der Zeile Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 31 / 52

Die Scheduling Clauses OpenMP Scheduling schedule(static dynamic guided [,chunk]) static: Feste Zuordnung am Anfang welcher Thread welchen Block der Größe chunk bekommt. Ohne chunk, implizit chunk = N / num threads dynamic: Feste Blöcke aber weitere Verteilung erst nach Beendigung eines Blockes. (Default = 1) guided: Gleiches Verhalten wie dynamic, nur das chunk die Startgröße vorgibt und die chunksize dann exponentiell verkleinert wird. (Default = 1) schedule(runtime auto) runtime: Festlegung zur Laufzeit über Variable OMP SCHEDULE auto: Alles dem Compiler überlassen, quasi unbestimmt Abwägung und genaue Analyse des Scheduling Aufwands bzw. der Zeitvariantz der Iterationen nötig Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 32 / 52

Scheduling OpenMP Scheduling 3 2 1 0 guided Thread ID 3 2 1 0 dynamic 3 2 1 0 static Iteration Nummer Figure: Scheduling-Methoden grafisch Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 33 / 52

Data Dependencies OpenMP Datenabhängigkeiten Typen von Datenabhängigkeiten und deren Wirkung auf die Parallelisierung Einfache Abhängigkeiten δ =: Gleicher Speicherplatz wird in einer Schleifen mehrmals angefasst Vorwärts-Abhängigkeit δ : Speicherplatz und sein Nachfolger (bzw. mit Offset n) wird in einer Schleife angefasst Rückwärts-Abhängigkeit δ : Speicherplatz und sein Vorgänger (bzw. mit Offset n) wird in einer Schleife angefasst... Behandlung von Datenabhängigkeiten in for-schleifen Einfache Abhängigkeiten δ =: Für Parallelisierung über die Zählvariable (i) ohne Einfluss Vorwärts-Abhängigkeit δ bzw. Rückwärts-Abhängigkeit δ In umgebenen Schleifen der zu parallelisierenden können Ignoriert werden In möglicherweise vorhandenen inneren Schleifen der zu parallelisierenden können ignoriert werden In der zu Parallelisierenden selbst müssen gelöst werden oder synchronisiert werden Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 34 / 52

OpenMP Datenabhängigkeiten Beispiele für Datenabhängigkeiten I 1 /* Datenabhaengigkeiten die nicht Synchronisiert werden muessen */ 2 3 // S1 (=) S2 4 for ( i =0;i<n ; i++){ 5 a [ i ] = c [ i ] ; // S1 6 b [ i ] = a [ i ] ; // S2 7 } 8 9 // S1 (=, <) S2 UND S2 (=,=) S1 10 // Abhaengigkeit betrifft nur innere Schleife, 11 // aeussere kann Paralellisiert werden 12 for ( i =1;i<n ; i++){ 13 for ( k =1;k<n ; k++){ 14 a [ i ] [ k ] = b [ i ] [ k ] ; // S1 15 b [ i ] [ k ] = a [ i ] [ k 1]; // S2 16 } 17 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 35 / 52

OpenMP Datenabhängigkeiten Beispiele für Datenabhängigkeiten II 1 /* Datenabhaengigkeit mit Sync erforderlich */ 2 3 for ( i =1;i<n ; i++){ 4 a [ i ] = b [ i ] + c [ i ] ; // S1 5 d [ i ] = a [ i ] + e [ i 1]; // S2 6 e [ i ] = e [ i ] + 2 b [ i ] ; // S3 7 f [ i ] = e [ i ] + 1 ; // S4 8 } 9 10 // S1 (=) S2 11 // S3 (=) S4 12 // S3 ( <) S2 3 2 Möglichkeiten 1. Serialisieren 2. Clever lösen (nach Wolfe) 3 Beispiel nach Wolfe Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 36 / 52

OpenMP Datenabhängigkeiten Lösen von Datenabhängigkeiten #pragma omp critical [(name)] Konstrukt: The critical construct restricts execution of the associated structured block to a single thread at a time. #pragma omp atomic: Besser für Updates nur einer spezifischen Variable (atomic gilt auch immer nur für die genau nachfolgende (Zu)Anweisung) Semaphoren: Bietet OpenMP in Form der omp * * lock() Funktionen an Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 37 / 52

OpenMP Lösen von Datenabhängigkeiten Datenabhängigkeiten 1 // lock Initialisierung etc beachten! 2 3 omp_lock_t lock = new omp_lock_t [ n ] ; 4 5 for ( i =1;i<n ; i++){ 6 e [ i ] = e [ i ] + 2 b [ i ] ; // S3 7 8 omp_unset_lock (&lock [ i ] ) ; 9 10 { 11 a [ i ] = b [ i ] + c [ i ] ; // S1 12 f [ i ] = e [ i ] + 1 ; // S4 13 } 14 15 if ( i>1) 16 omp_set_lock (&lock [ i 1]) ; 17 18 d [ i ] = a [ i ] + e [ i 1]; // S2 19 } Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 38 / 52

OpenMP Datenabhängigkeiten T1 S1 S2 S3 Serialisiert T2 S1 S2 S3 S4 T3 S1 S2 S3 S4 T4 Tn T1 T2 T3 S1 S1 S3 S3 S3 S1 S1 S1 S4 S4 S4 S2 S2 S2 Wartezeit S2 S3 S4 S3 S2 S3 S4 Zeit Parallelisiert nach Wolfe Beispiele aus: T. Bräunl; Parallele Programmierung; Vieweg 1993 T4 S3 S1 S4 S2 Tn S3 S1 S4 S2 Zeit Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 39 / 52

OpenMP Weitere nützliche Konstrukte Sonstiges zu OpenMP single: Nur ein Thread führt aus, alle anderen überspringen copyin: Von Masters threadprivate Variable zu meiner threadprivate Variable kopieren barrier: Warten an genau der Stelle bis alle angekommen sind sections-konstrukt: Blöcke des Codes definieren, die dann parallel ausgeführt werden können task: Fire and forget Möglichkeit... Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 40 / 52

OpenMP Sonstiges zu OpenMP Abschluss / Literatur Bücher Das wichtigste überhaupt: http://www.openmp.org/mp-documents/spec30.pdf Parallele Programmierung von Thomas Rauber und Gudula Rünger (ISBN: 3540465499) Kurse: https://fs.hlrs.de/projects/par/par_prog_ws/ (online) und http://www.hlrs.de/no_cache/organization/sos/par/services/ training/course-list/ (Rabenseifner-Kurse) Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 41 / 52

(Open)MPI Allgemeines zu (open)mpi MPI = Standard (aktuell 2.2) für Distributed Memory Programmierung Besteht aus Bibliothek und Laufzeitumgebung OpenMPI als aktuelle und modulare Implementierung (Version 1.4.3) Beruht auf dem Versenden von Nachrichten/Anweisungen im (Hochgeschwindigkeits)Netz OpenMPI lässt sich ebenfalls mit einer Vielzahl von Compilern benutzen Anpassung von schon vorhandenen Programmen teilweise sehr kompliziert Sauber MPI-Implementiertes Programm sollte von vornherein dafür konzipiert werden Programme werden üblicher Weise mit Zusatzprogramm mpirun gestartet Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 42 / 52

(Open)MPI Die Bücher zuerst http://www.mpi-forum.org/docs/docs.html Parallel Programming with MPI. von Peter Pacheco bei: Morgan Kaufmann (ISBN: 1558603395) Parallele Programmierung von Thomas Rauber und Gudula Rünger (s.o.) Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 43 / 52

(Open)MPI MPI Beispiel Uns schockt jetzt nichts mehr Beispiel am Anfang I 1 program fractal 2 implicit none 3 include mpif. h 4 5! picture size, counters 6 integer ( kind=8) : : max_x_len, max_y_len, iter, i, j, n 7 8! mpi variables, mpi status 9 integer : : mpierror, mpisize, mpirank 10 integer ( kind=8), dimension ( : ), allocatable : : sendvec 11 integer : : probestatus ( MPI_ STATUS_ SIZE ), recvstat ( MPI_ STATUS_ SIZE ) 12 integer, dimension ( 1 ) : : addrbuf 13 14! the result array 15 integer ( kind=8), dimension ( :, : ), allocatable : : fracarray 16 17! mathematical boundarys 18 real ( kind =8) : : x_max, x_min, y_max, y_min, cx, cy, nil 19 20! set mathematical maximum coordinates 21 x_max = 1 ; x_min = 2.3; y_max = 1. 5 ; y_min = 1.5 22 23! set picture size 24 max_x_len = XSIZE ; max_y_len = YSIZE 25 Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 44 / 52

(Open)MPI MPI Beispiel Uns schockt jetzt nichts mehr Beispiel am Anfang II 26 nil = 0 27 28! allocate array of results 29 allocate ( fracarray ( max_x_len, max_y_len ) ) 30 31! vector for sending with line number 32 allocate ( sendvec ( max_y_len +1) ) 33 34! do mpi initialization 35 call MPI_Init ( mpierror ) 36 call MPI_Comm_size ( MPI_COMM_WORLD, mpisize, mpierror ) 37 call MPI_Comm_rank ( MPI_COMM_WORLD, mpirank, mpierror ) 38 39 if ( mpirank == 0) then 40! if i m the master, distribute work 41 do i=1, max_x_len 42 call MPI_Probe ( MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, probestatus, mpierror ) 43 call MPI_Recv ( sendvec, max_y_len +1, MPI_INTEGER8, probestatus ( MPI_SOURCE ), & 44 & probestatus ( MPI_TAG ), MPI_COMM_WORLD, recvstat, mpierror ) 45 46 if ( sendvec ( 1 ) == 0) then 47 sendvec = 0 48 else 49 fracarray ( sendvec ( 1 ), : ) = sendvec ( 2 : ) Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 45 / 52

(Open)MPI MPI Beispiel Uns schockt jetzt nichts mehr Beispiel am Anfang III 50 end if 51 52 addrbuf ( 1 ) = i 53 54 call MPI_Send ( addrbuf, 1, MPI_INTEGER8, probestatus ( MPI_SOURCE ), & 55 & probestatus ( MPI_SOURCE ), MPI_COMM_WORLD, mpierror ) 56 57 end do 58 addrbuf ( 1 ) = nil 59 do i=1, mpisize 1 60 call MPI_Send ( addrbuf, 1, MPI_INTEGER8, i, i, MPI_COMM_WORLD ) 61 end do 62 else 63! if i m slave... receive work! 64 i = 1 65 sendvec = 0 66 67 call MPI_Send ( sendvec, max_y_len +1, MPI_INTEGER8, 0, mpirank, MPI_COMM_WORLD, mpierror ) 68 69 do while (. TRUE. ) 70! mpirank +( sendvec (4) +1) for tag uniqueness 71 call MPI_Recv ( addrbuf, 1, MPI_INTEGER8, 0, mpirank, MPI_COMM_WORLD, recvstat, mpierror ) 72 73 if ( addrbuf ( 1 ) == nil ) then Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 46 / 52

(Open)MPI MPI Beispiel Uns schockt jetzt nichts mehr Beispiel am Anfang IV 74 exit 75 end if 76 77 sendvec ( 1 ) = addrbuf ( 1 ) 78 do j=1, max_y_len 79 cx = x_min + ( ( x_max x_min ) / max_x_len ) addrbuf ( 1 ) 80 cy = y_min + ( ( y_max y_min ) / max_y_len ) j 81 82 call iterate ( cx, cy, n ) 83 sendvec ( j+1) = n 84 end do 85 86 call MPI_Send ( sendvec, max_y_len +1, MPI_INTEGER8, 0, mpirank, MPI_COMM_WORLD, mpierror ) 87 88 end do 89 end if 90 91! close mpi stuff 92 call MPI_Finalize ( mpierror ) 93 94! clean up array 95 deallocate ( fracarray ) 96 97 end program Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 47 / 52

(Open)MPI MPI Routinen Die wichtigsten MPI Routinen I Punk zu Punkt MPI Send / MPI Recv: Einfaches Blockierendes Senden mit zugehörigen empfangen MPI Bsend: Gepuffertes Senden MPI Ssend: Synchrones Senden Punkt zu Alle MPI Bcast: Ein (und das selbe) Datenpaket an alle MPI Scatter: Ein Prozess sended an alle beteiligten Prozesse (unterschiedliche Pakete) MPI Reduce zum aufsammeln der Datenpakete + Vektorbasierte Varianten, blockierende, nicht-blockierende, gepufferte, etc. Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 48 / 52

(Open)MPI MPI Routinen Die wichtigsten MPI Routinen II Alle zu Alle MPI Allgather: Jeder gathered, ein Element von jedem Beteiligtem Prozess MPI Alltoall: Jeder schickt Alles zu Allen (Multibroadcast) Sonstiges MPI Win *: Für Locks MPI Barrier: Barriere zur Synchronisation Hunderte andere Calls für, Zeitsynchronisation, Puffer, Datentypen-Transfer,... Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 49 / 52

Fazit Fazit I Früher war nicht alles besser! Uns steht heute eine unglaublich hohe Rechenleistung selbst bei billigster Hardware zur Verfügung Für schlecht zu parallelisierende Probleme gibt es Spezialhardware Vieles lässt sich sehr gut Parallelisieren und skaliert gut OpenCL als vielleicht neuer und einfacher Standard Probleme an denen wir arbeiten müssen Wir müssen parallel Programmieren lernen Wir müssen wieder anfangen unsere Software zu optimieren 4 4 Früher wurden Game-Engines in reinen Assembler geschrieben, heute ist das nicht mehr nötig... dafür müssen wir aber genau so viel Aufwand in die Parallelisierung stecken! Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 50 / 52

Ende... Fazit Danke Fragen? Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 51 / 52

Fazit Quellen Hennessy & Patterson; Computer Architecture: A Quantitative Approach; 4th Edition; Morgan Kaufmann Thomas Bräunl; Parallele Programmierung: Eine Einführung; Vieweg OpenMP, OpenMPI und MPI Referenzen wie in den Folien genannt intel.com top500.org Robin Geyer () Parallele Programmierung mit OpenMP und MPI 08.10.2010 52 / 52