Grundlagen der Programmierung 2 Parallele Verarbeitung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 27. Mai 2009 Parallele Algorithmen und Ressourcenbedarf Themen: Nebenläufigkeit, Parallelität, Ressourcenverbrauch Parallelisierung von Algorithmen Amdahl-Gesetz Gustafson-Barsis Gesetz Beispielalgorithmen in Haskell Grundlagen der Programmierung 2 - 1 - Nebenläufigkeit und Parallelität Prozesse und Kommunikation Prozess: eigenständig ablaufende Rechnung mit eigenem Speicher wie Rechner; kann interne Berechnungen und Ein-Ausgabe durchführen P,Q nebenläufig wenn diese unabhängig voneinander ausgeführt (concurrent) werden können. P,Q parallel, Grundlagen der Programmierung 2 wenn sie nebenläufig sind und gleichzeitig ablaufen. - 2 - Klassifikation der parallelen Rechnerarchitekturen nach Flynn Bezüglich paralleler Instruktionssequenzen und Parallelität der Verarbeitung von Daten: • • • • SISD: Single instruction, single data stream (SISD): Sequentieller Rechner ohne Parallelität. MISD:Multiple instruction, single data stream: kommt so gut wie nicht vor: Man könnte redundante (Doppel-) Verarbeitung hier einordnen. SIMD: Single instruction, multiple data streams: Gleiche Verarbeitung. viele gleichartige Daten: z.B. Vektorprozessor. MIMD:Multiple instruction, multiple data streams: Mehrere Prozessoren lassen verschiedene Programme auf verschiedenen Daten ablaufen: Verteilte Systeme. Grundlagen der Programmierung 2 - 3 - Parallele und verteilte Berechnungen • PRAM: parallel random access machine • Verteilte Berechnung, lose Kopplung • massiv parallel, enge Kopplung • Grid-Computing • Cloud-Computing • Vektorrechner, Feldrechner • Pipelining • Multi-Core-Prozessoren Grundlagen der Programmierung 2 - 4 - PRAM: parallel random access machine • Mehrere Prozesse (Prozessoren), gemeinsamer Hauptspeicher, • unabhängiges Lesen und Schreiben Grundlagen der Programmierung 2 - 5 - Verteilte Berechnungen, lose Kopplung • • • • Mehrere unabhängige Rechner kommunizieren über ein Netzwerk arbeiten gemeinsam an einer Berechnung Programme / Programmteile können völlig verschieden sein. Weitere Unterscheidung: Gleichberechtigte Rechner; oder hierarchisch (Master/ Slave) bzw. (Client / Server). • Z.B. PVM: Parallel Virtual Machine Grundlagen der Programmierung 2 - 6 - massiv parallel, enge Kopplung • • • • • Viele unabhängige, gleiche Prozessoren Kopplung über ein schnelles Netzwerk arbeiten gemeinsam an einer Berechnung. I.a: Gleiches Programm, verschiedene Daten. Oft feste Topologie: Hyperwürfel, ähnliche Netzwerke, Z.B. Hardware für künstliche neuronale Netze. Grundlagen der Programmierung 2 - 7 - Grid-Computing • Viele Workstations/ PCs rechnen gemeinsam an einer Aufgabe • verschiedene Hardware / Betriebssystem ist möglich • I.a. : Rechner haben das gleiche Programm, aber verschiedene Daten Grundlagen der Programmierung 2 - 8 - Vektorrechner • Ein Programm steuert parallele Berechnungen auf HW-Arrays: • Gleiche Prozedur, verschiedene Datenelemente • Sinnvoller Einsatz: Wettersimulationen, numerische Berechnungen • SIMD (single instruction, multiple data) Grundlagen der Programmierung 2 - 9 - Pipelining • • • • I.a. parallele Ausführung von Maschinenkode auf der Hardware eines Prozessor Befehlsbearbeitung wird in kleinere Einheiten zerlegt, die dann nacheinander, versetzt abgearbeitet werden. Weitere Beschleunigung durch Mehrfachauslegung von internen Einheiten Grundlagen der Programmierung 2 - 10 - Maße für den parallelen Ressourcenverbrauch Modell auf der Programmiersprachenebene: Auswertung durch einzelne Reduktionsschritte (z.B. Haskell) • sequentieller Einzelschritt • paralleler Einzelschritt = Grundlagen der Programmierung 2 mehrere unabhängige, gleichzeitige Einzelschritte - 11 - Maße für den parallelen Ressourcenverbrauch Basis ist das PRAM-Modell: • mehrere, nicht unterscheidbare Prozessoren • gemeinsamer Hauptspeicher • Befehlsabarbeitung ist synchron getaktet. • pro Einzelschritt einer parallelen Auswertung • ist ein Prozessor notwendig #parallele Reduktionsschritte = #paralleler Schritte bis zum Ergebnis #notwendige Prozessoren = maximale Anzahl gleichzeitiger sequentieller Einzelschritte in einem parallelen Schritt Grundlagen der Programmierung 2 - 12 - Beispiel: Parallele Auswertung Skalarproduktberechnung: (a1, . . . , an) ∗ (b1, . . . , bn) = a1 ∗ b1 + . . . + an ∗ bn 1. Schritt: 2. Schritt: Werte die Produkte parallel aus Addiere die Ergebnisse Grundlagen der Programmierung 2 - 13 - Parallele Reduktion; konservativ / spekulativ • Die Parallelisierung ist konservativ, wenn nur Auswertungen durchgeführt werden, die für das Erreichen des Resultats notwendig sind. • Die Parallelisierung ist spekulativ, wenn auch Reduktionen durchgeführt werden können, von denen zum Zeitpunkt der Ausführung nicht bekannt ist, ob diese für das Berechnen des Resultats notwendig sind. Grundlagen der Programmierung 2 - 14 - Parallele Reduktion: Beispiel spekulativ: Die parallele Reduktion von s und t in if cond then s else t konservativ: Die parallele Reduktion von s und t in s * t Grundlagen der Programmierung 2 - 15 - Parallele Reduktion: Maßzahlen Algorithmus sei gegeben, sei E die Eingabe, und p die Anzahl der erlaubten Prozessoren. τ (E, p) τ (E, 1) τ (E, ∞) minimale Anzahl der parallelen Reduktionsschritte bis zum Ergebnis, wenn man p unabhängige Reduktionsschritte gleichzeitig pro Schritt machen darf ist die Anzahl der Einzel-Reduktionsschritte bei sequentieller Auswertung. entspricht dann der Anzahl der parallelen Reduktionsschritte bis zum Ergebnis, wenn es keine obere Schranke für die Anzahl gleichzeitiger Reduktionen (#Prozessoren) gibt. τ (E, 1) Optimistische Erwartung: τ (E, p) ≈ . p Grundlagen der Programmierung 2 - 16 - Parallele Reduktion: Beschleunigung Vereinfachende Annahme im folgenden: die Kennzahlen hängen nur vom Algorithmus ab; proportional zur Eingabegröße E; D.h., für alle p: τ (E, p) = |E| ∗ τ (p); meist kann |E| gekürzt werden. (relative) parallele Beschleunigung := τ (1) τ (p) Die parallele Beschleunigung ist eine Zahl zwischen 1 und p ≥ 1, ≤ p, da man sequentiell reduzieren kann, da maximal p Prozessoren und man eine parallele Reduktion zu einem Ergebnis sequentiell nachvollziehen kann. Grundlagen der Programmierung 2 - 17 - Parallele Reduktion: Beschleunigung maximale parallele Beschleunigung τ (1) τ (1) q := = lim . p→∞ τ (p) τ (∞) parallele Beschleunigung bei unbeschränkter Anzahl von Prozessoren. sequentieller Zeit-Anteil des Algorithmus := 1/q. Grundlagen der Programmierung 2 - 18 - Parallele Reduktion: Effizienz parallele Effizienz := = τ (1) p ∗ τ (p) Anteil der für den Algorithmus nutzbaren gesamten Leistung aller Prozessoren Beispielhafte Zahlen: Zeit Beschleunigung Effizienz Grundlagen der Programmierung 2 τ (1) 1000 1 1 τ (3) 500 2 66,6% τ (4) 400 2,5 62,5% - 19 - Parallele Effizienz τ (1) ist eine Zahl zwischen 1 und 1/p. p ∗ τ (p) 1 optimal: alle Prozessoren tragen zur zur Berechnung bei 1/p schlecht: Berechnung ist im wesentlichen sequentiell Grundlagen der Programmierung 2 - 20 - Amdahls Gesetz Begrenzung der parallelen Beschleunigung Amdahl-Annahmen zur Problemstruktur (≈ für alle Eingaben) T = Tpar + Tseq Gesamtzeit T hat parallelen und sequentiellen Anteil Tpar Verhältnis ist konstant. Tseq Beispiel map f xs Sequentieller Anteil: mindestens ein Listendurchlauf Grundlagen der Programmierung 2 - 21 - Amdahls Gesetz (2) Beschleunigung durch p Prozessoren: Tpar + Tseq (1/p) ∗ Tpar + Tseq Bei unendlich vielen Prozessoren: Tpar + Tseq Beschleunigung ≤ Tseq Beispiel Wenn sequentieller Anteil = 5%, dann ist Beschleunigung maximal 20 Grundlagen der Programmierung 2 - 22 - Gustafson-Barsis Gesetz Gustafson-Barsis-Annahme: T = Tseq + p ∗ Tp T Tseq p ∗ Tp Zeit für einen Prozessor fester sequentiellen Anteil, z.B. Initialisierung auf p Prozessoren verteilbare Berechnungszeit Tseq ergibt sich: Mit α = Tp Beschleunigung Grundlagen der Programmierung 2 = α+p Tseq + p ∗ Tp = Tseq + Tp α+1 - 23 - Gustafson-Barsis Gesetz: Beispiel Anwendung von f auf alle Elemente eines Arrays der Länge n a[1], . . . , a[n] Tseq Tp → f a[1], . . . , f a[n] Initialisierungszeit Zeit zum Berechnen von f x. Wenn Tseq = Tp, dann Beschleunigung mit n Prozessoren = Grundlagen der Programmierung 2 1+n 2 - 24 - Beispiele: Algorithmen und Parallelisierung in Haskell • • • • • • vereinfachtes Modell: wie könnte man in Haskell parallelisieren? unabhängige Transformationen können parallel durchgeführt werden. Annahme: beliebig viele Prozessoren Wir benutzen verzögerte Reduktion und Sharing bzw. letDarstellung. Jede Transformation benötigt eine Zeiteinheit. Anzahl parallel mögliche Transformationen = Anzahl der Prozessoren Grundlagen der Programmierung 2 - 25 - Beispiele quadratsumme 3 4 −→ (3*3)+(4*4) −→ 9+16 −→ 25. 2 Prozessoren; 3 Zeiteinheiten werden benötigt Grundlagen der Programmierung 2 - 26 - Beispiel: Fakultät fakt 3 −→ if 3 == 1 then 1 else 3*(fakt (3-1)) −→ if False then 1 else 3*(if 2 == 1 then 1 else 2*(fakt (2-1) ) −→ 3*(if False then 1 else 2*(if 1 == 1 then 1 else 1*(fakt (1-1))) −→ 3*(2*(if True then 1 else 1*(if 0 == 1 then 1 else 1*(fakt0))) −→ 3*(2*(1)) −→ 3*(2) −→ 6 7 parallele Auswertungsschritte bei 4 Prozessoren. Die parallele Zeit ist O(n). Mehr Prozessoren helfen nicht. Grundlagen der Programmierung 2 - 27 - Beispiel: Fakultät Man kann (fakt n) in paralleler Zeit O(log(n)) berechnen: Idee: Benutze Divide-and-Conquer: 1 ∗ 2 ∗ 3... ∗ n = 1 ∗ 2 ∗ . . . ∗ (n/2) ∗ (n/2 + 1) ∗ . . . ∗ n usw. Grundlagen der Programmierung 2 - 28 - Beispiel map quadrat [1..n]. Auswertungssequenz: map quadrat [1..n] 1: map quadrat [2..n] 1: 4: (map quadrat [3..n]) Benötigt O(n) parallele Schritte. Grundlagen der Programmierung 2 - 29 - Summation von n Zahlen in einer Liste Zwei Algorithmen für Summe im Vergleich: sum [] = 0 sum (x:xs) = x+ (sum xs) Benötigt O(n) parallele Reduktionsschritte. Grundlagen der Programmierung 2 - 30 - Summation von n Zahlen in einem balancierten binären Baum: data BBaum a = BBlatt a | Bknoten (BBaum a) (BBaum a) sumbt (Bblatt x) = x sumbt (Bknoten bl br) = (sumbt bl) + (sumbt br) Bei Tiefe h: 2 ∗ (h + 1) parallele Schritte, d.h., log2(n) + 1 . sehr gut für parallele Verarbeitung geeignet Grundlagen der Programmierung 2 - 31 - Summation von n Zahlen in einem balancierten binären Baum mittels schnellem foldbt foldbt (+) 0 "(((1,2),3),(4 ,5))" --> foldbt (+) (foldbt (+) 0 "(4 ,5)") "((1,2),3)" --> foldbt (+) (foldbt (+) (foldbt (+) (foldbt (+) 0 "5") ................. --> "4") "3") 1+ (2+ (3+ (4+ 5)))) Die Problematik ist: Obwohl sich die foldbt exponentiell ausbreiten: Die Summe 1+ (2+ (3+ (4+ 5))) ist sequentiell D.h., man braucht mindestens O(n) parallele Schritte foldbt nicht geeignet zur Parallelisierung Grundlagen der Programmierung 2 - 32 - Paralleles Sortieren von (verschiedenen) Zahlen Nachweis: Parallelisierung kann Sortieren beschleunigen. Merge-Sort: die zerlegten Listen sind parallel sortierbar. Aber: Mischen ist sequentiell, Zerlegen ebenfalls Man benötigt an parallelen Reduktionen 2 ∗ n + 2 ∗ (n/2) + 2 ∗ (n/4) + . . . = 4 ∗ n D.h. O(n). Grundlagen der Programmierung 2 - 33 - Paralleles Sortieren Es gibt Parallelisierungen, die in O((log(n))2) laufen. Es gibt komplizierte Parallelisierungen, die laut Experten sogar nur O(log(n)) Zeit benötigen. Parallele Sortieralgorithmen: Sortiernetzwerke Grundlagen der Programmierung 2 - 34 - Parallelisierung: Bemerkungen Divide-and-COnquer (Teile-und Herrsche) kann sehr gut parallelisierbare Algorithmen ergeben Aber nicht immer: Sequentielle optimierte Algorithmen (Scan) ergeben i.a. schlecht parallelisierbare Algorithmen Hand-Parallelisierung auf der Programmiersprachenebene: nur sehr spezielle Anwendungen Stete Beschleunigung der CPUs holt den Vorteil paralleler S.W.-Architekturen immer wieder ein Grundlagen der Programmierung 2 - 35 - Parallelisierung: Bemerkungen Wo ist Parallelisierung aktuell lohnend? • auf Prozessorebene • implizit durch den Compiler • Number Crunching: wie z.B. Wettervorhersage • Grid Computing: viele gleichartige Daten, gleiches Programm Grundlagen der Programmierung 2 - 36 -