Parallele Algorithmen I Basistechniken Prof. Dr. Walter F. Tichy Dr. Victor Pankratius David Meder Ali Jannesari Todo: Animationen überprüfen Replizierte Objekte
Parallel Random Access Machine (PRAM) Abstraktes Maschinenmodell, in dem sich parallele Algorithmen sehr gut spezifizieren lassen. Entspricht einer synchronen MIMD-Maschine mit gemeinsamem Adressraum. Speicherzugriffsvarianten EREW: Exclusive Read, Exclusive Write ERCW: Exclusive Read, Concurrent Write CREW: Concurrent Read, Exclusive Write CRCW: Concurrent Read, Concurrent Write Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 2
Probleme des PRAM-Modells Es gibt keine echte, synchrone MIMD-Maschine mit gemeinsamem Adressraum. Alle Speicherzugriffsvarianten außer EREW sind unrealistisch. Die implizite Annahme, dass Kommunikations-operationen eine Zeiteinheit dauern, ist ebenfalls unrealistisch. ABER: Ist man sich der Unzulänglichkeiten bewusst, dann ist die PRAM ein sehr elegantes Modell zur Spezifikation paralleler Algorithmen. Diese können einfach für Cluster konvertiert werden. Beliebig viele Prozessoren, Speicher Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 3
PRAM Sprachkonstrukte (1) Imperative Programmiersprache mit Erweiterungen, um Parallelität zu spezifizieren. Asynchrones FORALL: FORALL i : P IN PARALLEL Anweisung1(i) … Anweisungn(i) END P ist eine Menge; für jedes Element in P wird ein Prozessor eingesetzt, wobei jeder Prozessor ein unterschiedliches Element i der Menge P bekommt. Jeder Prozessor führt die Anweisungsfolge 1 .. n asynchron aus. Die FORALL-Anweisung endet, wenn jeder Prozessor die Anweisungs-reihenfolge abgearbeitet hat. Zwischendurch erfolgt keine Synchronisation. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 4
PRAM Sprachkonstrukte (2) synchrone Form des FORALL: FORALL i : P IN SYNC Anweisung1(i) … Anweisungn(i) END Wie vorher, nur dass jetzt alle Prozessoren die Anweisungsfolge synchron („im Gleichschritt“) ausführen. Die synchrone Ausführung gleicher Anweisungen vermeidet viele Laufzeitprobleme, da unterschiedliche Ausführungs-geschwindigkeiten der Prozessoren nicht beachtet werden müssen. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 5
Synchrone Zuweisung Synchrone Abarbeitung der Zuweisung: L := R Alle n Prozessoren werten L synchron aus und erhalten eine Adresse. Alle n Prozessoren werten R synchron aus und erhalten einen Wert. Alle n Prozessoren speichern ihren Wert an ihrer Adresse (EW oder CW). (1) & (2) können im Prinzip auch gleichzeitig ausgeführt werden. Seiteneffekte sind möglich, aber die Reihenfolge der Auswertungen ist undefiniert. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 6
Synchrones IF-THEN-ELSE (1) Synchrone Abarbeitung der bedingten Anweisung: IF B THEN S1 ELSE S2 Alle n Prozessoren werten B synchron aus. Die Menge der Prozessoren partitioniert sich in die Mengen MT (für B=T) und MF (für B=F) in Abhängigkeit des Ergebnisses von B. Die Menge MT führt S1 synchron aus. Die Menge MF führt S2 synchron aus. Die Untermengen MT und MF können (müssen aber nicht) parallel abgearbeitet werden. Keine Aussage über die „relativen Geschwindigkeiten“ zueinander. Ausführung endet, wenn die Mengen MT und MF beide fertig sind. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 7
Synchrones IF-THEN-ELSE (2) Answer = 21 * (processorId % 3); IF (Answer == 42) THEN print(„Woohoo!“); ELSE print(„Doh!“); ENDIF Alle Prozessoren Answer = 21 * (processorId % 3); IF (Answer == 42) Alle Prozessoren werten die Bedingung synchron aus. Prozessoren MT mit Answer == 42 Prozessoren MF mit Answer != 42 THEN print(„Woohoo!“); ELSE print(„Doh!“); Alle Prozessoren ENDIF Ende, sobald beide Prozessorgruppen MT und MF fertig sind. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 8
Synchrones IF-THEN-ELSE (3) Answer = 21 * (processorId % 3); IF (Answer == 42) THEN print(„Woohoo!“); ELSE print(„Doh!“); ENDIF Alle Prozessoren Answer = 21 * (processorId % 3); IF (Answer == 42) Alle Prozessoren werten die Bedingung synchron aus. Prozessoren MT mit Answer == 42 Prozessoren MF mit Answer != 42 THEN print(„Woohoo!“); ELSE print(„Doh!“); Alle Prozessoren ENDIF Ende, sobald beide Prozessorgruppen MT und MF fertig sind. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 9
FORALL (1) Addition eines n-elementigen Vektors FORALL i : [0 .. n-1] IN SYNC C[i] := A[i] + B[i]; END Bsp.: für n = 8 FORALL i : [0 .. n-1] IN PARALLEL wäre ebenfalls möglich, da die Anweisungen voneinander unabhängig sind. 1 2 3 4 5 6 7 8 10 12 14 A B C + = Prozessor Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 10
FORALL (2) FORALL i : [0 .. n-1] IN SYNC ; END C[i] := A[i] + B[i] Alle n Prozessoren Werten C[i] synchron aus und erhalten eine Adresse. Alle n Prozessoren Werten A[i] + B[i] synchron aus und erhalten einen Wert. Alle n Prozessoren speichern ihren Wert an der in (1) ermittelten Adresse. Haben alle n Prozessoren die FORALL-Schleife abgearbeitet, wird gemeinsam mit der Bearbeitung der danach folgenden Codezeilen fortgefahren. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 11
FORALL (3) Rotieren eines n-elementigen Vektors FORALL i : [0 .. n-1] IN SYNC A[i] := A[(i+1)mod n]; END Bsp.: für n = 8 FORALL i : [0 .. n-1] IN PARALLEL wäre nicht möglich, da dann unter Umständen falsche Werte weitergegeben werden. 1 2 3 4 5 6 7 A Prozessor Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 12
FORALL (4) Beispiel für fehlerhafte Ausführung mit IN PARALLEL Prozessor 1 2 3 4 5 6 7 A 1 2 3 4 5 6 7 A 1 2 3 4 6 6 7 Prozessoren 0 bis 3, sowie 5 bis 7 führen Anweisung gleichzeitig aus. Prozessor 4 liest Wert aus A[5] erst, nachdem dieser von Prozessor 5 geschrieben wurde ( asynchrone Ausführung!). Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 13
Reduktion (1) Eine Reduktion, d.h. das Zusammenfassen mehrerer Datenelemente zu einem Ergebnis, gehört zu den Basistechniken der parallelen Algorithmen. (MPI_Reduce, MPI_Allreduce) Bsp: Die parallele Summenbildung Summenberechnung sequentiell: O(N) Frage: Wie geht's parallel schneller? 1 2 3 4 5 6 7 A Prozessor Sum 28 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 14
Reduktion (2) Baumartiges Reduktionsverfahren: Fasse jeweils zwei (im Abstand 2k, 0 ≤ k < log2(N)) benachbarte Elemente zusammen: 1 2 3 4 5 6 7 Sum(0,1) Sum(2,3) Sum(4,5) Sum(6,7) Sum(0,3) Sum(4,7) Sum(0,7) Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 15
Reduktion (3) PRAM Programm einer parallelen Summe CONST N = ... V : ARRAY [0 .. N-1] OF INTEGER Spanne : INTEGER Spanne := 1; WHILE (Spanne < N) DO FORALL i : [0 .. N-1] IN SYNC IF (i MOD (2*Spanne)) = 0 AND Spanne+i < N V[i] := V[i] + V[i + Spanne]; END Spanne := Spanne * 2; parallele Laufzeit: O(log2(N)), Modell: CREW Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 16
Reduktion (4) N = 4 Schritt 1 Spanne = 1 < 4, 2 * Spanne = 2 N = 4 CONST N = 4 V : ARRAY [0 .. N-1] OF INTEGER Spanne : INTEGER Spanne := 1; WHILE (Spanne < N) DO FORALL i : [0 .. N-1] IN SYNC IF (i MOD (2*Spanne)) = 0 AND Spanne+i < N V[i] := V[i] + V[i + Spanne]; END Spanne := Spanne * 2; Reduktion (4) N = 4 Schritt 1 Spanne = 1 < 4, 2 * Spanne = 2 N = 4 Schritt 2 Spanne = 2 < 4, 2 * Spanne = 4 1 2 3 Valt i mod 4 Spanne + i 4 5 Vneu 1 2 3 Valt i mod 2 Spanne + i 4 Vneu Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 17
CONST N = 4 V : ARRAY [0 .. N-1] OF INTEGER Spanne : INTEGER Spanne := 1; WHILE (Spanne < N) DO FORALL i : [0 .. N-1] IN SYNC IF (i MOD (2*Spanne)) = 0 AND Spanne+i < N V[i] := V[i] + V[i + Spanne]; END Spanne := Spanne * 2; Reduktion (5) Frage: Funktioniert das Verfahren auch, wenn N keine Potenz von 2 ist? Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 18
Reduktion (6) N = 6 Schritt 1 Spanne = 1 < 6, 2 * Spanne = 2 N = 6 CONST N = 4 V : ARRAY [0 .. N-1] OF INTEGER Spanne : INTEGER Spanne := 1; WHILE (Spanne < N) DO FORALL i : [0 .. N-1] IN SYNC IF (i MOD (2*Spanne)) = 0 AND Spanne+i < N V[i] := V[i] + V[i + Spanne]; END Spanne := Spanne * 2; Reduktion (6) N = 6 Schritt 1 Spanne = 1 < 6, 2 * Spanne = 2 N = 6 Schritt 2 Spanne = 2 < 6, 2 * Spanne = 4 1 2 3 Valt i mod 4 Spanne + i Vneu 4 5 6 7 1 2 3 Valt i mod 2 Spanne + i Vneu 4 5 6 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 19
Reduktion (7) Funktioniert auch, wenn N keine Potenz von 2 ist. CONST N = 4 V : ARRAY [0 .. N-1] OF INTEGER Spanne : INTEGER Spanne := 1; WHILE (Spanne < N) DO FORALL i : [0 .. N-1] IN SYNC IF (i MOD (2*Spanne)) = 0 AND Spanne+i < N V[i] := V[i] + V[i + Spanne]; END Spanne := Spanne * 2; Reduktion (7) N = 6 Schritt 3 Spanne = 4 < 6, 2 * Spanne = 8 Funktioniert auch, wenn N keine Potenz von 2 ist. Übriges Element (im Beispiel Element 4) wird dann in einem separaten Schritt verrechnet. 1 2 3 Valt i mod 8 Spanne + i Vneu 4 5 6 7 8 9 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 20
Präfix & Postfix (1) Berechnung aller Partialsummen (MPI_Scan): 3 4 2 3 4 2 5 6 7 1 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 21
Präfix & Postfix (2) Präfixoperation(j) berücksichtigt alle Elemente i mit 0 ≤ i ≤ j. Postfixoperation(j) berücksichtigt alle Elemente i mit N-1 ≥ i ≥ j. Beispiel: Prä- und Postfixsummen. 1 A 2 3 4 5 6 7 Präfix 8 Postfix Prozessor Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 22
Präfix & Postfix (3) Berechnung der Präfixsumme: A 1 2 4 8 16 32 48 96 B 1 2 4 8 16 32 48 96 log2(8) = 3 Schritte zur Berechnung der Präfixsummen. +B[i-1] 1 3 6 12 24 48 80 144 +B[i-2] 1 3 7 15 30 60 104 192 +B[i-4] 1 3 7 15 31 63 111 207 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 23
Broadcast (1) Verteilen von Elementen (nützlich z.B. für MPI_Bcast): ? Prozessor 1 2 3 4 5 6 7 a ? ? ? ? ? ? ? ? a a a a a a a a Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 24
Broadcast (2) Verteilen von Elementen (nützlich z.B. für MPI_Bcast): Sei Verknüpfungsoperator mit Eigenschaft a x = a Speichere a in T[0] Wende dann Präfixoperation an Prozessor 1 2 3 4 5 6 7 a ? ? ? ? ? ? ? a a ? ? ? ? ? ? a a a a ? ? ? ? a a a a a a a a Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 25
Broadcast (3) PRAM Programm zur Datenverteilung CONST N = ... V : ARRAY [0 .. N-1] OF INTEGER Spanne : ARRAY [0 .. N-1] INTEGER V[0] := a; FORALL i : [0 .. N-1] IN SYNC Spanne[i] := 1; WHILE (Spanne[i] < N) DO IF i >= Spanne[i] V[i] := V[i - Spanne[i]]; END Spanne[i] := Spanne[i] * 2; parallele Laufzeit: O(log2(N)), Modell: EREW. Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 26
Broadcast (4) N = 4 Schritt 1 N = 4 Schritt 2 1 2 3 1 2 3 a a a a a a CONST N = ... V : ARRAY [0 .. N-1] OF INTEGER Spanne : ARRAY [0 .. N-1] INTEGER V[0] := a; FORALL i : [0 .. N-1] IN SYNC Spanne[i] := 1; WHILE (Spanne[i] < N) DO IF i >= Spanne[i] V[i] := V[i - Spanne[i]]; END Spanne[i] := Spanne[i] * 2; Broadcast (4) N = 4 Schritt 1 N = 4 Schritt 2 1 2 3 1 2 3 Valt a Valt a a Spanne[i] 1 1 1 1 Spanne[i] 2 2 2 2 i>=Spanne[i] 1 1 1 i>=Spanne[i] 1 1 Vneu Vneu a a a a a a Spanne[i]neu 2 2 2 2 Spanne[i]neu 4 4 4 4 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 27
Anwendungen (1) Abzählen von Elementen mit einer bestimmten Eigenschaft: FORALL i:[0 .. N-1] IN PARALLEL T[i] := test_condition(i); END Präfix(T,+); Ergebnis in T Präfix T 1 2 3 4 5 6 7 Prozessor Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 28
Anwendungen (2) Kompaktifizierung einer Liste Laufzeit: O(log(N)) a b 0 1 2 3 4 5 6 7 Kompaktifizierung einer Liste Laufzeit: O(log(N)) a b c d a b c d 1 2 3 L if isChar(L[i]) then T[i] := 1; else T[i] := 0; T: Präfix(T,+) if (T[i] == 1) then L'[T' [i]-1] := L[i] L' 4 T‘: Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 29
Anwendungen (3) Rekurrenzen – Zur Erinnerung Beispiel: Finde geschlossene Form für lineare Rekurrenz g(n) = g(n-1) + 2n -1 g(0) = 0 Lösung: f(n)=n² Möglicher Lösungsansatz: „Ausrollen“ g(n) = g(n-1) + 2n - 1 = [g(n-2) + 2(n-1) - 1] + 2n - 1 weil g(n-1) = g(n-2) + 2(n-1) -1 = g(n-2) + 2(n-1) + 2n - 2 = [g(n-3) + 2(n-2) -1] + 2(n-1) + 2n - 2 weil g(n-2) = g(n-3) + 2(n-2) -1 = g(n-3) + 2(n-2) + 2(n-1) + 2n - 3 ... = g(n-i) + 2(n-i+1) +...+ 2n - i = g(n-n) + 2(n-n+1) +...+ 2n - n = 0 + 2 + 4 +...+ 2n – n weil g(0) = 0 = 2 + 4 +...+ 2n - n = 2*n*(n+1)/2 - n weil 1+...+n = n(n+1)/2 = n^2
Anwendungen (3) Rekurrenzen Lösen von Rekurrenzen (1. Ordnung): Xi = Xi-1 ○ ai, mit ○ binärer Operator. Beispiel: Präfixsumme als Rekurrenz: Sumi = Sumi-1 + ai mit Sum0 = a0 Lösen von Rekurrenzen höherer Ordnung auch möglich: Xi = ai-1 ○ Xi-1 ○ … ○ ai-m ○ Xi-m ○ bi Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 31
Anwendungen (4) Parallele Polynomauswertung: f(x) = a0 + a1x + a2x2+ a3x3+ a4x4+ a5x5+ a6x6+ a7x7 Laufzeit: O(3*log(N)) = O(log(N)) X 1 2 3 4 5 6 7 Prozessor x Broadcast X Präfix(X,*) x2 x3 x4 x5 x6 x7 A T = A * X L_Reduce(T,+) f(x) Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 32
Aufgabe (1) Gegeben sei ein N-elementiger Zahlenvektor v[0…n-1]. Schreiben Sie ein paralleles Programm, welches D = max{ v[i] − v[j] }, 0 ≤ i , j < n berechnet. Was ist die asymptotische Laufzeit? Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 33
Aufgabe (2) Schreiben Sie ein paralleles Programm, welches zwei Zeichenreihen der Länge N lexikographisch vergleicht. Was ist die asymptotische Laufzeit? Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 34 34
Aufgabe (3) Gegeben sei ein N-elementiger Zahlenvektor v[0… n-1]. Schreiben Sie ein paralleles Programm, welches den Wert des maximalen Untervektors bestimmt: U=max{ ∑ v[i] ; 0 ≤ p < q < n} Was ist die asymptotische Laufzeit? q i=p Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 35 35
Aufgabe (4) Schreiben Sie ein paralleles Programm, welches die ersten N Fibonacci-Zahlen berechnet. fi = fi-1 + fi-2, f0 = f1 = 1 Prof. W. F. Tichy, Dr. V. Pankratius, D. Meder, A. Jannesari 36 36