Programmtransformationen: Vom PRAM Algorithmus zum MPI Programm

Ähnliche Dokumente
p max = 4 T = 8 Work = 28 3 I = Work / T = 3,5 2 Cost = p max * T = 32 U = I / p max = 87,5% 1

OpenMP am Beispiel der Matrizenmultiplikation

Kommunikationsmodelle

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

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

Konzepte der parallelen Programmierung

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

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

Objektorientierte Programmierung VL: Prof. Dr. Marco Block-Berlitz - Freie Universität Berlin Proinformatik III

Vorlesung "Verteilte Systeme" Sommersemester Verteilte Systeme. Adreßraum. Rechner. Verteilte Systeme, Sommersemester 1999 Folie 19.

Paralleler Programmentwurf nach Foster

Programmierung. Rückblick. VWA - Programmierung Winter Algorithmus. Programmiersprache. Variable. Zuweisung. Bedingung.

Algorithmen und Datenstrukturen

Effiziente Algorithmen 2

Algorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser

Parallele Algorithmen in der Bildverarbeitung

Algorithmen und Datenstrukturen (für ET/IT)

Rechnerarchitektur. Lösungsvorschlag 6. Übung. Sommersemester Aufgabe: Zyklische Verschiebung

Computergrafik Universität Osnabrück, Henning Wenke,

Kapitel 1 Parallele Modelle Wie rechnet man parallel?

Kombinatorische Optimierung

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

Automatische Parallelisierung

Wertebereich und Genauigkeit der Zahlendarstellung

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

Algorithmische Geometrie: Arrangements und

Zentralübung Grundlagen der Programmierung

Parallele und verteilte Programmierung

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

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Tag 4 Repetitorium Informatik (Java)

Schleifen Datenfelder (Arrays) Verzweigungen

Grundbegriffe der Informatik

Crashkurs: MATLAB (Teil II)

Lösen der Matrizengleichung

Programmieren I. Kapitel 5. Kontrollfluss

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

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

7. Sortieren Lernziele. 7. Sortieren

Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre 1990.

Tag 3 Repetitorium Informatik (Java)

Kapitel 5 Deklaration und Sichtbarkeitsbereich

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Übung 04 Mehrkörper Keplerproblem

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

Rechnernetze Übung 10. Frank Weinhold Professur VSR Fakultät für Informatik TU Chemnitz Juni 2011

Einführung in die Programmierung (MA8003)

Automatisches Parallelisieren

Control Beispiel. Control wird als kombinatorische Schaltung realisiert. Hierzu die Wahrheitstabelle: Control

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Repetitorium Informatik (Java)

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Zelluläre Automaten. Zelluläre Automaten sind einfache Simulationssysteme zur Untersuchung von komplexen Interaktionsmuster

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

Algorithmen und Datenstrukturen 2

...imbeispiel: Die Konkatenation der Blätter des Ableitungsbaums t bezeichnen wir auch mit yield(t). liefert die Konkatenation: name int + int.

IT-Security. Teil 8b: Rechnen mit beliebiger Genauigkeit Algorithmen

Vorlesung Programmieren

Elementare Konzepte von

Ideen und Konzepte der Informatik

Kapitel 3: Sortierverfahren Gliederung

Sprechen Sie Java? Hanspeter Mössenböck. Tm\ dpunkt.verlag. Eine Einführung in das systematische Programmieren

Kap 7. Funktionen und Arrays

Schriftliche Prüfung

Einführung in die objektorientierte Programmierung mit C++

Programmierung mit Feldern OOPM, Ralf Lämmel

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

ÜBUNGS-BLOCK 7 LÖSUNGEN

Grundlagen: Algorithmen und Datenstrukturen

Transkript:

Programmtransformationen: Vom PRAM Algorithmus Dr. Victor Pankratius David J. Meder IPD Tichy Lehrstuhl für Programmiersysteme KIT die Kooperation von Forschungszentrum Karlsruhe GmbH und Universität Karlsruhe (TH)

Modell und Realität Das PRAM Modell geht von N logischen Prozessoren aus. Das Rechnerbündel hat aber lediglich P < N physikalische Prozessoren Prozessvirtualisierung notwig. Das PRAM Modell geht von gemeinsamem Adressraum aus. Das Rechnerbündel verfügt jedoch über einen verteilten Speicher Datenverteilung notwig. 2

Datenverteilung (1) Problem: Wie verteilt man (globale) Daten auf die Speichermodule der einzelnen Prozessoren? PRAM Ansatz: bei einem N-elementigen Vektor V[0 N- 1] hält jeder Prozessor i das Datenelement V[i]. Prozessor V 3

Datenverteilung (2) Was tun bei P < N Prozessoren? (1) Zyklische Datenverteilung Prozessor V 0 1 2 3 0 1 2 3 4 5 6 7 (2) Blockweise Datenverteilung Prozessor V 0 1 2 3 0 2 4 6 1 3 5 7 4

Datenverteilung (3) Zyklische Datenverteilung: Jeder Prozessor j bekommt alle Datenelemente i, für die gilt (i mod P) = j. Blockweise Datenverteilung: Jeder Prozessor j bekommt die Datenelemente in Segmenten der Länge N/P (bis evtl. auf den letzten): V[j* N/P (j+1)* N/P -1] 5

Datenverteilung (4) Gibt es weitere Verteilungsstrategien? Ja, nämlich die zufällige Verteilung (Random) und die blockzyklische Verteilung (Bcycle(k)), bei der jeweils Datenblöcke der Länge k zyklisch über die vorhanden Prozessoren verteilt werden. V Prozessor 0 1 2 3 0,1 2,3 4,5 6,7 8,9 10,11 12,13 14,15 6

Datenverteilung (5) Bcycle(k) ist die allgemeine Verteilungsstrategie, da Zyklisch = Bcycle(1) Block = Bcycle(N/P) Frage: Was tun bei mehrdimensionalen Feldern? Je eine Bcycle(k) Verteilung pro Dimension 7

Datenverteilung (6) 2D Spaltenweise: Bcycle(N)/Bcycle(1) (64 Elemente auf 4 Prozessoren) oder Bcycle(N)/Bcycle(2). 8

Datenverteilung (7) 2D Zeilenweise Bcycle(1)/Bcycle(N) (64 Elemente auf 4 Prozessoren) oder Bcycle(2)/Bcycle(N). 9

Datenverteilung (8) 2D Quadrantenweise (Bcycle(N/SQRT(P))/Bcycle(N/SQRT(P))) (64 Elemente auf 4 Prozessoren) oder Bcycle(2)/Bcycle(2). 10

Datenverteilung (9) Bcycle(1)/Bcycle(4) (64 Elemente auf 4 Prozessoren) oder Bcycle(2)/Bcycle(1). 11

Daten- und Prozessverteilung Wir wissen jetzt, welche Daten auf welchen Prozessoren liegen (Datenverteilung). Jetzt müssen die N Prozesse auf die P Prozessoren verteilt werden (Prozessverteilung). 12

Prozessverteilung (1) Rückblick: einfaches PRAM Programm: FORALL i [0.. N-1] IN PARALLEL DO A[i] := B[i] + C[i] END Jeder gedachte Prozess/Prozessor i ist für die Berechnung des i-ten Datenelements zuständig oder: Datenelement i wird von Prozess/Prozessor i berechnet. 13

Prozessverteilung (2) Aus der Datenverteilung kennen wir den physikalischen Prozessor j, der Datenelement i hält. Owner-Computes-Regel (aus Übersetzerbau für parallele Programmiersprachen). Idee: Lege gedachten Prozess/Prozessor i ebenfalls auf physikalischen Prozessor j (denn dort liegen ja die benötigten Daten) Bei gegebener Datenverteilung unter Zuhilfenahme der Owner-Computes-Regel, kann man die Prozessverteilung analog zur Datenverteilung berechnen 14

Programmtransformation Systematik: Festlegen der Datenverteilung. Emulation von V = N/P virtuellen Prozessoren auf je einem physikalischen Prozessor (sog. Virtualisierung) Umwandeln von nichtlokalen Datenzugriffen in S / Receive Operationen. 15

Virtualisierung (1) Emulation von N virtuellen Prozessoren auf P realen Prozessoren. Beispiel: FORALL i : [0.. N-1] A[i] := B[i] + C[i] wird zu FORALL i : [0.. P-1] FOR v : [i*(n/p)..(i+1)*(n/p)-1] A'[v] := B'[v] + C'[v] 1*N/P N 2*N/P N/P 16

Virtualisierung (2) Original PRAM Programm (8 Prozessoren) Programm nach Virtualisierung (4 Prozessoren) Prozessor Prozessor 0 1 2 3 A + B = C A + B = C A, B und C sind die verteilten Felder A, B und C 17

Virtualisierung (3) Frage: Ist die Emulation mittels einer (FOR-) Schleife zulässig? Antwort: Ja Bei asynchroner Ausführung: Die ursprünglichen Prozessoren der PRAM arbeiten vollkommen unabhängig voneinander. Diese Eigenschaft überträgt sich auf die Virtualisierungsschleife, deren einzelne Iterationen ebenfalls unabhängig sind. 18

Virtualisierung und Kommunikation (1) Bisher haben wir Datenverteilung bei der Virtualisierung nicht betrachtet. Wie erfolgt beim folgen Beispiel die blockweise bzw. zyklische Datenverteilung? FORALL i : [0.. N-1] IN SYNC A[i] := A[(i+1)mod N] Prozessor A A 1 2 3 4 5 6 7 0 19

Virtualisierung und Kommunikation (2a) Blockweise Datenverteilung: forall i : [0.. P-1] in parallel v := (N/P); ziel := (i-1) mod P; quelle:=(i+1) mod P; // lokale Indizierung tmp := A[0]; //merke altes A[0] for j : [0.. v-2] // verschiebe alle lokalen Werte, bis auf den letzten A[j] = A[j+1]; //se altes A[0] zum Nachbarn SEND(tmp, ziel); //rechtes Element in letzte Pos. holen A[v-1] = RECEIVE(quelle); // Synchronisation durch // SEND und RECEIVE 20

Virtualisierung und Kommunikation (2b) Blockweise Datenverteilung: forall i : [0.. P-1] in parallel v := (N/P); ziel := (i-1) mod P; quelle:=(i+1) mod P; // lokale Indizierung tmp := A[0]; //merke altes A[0] for j : [0.. v-2] // verschiebe alle lokalen Werte, bis auf den letzten A[j] = A[j+1]; //se altes A[0] zum Nachbarn SEND(tmp, ziel); //rechtes Element in letzte Pos. holen A[v-1] = RECEIVE(quelle); Beispiel: i=0, N=8, P=4, v=n/p=2 P0: Ziel=3, Quelle=1, snd( 0,3), A[1]=rcv(1) P1: Ziel=0, Quelle=2, snd( 2,0), A[1]=rcv(2) P2: Ziel=1, Quelle=3, snd( 4,1), A[1]=rcv(3) P3: Ziel=2, Quelle=0, snd( 6,2), A[1]=rcv(0) Prozessor 0 1 2 3 A // Synchronisation durch // SEND und RECEIVE A 1 2 3 4 5 6 7 0 21

Virtualisierung und Kommunikation (3a) Zyklische Datenverteilung: forall i : [0.. P-1] in parallel v := (N/P); ziel := (i-1) mod P; quelle := (i+1) mod P; for j : [0.. v-1] // Se Wert an Nachbarn SEND(A[j], ziel); //empfange Nachbarwerte in temp. T T[j] := RECEIVE(quelle); //aktualisiere A for j : [0.. v] A[j] := T[j]; 22

Virtualisierung und Kommunikation (3b) Zyklische Datenverteilung: forall i : [0.. P-1] in parallel v := (N/P); ziel := (i-1) mod P; quelle := (i+1) mod P; for j : [0.. v-1] // Se Wert an Nachbarn SEND(A[j], ziel); //empfange Nachbarwerte in temp. T T[j] := RECEIVE(quelle); //aktualisiere A for j : [0.. v] A[j] := T[j]; Beispiel: i=0, N=8, P=4, v=n/p=2 P0: Ziel=3, Quelle=1; P1: Ziel=0, Quelle=2 P2: Ziel=1, Quelle=3; P3: Ziel=2, Quelle=0 j=0 P0: snd( 0,3), A[0]=rcv(1) P1: snd( 1,0), A[0]=rcv(2) P2: snd( 2,1), A[0]=rcv(3) P3: snd( 3,2), A[0]=rcv(0) Prozessor 0 1 2 3 A 0 4 1 5 2 6 3 7 A 1 5 2 6 3 7 0 4 23

Virtualisierung und Kommunikation (3b) Zyklische Datenverteilung: forall i : [0.. P-1] in parallel v := (N/P); ziel := (i-1) mod P; quelle := (i+1) mod P; for j : [0.. v-1] // Se Wert an Nachbarn SEND(A[j], ziel); //empfange Nachbarwerte in temp. T T[j] := RECEIVE(quelle); //aktualisiere A for j : [0.. v] A[j] := T[j]; Beispiel: j =1 P0: snd( 4,3), A[1]=rcv(1) P1: snd( 5,0), A[1]=rcv(2) P2: snd( 6,1), A[1]=rcv(3) P3: snd( 7,2), A[1]=rcv(0) Letzte Schleife: Temp. Werte in A kopieren Prozessor 0 1 2 3 A 0 4 1 5 2 6 3 7 A 1 5 2 6 3 7 0 4 24

Virtualisierung und Kommunikation (4) Komplexität des Programms sowie Anzahl und Art der Kommunikationsoperationen hängt direkt von der Datenverteilung ab. Vgl. Beispiel mit Blöcken: Weniger Kommunikation wg. lokaler Rotation des Arrays eine gute Datenverteilung ist ein entscheides Kriterium für die Verständlichkeit des resultieren Programms. Deswegen: VORHER über die Datenverteilung nachdenken Insbesondere wichtig: Indextransformationen, Unterscheidung zw. lokalen und nichtlokalen Zugriffen, Umwandlung von synchroner Ausführung in asynchrone mit Hilfsvariablen und Synchronisation durch Kommunikation. 25

Virtualisierung und Kommunikation (5) Beispiel: Reduktions-, Präfix- und Postfixoperationen Frage: Welche Datenverteilung verursacht im unteren Beispiel weniger Kommunikation? Block oder Zyklisch? 26

Virtualisierung und Kommunikation (6) Reduktionsoperation (Summe): Idee Bilde lokale Summe Empfange Teilergebnis anderer Prozesse, addiere auf lokale Summe auf Se Teilergebnis an entspreche Prozesse Anm.: Jedes Rechteck ist selbst ein lokaler Vektor 27

Virtualisierung und Kommunikation (6) Reduktionsoperation (Summe): forall i: [0.. P-1] in parallel int summe := 0; // lokale Deklaration! //lokale Summe bilden for j : [0.. (N/P)-1] summe := summe + V[j]; int spanne := 1; while (spanne < P) DO if (i MOD (2 * Spanne) = 0) // Empfänger summe := summe + RECEIVE(i + spanne); if (i MOD (2 * Spanne) = Spanne) // Ser SEND(summe, i - spanne)); Spanne := Spanne * 2; // Synchronisation implizit durch // Kommunikation Anm.: Jedes Rechteck ist selbst ein lokaler Vektor der Größe N/P (mit Grenzen 0..(N/P)-1) 28

Virtualisierung und Kommunikation (6) Reduktionsoperation (Summe): forall i: [0.. P-1] in parallel int summe := 0; // lokale Deklaration! //lokale Summe bilden for j : [0.. (N/P)-1] summe := summe + V[j]; int spanne := 1; while (spanne < P) DO if (i MOD (2 * Spanne) = 0) // Empfänger summe := summe + RECEIVE(i + spanne); if (i MOD (2 * Spanne) = Spanne) // Ser SEND(summe, i - spanne)); Spanne := Spanne * 2; // Synchronisation implizit durch // Kommunikation Lokale Summen bereits vorhanden Anm.: Jedes Rechteck ist selbst ein lokaler Vektor s s s s r r r r 29

Virtualisierung und Kommunikation (6) Reduktionsoperation (Summe): forall i: [0.. P-1] in parallel int summe := 0; // lokale Deklaration! //lokale Summe bilden for j : [0.. (N/P)-1] summe := summe + V[j]; int spanne := 1; while (spanne < P) DO if (i MOD (2 * Spanne) = 0) // Empfänger summe := summe + RECEIVE(i + spanne); if (i MOD (2 * Spanne) = Spanne) // Ser SEND(summe, i - spanne)); Spanne := Spanne * 2; // Synchronisation implizit durch // Kommunikation Lokale Summen bereits vorhanden Anm.: Jedes Rechteck ist selbst ein lokaler Vektor r s r s 30

Virtualisierung und Kommunikation (6) Reduktionsoperation (Summe): forall i: [0.. P-1] in parallel int summe := 0; // lokale Deklaration! //lokale Summe bilden for j : [0.. (N/P)-1] summe := summe + V[j]; int spanne := 1; while (spanne < P) DO if (i MOD (2 * Spanne) = 0) // Empfänger summe := summe + RECEIVE(i + spanne); if (i MOD (2 * Spanne) = Spanne) // Ser SEND(summe, i - spanne)); Spanne := Spanne * 2; // Synchronisation implizit durch // Kommunikation Lokale Summen bereits vorhanden Anm.: Jedes Rechteck ist selbst ein lokaler Vektor r s 31

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke einzelner Prozessoren: 1 2 3 4 5 6 7 8 lokalesum 0 Idee: Bilde zunächst parallel lokale Summen der einzelnen Prozessoren lokalesum i Reduktion und Austausch blockweise, addiere Teilsummen auf sum i Schreibe korrekten Postfix-Wert in das letzte Element eines jeden lokalen Arrays Postfix-Werte für Arrays lokal berechnen 32

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall Anm: Jedes Rechteck ist selbst ein Vektor 33

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall Aufaddieren auf lokale Summen Anm: Jedes Rechteck ist selbst ein Vektor s s s s s s s r r r r r r r 34

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall Anm: Jedes Rechteck ist selbst ein Vektor s s s s s s r r r r r r 35

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall Anm: Jedes Rechteck ist selbst ein Vektor [7..0] [7..1] [7..2] [7..3] [7..4] [7..5] [7..6] [7] Lokale summe über Teil-Arrays 36

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall Berechne in jedem P letztes lokales Element Anm: Jedes Rechteck ist selbst ein Vektor [7..0] [7..1] [7..2] [7..3] [7..4] [7..5] [7..6] [7] Sum 0 =Sum i der Prozessoren 0...7 Addiere Sum 0 auf letztes Element, aber ziehe korrigier lokalesum ab 37

Virtualisierung und Kommunikation (7) Postfixoperation (Summe) über Zahlenblöcke der einzelnen Prozessoren: forall i: [0.. P-1] in parallel spanne := 1; sum := 0; lokalesum :=0; for j : [0.. (N/P)-1] lokalesum := lokalesum + V[j]; sum := lokalesum; while (spanne < N) DO if (i >= spanne) // Ser SEND(sum, i - spanne); if (i + spanne < P) // Empfänger sum := sum + RECEIVE(i + spanne); spanne := spanne * 2; //while V[(N/P)-1] := V[(N/P)-1] + sum - lokalesum; SUM for j : [(N/P)-2.. 0] Step -1 V[j] := V[j] + V[j+1]; //for //forall lokalesum V[(N/P)-1] Berechne in jedem P letztes lokales Element Anm: Jedes Rechteck ist selbst ein Vektor [7..0] [7..1] [7..2] [7..3] [7..4] [7..5] [7..6] [7] Sum 0 =Sum i der Prozessoren 0...7 Addiere Sum 0 auf letztes Element, aber ziehe korrigier lokalesum ab 38

Mehrdimensionale Kommunikation (1) Bei mehrdimensionalen Feldern verkompliziert sich die Kommunikationsberechnung, da zusätzlich eine Abbildung der 2D-Datentopologie auf die eindimensionale Nummerierung der Prozessoren stattfinden muss. Vereinfachung: Verwe virtuelle Topologien in MPI. Dann ist Kommunikation rechts, links, unten, oben möglich. 39

Mehrdimensionale Kommunikation (2) Datenverteilung ist im mehrdimensionalen Fall extrem wichtig, da sich in der Regel sogenannte Oberflächeneffekte ausnutzen lassen. Beispiel: 2D Block Verteilung (Kantenlänge k) k 2 Berechnungen, aber bei geeigneter Datenverteilung lediglich 4*k Kommunikationen 40

Beispiel Jacobi-Iteration (1) In einem N*N Feld wird folge Iteration gerechnet, bis die Änderungen kleiner als eine vorgegebene Schranke sind: forall i: [1.. N-2] in sync forall j: [1.. N-2] in sync A[i, j] += theta/4 * (A[i, j+1] + A[i, j-1] + A[i-1, j] + A[i+1, j]); i,j-1 i-1,j i,j i+1,j i,j+1 (Feldindizes jeweils 0..N-1; N² Prozessoren) 41

Beispiel Jacobi-Iteration (2) Idee: Feld in Blöcke aufteilen, mit Rändern für die Nachbarschaft (Überlappungsbereich). Rechenbereich Überlappung 42

Beispiel Jacobi-Iteration (3) Damit besteht eine Iteration aus: 1. Ränder austauschen 2. Iteration auf dem lokalen Block 3. größte Änderung pro Block bestimmen 4. Maximum-Reduktion, um Konvergenz zu bestimmen (oder Vergleich mit Schranke mit folger Oder-Reduktion des booleschen Ergebnisses). Optimierung: nicht Einzelelemente sen, sondern jeden Rand als Block. Kommunikationen:4k pro k x k Block. Rechenoperationen: k 2 pro Block. 43