Automatische Parallelisierung

Ähnliche Dokumente
Master-Thread führt Programm aus, bis durch die Direktive

Konzepte der parallelen Programmierung

Praktikum: Paralleles Programmieren für Geowissenschaftler

Beispiel: Schleifenparallelisierung

OpenMP. Viktor Styrbul

1. Einführung in OpenMP

Einige Grundlagen zu OpenMP

Paralleles Programmieren mit OpenMP und MPI OpenMP-Übungsaufgaben Steinbuch Centre for Computing

Memory Models Frederik Zipp

Multi-threaded Programming with Cilk

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

Programmtransformationen: Vom PRAM Algorithmus zum MPI Programm

Peter Prinz Ulla Kirch-Prinz C+ + Lernen und professionell anwenden. ffl mitp

OpenMP am Beispiel der Matrizenmultiplikation

Wertebereich und Genauigkeit der Zahlendarstellung

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Parallele Programmiermodelle

Kapitel 4.2 Parallele Algorithmen

Programmiervorkurs für die Numerik Teil 2/4

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

II.1.1. Erste Schritte - 1 -

I Grundlagen der parallelen Programmierung 1

5. Parallelprogrammierung II und q-gram Indizes. AlDaBi Praktikum

2. Programmierung in C

Compute Unified Device Architecture CUDA

WiMa-Praktikum 1. Woche 8

Felder, Zeiger und Adreßrechnung

Berichte aus der Informatik. Dieter Pawelczak. Start in die C-Programmierung

Polymorphie Begriffsklärung und Anwendung

II.1.1. Erste Schritte - 1 -

Peg-Solitaire. Florian Ehmke. 29. März / 28

Parallele Programmierung mit OpenMP

Parallele und verteilte Programmierung

Physische Datenstrukturen

2. Programmierung in C

Programmieren I. Kapitel 5. Kontrollfluss

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Evaluation. Einleitung. Implementierung Integration. Zusammenfassung Ausblick

Programmieren in C/C++ und MATLAB

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Überblick. R.Grossmann / P. Sobe 1

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Just-In-Time-Compiler (2)

6. Der OpenMP Standard. Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++

Das Einsteigerseminar Objektorientierte Programmierung in Java

Tag 4 Repetitorium Informatik (Java)

Programmiertechnik 1 FOR-SCHLEIFEN

Inhaltsverzeichnis. Inhalt. Bemerkung... 9 Vorwort Programme und Programmiersprachen

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Shared-Memory Parallelisierung von C++ Programmen

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Programmiertechnik 1 FOR-SCHLEIFEN

Tutorium Softwaretechnik I

Sprachkonstrukte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Werkzeuge zur Programmentwicklung

Grundlagen der Informatik Ergänzungen WS 2007/2008 Prof. Dr. Rainer Lütticke

C.3 Funktionen und Prozeduren

Einführung in die Modelltransformation mit Xtend

Einfache Datentypen in JAVA

RO-Tutorien 15 und 16

Transkript:

MPI und OpenMP in HPC Anwendungen findet man immer häufiger auch den gemeinsamen Einsatz von MPI und OpenMP: OpenMP wird zur thread-parallelen Implementierung des Codes auf einem einzelnen Rechenknoten (z.b. SMP) eingesetzt mit Aufruf geeigneter Funktionen aus der MPI-Bibliothek wird die Kommunikation zwischen den auf den verschiedenen Rechenknoten laufenden parallelen Prozessen implementiert MPI-Bibliothek muss hierzu thread-sicher sein (z.b. Sun MPI)! 52 Automatische Parallelisierung Idee: Compiler extrahiert automatisch die Parallelität aus einem sequentiellem Programm und generiert eine thread-basierte parallele Implementierung Ansatz: In den meisten HPC-Anwendungen wird die meiste Rechenzeit für (geschachtelte) Schleifen benötigt Ist auch eine automatische Parallelisierung von Schleifen durch Compiler möglich? Stand der heutigen Compilertechnik: Analyse von Datenabhängigkeiten in Schleifen zur Erkennung von sicher parallelisierbaren Schleifen Generierung von parallelem Code für einfache Schleifen mit Barrieren- Synchronisation am Schleifenende einige einfache Code-Transformationen werden zur Erhöhung der Anzahl parallelisierbarer Schleifen durchgeführt 53

Automatische Parallelisierung (Forts.) Einfache Schleifen (d.h. ohne Index-Abhängigkeiten zwischen Iterationen) lassen sich gut automatisch parallelisieren, z.b.: for (i=0 ; i<n ; i++) for (j=0 ; j<m ; j++) a[i][j] = b[i][j] * c[i][j]; for (i=0 ; i<n/2 ; i++) for (j=0 ; j<m/2 ; j++) a[2*i][2*j+1] = a[2*i][2*j+1] + b[3*i][j+2]; for (i=1 ; i<n/2 ; i++) a[2*i] = 0.5 * (a[2*i-1] + a[2*i+1]); automatische Parallelisierung z.b. auf Sun durch Aufruf von cc fast xautopar xloopinfo <file>.c o file und Setzen der Umgebungsvariablen PARALLEL auf den gewünschten Parallelitätsgrad 54 Automatische Parallelisierung (Forts.) Probleme entstehen bei automatischer Parallelisierung z.b. durch Schleifen mit Index-Abhängigkeiten zwischen Iterationen: for (i=1 ; i<n ; i++) a[i] = a[i-1] + b; for (i=0 ; i<n-2 ; i++) { a[i] = b[i] * c; b[i] = a[i+2] * d; Schleifen mit Funktionsaufrufen: for (i=0 ; i<n ; i=i+incr(i)) a[i] = a[i] + b[i] * c; for (i=0 ; i<n ; i=i++) a[i] = a[i] + compute(a,b,i); 55

Automatische Parallelisierung (Forts.) auf Zeiger basierende Schleifen: for (i=min ; i<max ; i++) *p++ = *q--; Schleifen mit auf Feldern basierenden Indexausdrücken: for (i=0 ; i<n ; i++) a[p[i]] = a[q[i]] + b[p[i]] + c; Schleifen mit mehreren datenabhängigen Ausgängen: for (i=0 ; i<n ; i++) { if (b[i] == 0) break; a[i] = a[i] / b[i]; Schleifen mit indexabhängigen Bedingungen: for (i=0 ; i<n ; i++) for (j=0 ; j<m ; j++) if (j > i) a[i][j] = a[i][j] + b[i][j] * c; 56 Automatische Parallelisierung (Forts.) Schleifen mit (eventuell versteckten) Reduktionen: for (i=0 ; i<n ; i++) { y = x + 0.5 * a[i]; x = y + 2 * b[i]; Schleifen mit skalaren Werten: for (i=0 ; i<n ; i++) { t = a[i]; a[i] = b[i]; b[i] = t; 57

Automatische Parallelisierung (Forts.) einige Probleme lassen sich (zumindest in einfachen Fällen) durch Code-Transformationen lösen, z.b. indem skalare Variablen durch Feldvariablen ersetzt werden Variablen in Schleifen umbenannt werden Anweisungen oder Funktionen eingesetzt werden ( Inlining ) Reduktionen von Vektoren automatisch erkannt und durch Aufrufe von parallelen Reduktionsfunktionen ersetzt werden (z.b. auf Sun möglich durch Angabe der zusätzlichen Option xreduction) eine weitere Leistungssteigerung kann erreicht werden, indem bei geschachtelten Schleifen innere und äußere Schleife vertauscht werden, um z.b. Parallelitätsgrad oder Anzahl paralleler Berechnungen zu erhöhen Schleifen automatisch entrollt werden mehrere kleine Schleifen mit identischem Indexbereich zusammengefasst werden 58 Automatische Vektorisierung bei der automatischen Vektorisierung wird aus Schleifen ein Code für Vektorprozessoren oder Vektoreinheiten generiert: in geschachtelten Schleifen wird stets nur die innere Schleife vektorisiert Schleifeniterationen müssen unabhängig sein nur einfache Zugriffsmuster auf Feldelemente gestattet die N Iterationen einer Schleife werden derart in Streifen unterteilt, dass die Zahl k der Feldelemente je Streifen in ein Vektorregisters passt (ggf. Sonderbehandlung für die letzten Iterationen erforderlich, wenn N kein Vielfaches von k ist) Beispiel: Gegeben sei ein Prozessor mit 128-Bit Vektorregister und eine Schleife mit den float Vektoren a, b und c vor der Vektorisierung: for (i=0; i<n; i++) c[i] = a[i] * b[i] nach der Vektorisierung: for (i=0; i<n; i++) c[i:i+3] = a[i:i+3] * b[i:i+3] 59

Automatische Vektorisierung (Forts.) Intel C/C++ Compiler kann ab Version 7.0 automatisch Code für die Vektoreinheiten MMX, SSE und SSE2 des Intel Pentium 4 Prozessors generieren Aufruf erfolgt z.b. mit: icc xw vec_report3 prog.c in aufeinanderfolgenden Iterationen dürfen nur Zugriffe auf benachbarte Feldelemente erfolgen (d.h. mit stride = 1) Compiler kann effizienteren Code generieren, wenn Daten auf 16-Byte Grenzen ausgerichtet sind es können sowohl for als auch while Schleifen vektorisiert werden; sie dürfen jedoch nur einen Eintritts- und einen Ausgangspunkt aufweisen 60 High Performance FORTRAN (HPF) im Jahre 1993 vom HPF Forum entwickelter Standard als Ergänzung zu FORTRAN 90 Ziel: architekturunabhängige parallele Programmierung FORTRAN ermöglicht einfachere Parallelisierung als C, da keine Zeiger vorhanden sind i.a. keine dynamischen Datenstrukturen unterstützt werden HPF gestattet explizite datenparallele Programmierung durch Datenstrukturen (Arrays) für mehrdimensionale Datenfelder parallele Ausführung auf Feldkomponenten mittels FORALL: FORALL (I=2:N-2:2, J=1:M) A(I,J) = B(I-1,J)+C(I+1,J) oder durch eine parallele Zuweisung: M(1:N,7) = 0.5 zusätzliche INDEPENDENT-Direktive zur Kennzeichnung konfliktfrei parallel ausführbarer Schleifen 61

HPF (Forts.) einige zentrale Ideen von High Performance FORTRAN: Definition von Indexräumen ( index templates ):!HPF$ TEMPLATE t(1:100,1:100) Angabe des Alignments von Feldern zu Indexräumen oder anderen Feldern:!HPF$ ALIGN A(I,J) WITH t(j,i)!hpf$ ALIGN B(I,J) WITH t(2*i,2*j) zusätzliche Layout-Direktive geben an, wie einzelne Index-Dimensionen auf p Prozessoren verteilt (d.h. partitioniert) werden: REAL A(100,100), B(50,50), C(100,100,2)!HPF$ DISTRIBUTE t(block,*), C(CYCLIC,BLOCK,*) mit BLOCK : Datenelement i wird auf Prozessor i DIV p abgebildet CYCLIC : Datenelement i wird auf Prozessor i MOD p abgebildet * : Elemente dieser Dimension werden nicht verteilt zur Laufzeit Reorganisation der Daten möglich: REDISTRIBUTE bzw. REALIGN (Syntax wie DISTRIBUTE und ALIGN) 62 HPF (Forts.) parallele implizite Kommunikation über Indexausdrücke: FORALL (I=1:100) A(I,2) = C(I,5,1) viele eingebaute Kommunikationsfunktionen: SUM, TRANSPOSE,... HPF unterstützt mehrdimensionale virtuelle Prozessortopologien, Beispiel: Matrix-Multiplikation in HPF REAL*4, DIMENSION(1000,1000) :: A,B,C!HPF$ PROCESSORS GRID(2, 2)!HPF$ DISTRIBUTE C(BLOCK,BLOCK) onto GRID!HPF$ ALIGN A(I,J) WITH C(I,*)!HPF$ ALIGN B(I,J) WITH C(*,J) INTEGER :: I,J,K DO I = 1, 1000 DO J = 1,1000 DO K = 1,1000 C(I,J) = C(I,J) + A(I,K) * B(K,J) END DO END DO END DO 63

Java und Java? höherer Speicherbedarf (ca. 5-fach im Vgl. zu C) geringere Geschwindigkeit (ca. 25-100% langsamer im Vgl. zu C) durch Teilinterpretation des Codes mittels Just-in-time Übersetzer Probleme bei Gleitkomma-Anwendungen durch Forderung nach exakter Reproduzierbarkeit von Ergebnissen genauere Zwischenergebnisse in FPU müssen vor jeder Folgeoperation auf das von Java vorgeschriebene Zahlenformat gerundet werden! Verbot von Multiply&Add Maschinenbefehlen ineffiziente interne Realisierung von mehrdimensionalen Feldern schlechtere Lesbarkeit von Programmen (kein Überladen von Operatoren) Threads sind bereits fester Bestandteil der Sprache: Starten eines Threads durch Instantiierung eines Objekts von der Klasse Thread und Aufruf der Methode start() gegenseitiger Ausschluss durch Schlüsselwort synchronized 64 Java (Forts.) dasjava Grande Forum (www.javagrande.org) versucht, eine zum Einsatz in HPC Anwendungen besser geeignete Java- Umgebung zu definieren, z.b. durch neue Schlüsselworte strictfp und fastfp neue Klassen für mehrdimensionale Felder Festlegen einer Schnittstelle für MPI zukünftige Bedeutung von Java für HPC unklar! 65