8. HPF High Performance FORTRAN

Ähnliche Dokumente
Universität Karlsruhe (TH)

Automatische Parallelisierung

Programmtransformationen: Vom PRAM Algorithmus zum MPI Programm

Matrizenoperationen mit FORTRAN

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

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Datenparallelität. Bildverarbeitung Differentialgleichungen lösen Finite Element Methode in Entwurfssystemen

Praktikum: Paralleles Programmieren für Geowissenschaftler

Universität Karlsruhe (TH)

Programmiervorkurs für die Numerik Teil 2/4

1 Wiederholung: Definition von Arrays

float: Fließkommazahl nach IEEE 754 Standard mit 32 bit

Einführung in die Programmierung (MA8003)

FORTRAN77. eine höllische Programmiersprache. Christian Sternecker. Sommersemester TU-München

Praktikum: Paralleles Programmieren für Geowissenschaftler

Konzepte der parallelen Programmierung

Modul 122 VBA Scribt.docx

Wertebereich und Genauigkeit der Zahlendarstellung

C.3 Funktionen und Prozeduren

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Präfix-Summe. Das Schweizer Offiziersmesser der Parallelen Algorithmen. Parallele Rechenmodelle Präfix-Summe Brents Lemma Anwendungen

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Einführung in die Programmierung (MA8003)

Einführung in die Programmierung (MA8003)

WiMa-Praktikum 1. Woche 8

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

Angewandte Mathematik und Programmierung

Arrays (=Felder) Vektoren. Matrizen. Beispiel: Einlesen eines Vektors

Einführung Programmierpraktikum C Michael Zwick

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Zugriff auf Matrizen. Anhängen von Elementen. Punktweise Operatoren. Vektoren und Matrizen in MATLAB II

Programmsteuerung. Mittel zur Programmverzweigung:

2.3 Chaos und Lyapunov-Exponent. d dx f(x) λ = lim n n . (1) Programm. k=0. PROGRAM lyapunov ...

Programmieren I. Kapitel 5. Kontrollfluss

Wiederholung. Divide & Conquer Strategie

Informatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5

Zweiter Teil des Tutorials. Workspace M-files Matrizen Flow Control Weitere Datenstrukturen Gemeinsames Beispiel erarbeiten

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

R-Wörterbuch Ein Anfang... ein Klick auf einen Begriff führt, sofern vorhanden, zu dessen Erklärung.

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

Android-Apps Gegenüberstellung Delphi java

Anweisungen in Fortran - Wertzuweisung

Programming 101. Carl Herrmann IPMB & DKFZ

Informationsverarbeitung im Bauwesen

Copyright, Page 1 of 7 Heapsort

Arrays 115. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

Chapel Dennis Appelt. Seminar: Sprachen für Parallelverarbeitung.

Reihungen und Prozeduren

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

Informationsverarbeitung im Bauwesen

Visual C#.NET. Bearbeitet von Patrick A. Lorenz

6. Funktionen, Parameterübergabe

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Übung zu Algorithmen I 31. Mai 2017

Vorlesung 6: Operatoren, Logische Ausdrücke

Universität Duisburg - Essen

Übungspaket 23 Mehrdimensionale Arrays

Zeiger: Der Adressoperator &

PROGRAMMIERKURS FORTRAN

Teil VI: Prozeduren Feld-Parameter & Typen. 1. Offene ARRAY-Parameter 2. Prozedurtypen und -variablen

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Inhalt. Mathematik für Chemiker II Lineare Algebra. Vorlesung im Sommersemester Kurt Frischmuth. Rostock, April Juli 2015

Maple-Test zur LVA 'Computermathematik', SS Gruppe weiß

3.4 Struktur von Programmen

OpenCL. Programmiersprachen im Multicore-Zeitalter. Tim Wiersdörfer

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Algorithmen und ihre Programmierung -Teil 2-

Übungspaket 23 Mehrdimensionale Arrays

Vorlesung Programmieren

OOP Aufgabenblatt 7 6. Dezember 2013

Praktikum zur Vorlesung: Numerische Mathematik für Lehramt SS Matlab: Fortsetzung. Jan Mayer. 4. Mai 2006

Modellierung und Programmierung 1

Musterlösungen zur Linearen Algebra II Weihnachtszettel

2.7 Felder (Arrays) Das englische Wort array hatte ursprünglich militärische Bedeutung: Aufstellung zur Schlacht : Titel der Zeichnung links:

Strukturen & Math. Strukturen und Vektoren. Allokieren eines Vektors. Zugriff auf Strukturen. Freigeben eines Vektors

Strukturen & Math. Strukturen für mathematische Objekte: allgemeine Vektoren Matrizen

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Programmieren 1 C Überblick

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Programmiersprachen Einführung in C

Grundbegriffe der Informatik

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

LINEARE ALGEBRA II. FÜR PHYSIKER

ÜBUNGS-BLOCK 7 LÖSUNGEN

2. Hausübung Algorithmen und Datenstrukturen

Einführung in die Programmiersprache Julia Vorlesung Computerphysik Sommersemester 2018 Ralf Bulla Universität zu Köln

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

1. Einführung in OpenMP

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Informatik 1 ( ) D-MAVT F2010. Pointer, Structs, Sortieren. Yves Brise Übungsstunde 6

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Beispiel: Schleifenparallelisierung

Teil 4 FORTRAN. Prof. Dr. Gerhard Goos, Dr. Sabine Glesner Höhere ProgrammiersprachenWS 2002/03 (5. Foliensatz) 1

Fragenkatalog ESOP WS 16/17

Algorithmen und Datenstrukturen 2. Stefan Florian Palkovits, BSc Juni 2016

Transkript:

8. HPF High Performance FORTRAN datenparallele Erweiterung von FORTRAN 90 SPMD-Ansatz daten-parallele Array-Operationen verteilte Datenstrukturen Schleifenparallelität

FORTRAN 77 -> FORTRAN 90 -> HPF FORTRAN 90 = FORTRAN 77 + Zeiger (pointers) Rekursion benutzerdefinierte Datenstrukturen... Matrizenoperationen, z.b. A = B + C, A = B * C, A = B C HPF = FORTRAN 90 + Direktiven (= strukturierte Kommentare zur Compilersteuerung) Processors pr(20) pr(5;4) Align Distribute 316

Datenparallelität in FORTRAN 90 FORTRAN 90 hat keine explizite Parallelität, aber implizite Datenparallelität über Arrays, meist Vektoren (eindimensional) und Matrizen (zweidimensional). Terminologie für Arrays: Rang: Anzahl von Dimensionen Vektor: eindimensionales Array Form (shape): Vektor, der die Anzahl der Elemente für jede Dimension angibt Z.B.: INTEGER I (10)! Rang 1, Form (10) REAL, DIMENSION (8,8) :: A, B! Rang 2, Form (8,8) REAL C (0:7, 0:7)! Rang 2, Form (8,8) A, B und C passen zueinander, wenn sie dieselbe Form haben. Operationen können auf passende Arrays angewendet werden. 317

Datenparallele Arrayoperationen binäre Operationen B+C, B*C, B-C unäre Operationen A = sqrt(b) Array-Skalar-Operationen B+c B*c Reduktionsoperationen SUM(A) MAXVAL(A) MAXLOC(A) Restrukturierungsoperationen TRANSPOSE(A) 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 cshift(a,-1) 41 42 43 44 45 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 cshift(a,-3,2) 13 14 15 11 12 23 24 25 21 22 33 34 35 31 32 43 44 45 41 42 CSHIFT(A) (circular shift) 318

Sektionsnotation für Arrays array (..., ini : end : offset/step,... ) A (2, : ) A (2, 2:8) A (2, 2:9:2 ) Defaultwerte sind: ini = untere Indexgrenze, end = obere Indexgrenze, offset = 1 A(:) ist also gleichbedeutend zu A. 319

Irreguläre Arraysektionen Irreguläre Arraysektionen werden durch Vektoren spezifiziert: Beispiel: Falls V = (/5, 2, 1, 2/) bezeichnet A(V) die Wertfolge (/A(5), A(2), A(1), A(2)/). Arraybezeichnungen können verschiedene Sektionsnotationen enthalten, z.b. B(3:5:2,2,V). Rang und Form von Arrays werden durch die Dimensionen mit Sektionsindizes bestimmt skalare Indizes spielen keine Rolle. Beispiel: B(3:5:2, 2, V) mit V = (/8, 1/) hat den Rang 2 und die Form (2,2). Die Elemente sind: [ B(3,2,8) B(3,2,1) ] [ B(5,2,8) B(5,2,1) ] 320

Datenparallele Arrayzuweisungen In var = expr wird expr vollständig für alle Indizes vor der Zuweisung ausgewertet, d.h. in expr werden alte Werte verwendet. Beispiel: A(2:3) = A(1:2) bewirkt A = (/ altes A(1), altes A(1), altes A(2),... /) Zum Vergleich: DO i=2,3 A(i) = A(i-1) bewirkt A = (/ altes A(1), altes A(1), altes A(1),... /) ENDDO Letzteres ist gleichbedeutend mit A(2:3) = A(1). Weiteres Beispiel: A(2:9) = 0.5 * (A(1:8) + A(3:9)). 321

Logische Array-Ausdrücke (Masken) Vergleichsoperatoren: > >= < <= == /= Logische Operatoren:.AND..OR..EQV..NEQV. Beispiel: Falls V = (/ 1, 0, -5 /) ergibt (V > 0) den Vektor (/.TRUE.,.FALSE.,.FALSE. /). Maskierung von Array-Zuweisungen mittels WHERE-Konstrukt: Beispiele: REAL A(10), B(10) WHERE (A > 0.0) WHERE (A>0.0) B = 1.0/A B = 1.0 / A ELSEWHERE B = 0.0 ENDWHERE 322

Array Funktionen Benutzerdefinierte Funktionen können Array-Resultate berechnen: FUNCTION matvec (M, V) REAL M(:,:), V(SIZE(M,2)), matvec (SIZE(M,1)) INTEGER i!-------------------------------------!! Returns matvec(i) = SUM_j {M(i,j) * V(j)}!!-------------------------------------! DO i = 1, SIZE (matvec) matvec(i) = SUM (M(i,:) * V(:)) ENDDO END FUNCTION... REAL A(10,10), V(10)! Initialisiere A und V! V = matvec (A,V) 323

Beispiel: Jacobi Iteration REAL, DIMENSION (m,n) :: a, old_a old_a = 0.0 CALL init(a)! Rand von a festlegen a (2:m-1, 2:n-1) = 0.0! Inneren Bereich auf 0.0 setzen DO WHILE (ANY (a-old_a > 1E-07 * a)) old_a = a a (2:m-1, 2:n-1) = 0.25 * & (a(1:m-2,2:n-1) + a(3:m, 2:n-1) + a(2:m-1,1:n-2) + a(2:m-1, 3:n)) ENDDO 324

Beispiel: Rot-Schwarz-Relaxation REAL, DIMENSION (m,n) :: a, old_a LOGICAL :: even (m-2, n-2) old_a = 0.0 CALL init(a, even)! Rand von a festlegen! Initialisiere even(i,j) mit.true., falls i+j gerade,.false. sonst DO WHILE (ANY (a-old_a > 1E-07 * a)) old_a = a WHERE (even) a (2:m-1, 2:n-1) = 0.25 * & (a(1:m-2,2:n-1) + a(3:m, 2:n-1) + a(2:m-1,1:n-2) + a(2:m-1, 3:n)) ELSEWHERE a (2:m-1, 2:n-1) = 0.25 * & (a(1:m-2,2:n-1) + a(3:m, 2:n-1) + a(2:m-1,1:n-2) + a(2:m-1, 3:n)) ENDWHERE ENDDO 325

Ausführungsmodell von HPF Die HPF-Direktiven steuern die Abbildung von Daten auf Prozessorspeicher Zweistufige Abbildung: Arrays oder andere Objekte Gruppen verbundener Objekte abstraktes Prozessorfeld physikalische Prozessoren ALIGN DISTRIBUTE PROCESSORS 326

HPF Datenverteilungsdirektiven!HPF$ PROCESSORS proc_name(dim1,dim2,..., dimn) deklariert ein abstraktes Prozessorfeld. proc_name ist der Name des Prozessorfelds dim1... dimn bestimmen die Größe und Form des Prozessorfelds!HPF$ ALIGN array WITH target verknüpft zwei Felder!HPF$ DISTRIBUTE list_of_arrays [ONTO proc_name] verteilt Felder auf ein Prozessorfeld 327

Die ALIGN-Direktive ALIGN array WITH array reference bewirkt die Verteilung von Arrays in Bezug auf ein Referenzarray. Beispiele: ALIGN A(I) WITH B(I) A B ALIGN A(I) WITH B(I+2) A B 328

Weitere Beispiele ALIGN C(I) WITH B(2*I) C ALIGN D(I,J) WITH E(J,I) D B ALIGN D(:,*) WITH F(:) ALIGN F(:) WITH D(*,:) D A E D A Replikation Transposition 329

Die Distribute-Direktive DISTRIBUTE arrays [ONTO proc_name] dient der Verteilung von Arrays auf ein abstraktes Prozessorfeld blockweise => zusammenhängende, etwa gleich große Blöcke zyklisch => reihum Verteilung * => keine Verteilung in entsprechender Dimension Beispiel: Verteilung eines 4x4-Arrays auf 4 Prozessoren 1 1 2 1 2 1 2 2 3 4 3 4 3 1 2 1 2 4 3 4 3 4 3 4 1 2 3 4 (BLOCK, *) (*,BLOCK) (BLOCK, BLOCK) (CYCLIC, CYCLIC) eindimensionales Prozessorfeld zweidimensionales Prozessorfeld 330

Beispiel: Jacobi mit HPF Direktiven REAL, DIMENSION (m,n) :: a, old_a!hpf$ PROCESSORS pr(4)!hpf$ ALIGN a (:,:) WITH old_a(:,:)!hpf$ DISTRIBUTE old_a(block,*) ONTO pr old_a = 0.0 CALL init(a) a (2:m-1, 2:n-1) = 0.0! Rand von a festlegen! Inneren Bereich auf 0.0 setzen DO WHILE (ANY (a-old_a > 1E-07 * a)) old_a = a a (2:m-1, 2:n-1) = 0.25 * & (a(1:m-2,2:n-1) + a(3:m, 2:n-1) + a(2:m-1,1:n-2) + a(2:m-1, 3:n)) ENDDO 331

Weiteres Beispiel: Pairwise Interactions program hpf_pairwise_interactions!hpf$ PROCESSORS pr(10) real X(3,1000), Force(3,1000), Tmp(3,1000)!HPF$ ALIGN Force(:,:) WITH X(:,:)!HPF$ ALIGN Tmp(:,:) WITH X(:,:)!HPF$ DISTRIBUTE X(*,BLOCK) ONTO pr Force = 0.0 Tmp = X do i = 1, 999 tmp = CSHIFT(Tmp,1,2) Force = Force + f(x,tmp) enddo end 332

Schleifenparallelität mit FORALL FORALL (range_1,..., range_n, boolean_exp) assignment Beispiele: FORALL (i=2:9) A(i) = 0.5*(A(i-1) + A(i+1)) ist gleichbedeutend mit A(2:9) = 0.5 * (A(1:8) + A(3:10)) FORALL (i=1:10, A(i)>0.0) A(i) = 1/A(i) ist gleichbedeutend mit WHERE (A(1:10)>0.0) A(1:10) = 1.0/A(1:10) FORALL (i=1:m, j=1:n) even(i,j) = (MOD (i+j, 2) == 0) FORALL (i=1,n) A(i,i) =... FORALL (i=1,n, j=1,m, j>= i) =...! Diagonale! oberes Dreieck FORALL (i=1,n, j=1:m) & C(i,j) = DOT_PRODUCT (A(i,:), B(:,j)) 333

Die Independent-Direktive Die INDEPENDENT-Direktive zeigt an, dass die Iterationen einer Do-Schleife unabhängig voneinander sind und daher parallel ausgeführt werden können. Beispiel:!HPF$ INDEPENDENT DO i = 1, n1!hpf$ INDEPENDENT DO j=1,n2 DO k=1,n3 A(i,j) = A(i,j) + B(i,j,k) ENDDO ENDDO ENDDO 334