Massivparallele Modelle und Architekturen Wintersemester 13/14 Lösungsvorschlag 1. Übung 1. Aufgabe: Leistungsbewertung paralleler Systeme Betrachtet werden soll der Odd-Even-Sort-Algorithmus mit n Eingangswerten ohne Vergleich des ersten und letzten Elements im odd-schritt. Für die Bestimmung des Parallelitätsgrades q(t) seien hier die Vergleicher (Operationen) maßgeblich. Nehmen Sie weiterhin an, Sie haben beliebig viele Ressourcen (Vergleicher) zur Verfügung und es fallen keine zusätzlichen Operationen für Kommunikation, Synchronisation oder Organisation an. a) Zeichnen Sie ein Parallelitätsprofil für n=8. b) Bestimmen Sie allgemein für gerade n die folgenden Größen: den Parallelitätsindex I das Maß für die geleistete Arbeit Work(p) das Maß für die Kosten Cost(p) die Auslastung U(p) den maximalen Speedup S max gegenüber einer sequentiellen Ausführung mit einem einzigen Vergleicher. c) Sei wieder n=8. Wie hoch wäre der Speedup, wenn genau zwei Vergleicher zur Verfügung stünden? Bestimmen Sie U(2). mit (p max = p) a) p Fachgebiet Rechnerarchitektur Prof. R. Hoffmann b) In jedem even-schritt werden n/2 Vergleiche benötigt, in jedem odd-schritt (n/2)-1. Da es gleich viele even-schritte wie odd-schritte gibt, beträgt der Parallelitätsindex I = (n/2 + n/2-1)/2 = (n-1)/2. Alternativ kann man auch zunächst T und Work bestimmen: es werden n/2 even-schritte, sowie n/2 odd- Schritte benötigt. Daher folgt T = n/2 + n/2 = n. 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 Die Herleitung von Work erfolgt wie oben die Herleitung von I: Anzahl der benötigten Vergleiche für even und für odd mal der Anzahl der Schritte, d. h. Work = ((n/2)-1 + (n/2)) * n/2 = n(n-1)/2. 1 2 3 4 5 6 7 8 9 T
2 I ergibt sich nun auch aus I = Work/T. Die maximale Anzahl der benötigten Ressourcen p max ergibt sich aus der Anzahl der im even-schritt benötigten Vergleicher: p max = n/2. Die Kosten betragen Cost = T * p max = n* n/2 = n 2 /2. Die Auslastung U(p max ) ist der Quotient I/p max = 2(n-1)/2n = (n-1)/n. Für große n ist die Auslastung nahezu optimal. Der maximale relative Speedup (unter Verwendung des gleichen Algorithmus) ergibt sich aus dem Vergleich von T bei beliebig vielen Ressourcen und T 1 bei nur einem einzigen Vergleicher. T 1 entspricht der Gesamtzahl aller Vergleiche, also T 1 = Work(p max ). Daraus folgt S max = T 1 / T = (n(n-1)/2) / n = (n-1)/2. c) Für n=8 gilt: Stehen nur zwei Vergleicher zur Verfügung, kann nach dem folgenden Schema sortiert werden (Beachte, dass zusätzliche Operationen für Kommunikation etc. hier vernachlässigt werden). 1... 14 Es werden in jedem Takten beide Vergleicher benutzt. Nach sieben Takten sind dann je zwei even- und zwei odd-phasen komplett durchlaufen (In der Zeichnung bedeuten rote Pfeile auf schattiertem Hintergrund einen Vergleich/Tausch im odd-schritt, schwarze Pfeile auf hellem Hintergrund einen Vergleich/Tausch im even-schritt). Insgesamt werden 14 = 2*7 Takte benötigt.. Es ergibt sich für den Speedup S = 28/14 = 2. (28 ist die Anzahl der Operationen) U(2) = 100%, da immer beide Vergleicher benutzt werden können. p 2 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Zum Vergleich: bei beliebig vielen Ressourcen (4 Vergleicher werden benötigt) wären es S max = 3,5. T 2. Aufgabe: Amdahl s Gesetz Das folgende Schema illustriert den sequentiellen Ablauf eines Programms. Jedes Kästchen symbolisiert dabei einen unteilbaren Task. Vereinfacht wird angenommen, dass ein Task auf einem Prozessor genau eine Zeiteinheit benötigt. Die dunklen Kästchen stellen nicht parallelisierbare Tasks dar. Die hellen können parallelisiert werden. a) Wie groß ist der parallelisierbare Anteil g?
3 b) Was ist nach Amdahl s Gesetz der maximale Speedup für p=, p=5, p=4, p=3 und p=2? Kann dieser Speedup tatsächlich erreicht werden? a) g = 15/20 = 75%. b) p = : S max = 1/f = 20/5 = 4 p = 5: S max = 1/(0,25+0,75/5) = 2,5 p = 4: S max = 1/(0,25+0,75/4) 2,29 p = 3: S max = 1/(0,25+0,75/3) = 2 p = 2: S max = 1/(0,25+0,75/2) = 1,6 Dieser Speedup kann in der Praxis nicht immer erreicht werden, da die parallelisierbaren Teile nicht beliebig teilbar, und somit nicht immer optimal auf die p Prozessoren verteilt werden können. Amdahl s Gesetz stellt lediglich eine obere Schranke dar. Im Spezialfall für p = wird angenommen, dass der parallelisierbare Anteil auf 0 reduziert wird (unendlich viele Prozessoren erledigen die in unendlich kleine Teile zerlegten Tasks in unendlich kleiner Zeit). (Bei dem vorgegebenen Zeitraster sind nur max. 5 Prozessoren sinnvoll und S max ist dann nur 20/9!!). 3. Aufgabe: Additionsalgorithmus im PRAM Modell Gegeben Sei ein EREW-PRAM Algorithmus zur Addition von n Zahlen. Zunächst werden die n Zahlen gleichmäßig auf p Prozessoren verteilt, wo in einer lokalen Phase sequentiell die jeweilige Teilsumme gebildet wird. Danach wird per Reduktionsbaum in einer globalen Phase die Gesamtsumme gebildet. a) Erstellen Sie eine Tabelle für n = 256 und p = 1, 2, 4, 8, 16, 32, 64, 128, 256, mit den Werten für Work, Cost, Anzahl der Schritte T, Speedup und Effizienz. b) Geben Sie je eine allgemeine Formel für Cost und für T in Abhängigkeit von n und p an. Annahme: p = 2 i mit i N und n mod p = 0 (p ist eine Zweierpotenz und n lässt sich auf p ohne Rest aufteilen). c) Nehmen Sie nun an, p = n/log(n). Geben Sie die Laufzeitkomplexität des Algorithmus an. a) und b) p allgemein 1 2 4 8 16 32 64 128 256 log(p) 0 1 2 3 4 5 6 7 8 Work n-1 255 255 255 255 255 255 255 255 255 T n/p -1+log(p) 255 128 65 34 19 12 9 8 8 Cost=T*p n-p +p*log(p) 255 256 260 272 304 384 576 1024 2048 Speedup T seq /T 1 2,0 3,9 7,5 13,4 21,3 28,3 31,9 31,9 Effizienz Speedup/p 1 1,00 0,98 0,94 0,84 0,66 0,44 0,25 0,13 Utilization Work/Cost 1 1,00 0,98 0,94 0,84 0,66 0,44 0,25 0,13 Anmerkungen: Der Fall p=32=n/log n ist der "Accelerated Cascading" Fall (siehe c). Hierbei ist Cost = O(T seq ), also ist der Algorithmus dann cost-optimal.
4 c) Die Laufzeit des Algorithmus ist gegeben durch T = n/p 1 + log(p). p wird ersetzt durch p=n/log(n) T = n/(n/log(n)) - 1 + log(n/log(n)) = log(n) - 1 + log(n) - log(log(n)) = 2log(n) - 1 - log(log(n)) Für große n nähert sich die Laufzeit 2log(n) an. Damit liegt die Laufzeitkomplexität des Algorithmus in O(log(n)). Cost = (n/log n) T = O(2n) 4. Aufgabe: Data Broadcasting im PRAM Modell Der folgende Code beschreibt einen Algorithmus für Data Broadcasting, d. h. der Wert einer Zelle (eines Prozessors) wird an alle anderen Prozessoren gesendet. Wenn n eine Zweierpotenz ist, werden n/2 Prozessoren (zum Senden bzw. Empfangen) benötigt. for t = 0 to log 2 n 1 do parallel [i = 0.. 2 t -1] // dyn. active B[i+ 2 t ] B[i] // proc(i) writes endfor Erweitern Sie den Code so, dass er auch für n funktioniert, das keine Zweierpotenz darstellt. Es muss lediglich eine Bedingung eingefügt werden, die verhindert, dass im letzten Schritt versucht wird, an Adressen zu schreiben, die außerhalb des Gültigkeitsbereiches liegen: for t = 0 to log 2 n 1 do parallel [i = 0.. 2 t -1] // active if (i + 2 t < n) B[i + 2 t ] B[i] // proc(i) writes endfor 5. Aufgabe: Maximum mit CRCW-PRAM Es soll ein CRCW-PRAM Algorithmus entwickelt werden, der mit n 2 Prozessoren, die auf einen gemeinsamen Speicher mit der Common-Regel schreiben, das Maximum von n Zahlen in linearer Zeit O(1) ermittelt. Die einzelnen Prozessoren seien in einer n n-matrix angeordnet und können wie folgt programmiert werden: parallel [i = 0... n-1][j = 0... n-1] do something Input ist der Array A vom Typ Zahl (z.b. int oder float) der Länge n, Output ist die Zahl max. Es steht zusätzlich ein Hilfsarray temp vom Typ boolean der Länge n zur Verfügung.
5 a) Ergänzen Sie den folgenden Programmcode. Input: A[0... n-1] Output: max parallel [i = 0... n-1][j = 0] temp[i] true b) Bestimmen Sie zunächst die Werte für Work, Cost, Speedup und Effizienz und ordnen Sie sie dann Komplexitätsklassen zu. c) Würde Ihr Algorithmus auch mit der Arbitrary- oder Priority-Regel funktionieren? a) Die Idee ist, dass in der Prozessor-Matrix gleichzeitig jeder Wert aus A mit jedem anderen verglichen werden kann. Prozessor [i][j] vergleicht A[i] mit A[j]. Immer wenn das Element A[i] kleiner ist als A[j], wird das entsprechende Flag temp[i] im Hilfsarray auf false gesetzt. Das bewirkt, dass nach allen Vergleichen, nur ein einziger Wert in diesem Array noch true ist, nämlich der, der keinen einzigen Größenvergleich verloren hat (war immer der größte). Im letzten Schritt muss nur noch das so erhaltene Maximum ausgegeben werden. Input: A[0... n-1] Output: max parallel [i = 0... n-1][j = 0] temp[i] true parallel [i = 0... n-1] [j = 0... n-1] if (A[i] < A[j]) temp[i] false parallel [i = 0... n-1][j = 0] if (temp[i]) max A[i] // wenn Ai = MAX dann wird niemals auf false gesetzt Insgesamt werden konstant (unabhängig von n) T=3 Zeitschritte benötigt. Deshalb liegt die Laufzeitkomplexität in O(1). b) Die Kosten ergeben sich aus der Anzahl der Prozessoren die in irgendeinem Schritt maximal benötigt werden (n 2 im zweiten Parallelschritt) und der Laufzeit T: Cost = T * p = 3 * n 2. Die Kostenkomplexität ist also in O(n 2 ). Die Arbeit ergibt sich aus den tatsächlich genutzten Ressourcen: n Prozessoren im ersten Schritt. n 2 Prozessoren im zweiten Schritt und n Prozessoren im dritten Schritt. Work = 2n + n 2. Die Komplexitätsklasse ist O(n 2 ). Anmerkung: Dieser Algorithmus ist nicht cost-optimal, denn die Anzahl der Schritte des (besten) sequentiellen Algorithmus beträgt T seq = n-1 bzw. dessen Laufzeitkomplexität O(n). Der schnellste sequentielle Algorithmus bräuchte T seq = n-1 Schritte. Der Speedup ergibt sich nun aus dem Quotienten von T seq und T:
6 Speedup = (n-1) / 3. Komplexitätsklasse O(n). Die Effizienz ist der Quotient aus Speedup und der Anzahl der Prozessoren: Effizienz = (n - 1) / (3 * n 2 ). Das liegt in der Komplexitätsklasse O(1/n). Ein weiterer Wert ist die Utilization. Sie ist der Quotient aus Work und Cost: Utilization = (2n + n 2 ) / (3 * n 2 ) = 2 / 3n + 1. Dies führt zur Komplexitätsklasse O(1/n). c) Ja. Auch mit den Konfliktregeln Arbitrary und Priority würde der Algorithmus funktionieren. Grund: Wenn alle den gleichen Wert (False) schreiben wollen, dann genügt es, wenn einer erfolgreich ist.