Parallelität auf Instruktionsebene Übersetzung von künstlichen Sprachen Präsentation: Christoph Heitmann 03.06.2009 Motivation Moderne Rechnerarchitekturen nutzen die parallele Befehlsausführung für eine beschleunigte/effiziente Programmausführung VLIW • Very Long Instruction Word • Mehrere Befehle zu einem VLIW-Befehl zusammengefasst • Statische Planung Superskalar • Mehrere parallelarbeitende Funktionseinheiten • Dynamische Planung Parallelität auf Instruktionsebene 2 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 3 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 4 Grundlagen Phasenstruktur eines Compilers Die Optimierung für Befehlsparallelität erfolgt auf Basis eines Zwischencodes und für eine spezifische Architektur Frontend Optimierung Backend Optimierung für Parallelität auf Instruktionsebene Zielcode-Generierung Lexikalische Analyse Syntaktische Analyse Semantische Analyse u.a. ZwischencodeGenerierung 5 Grundlagen Darstellungsformen (1) Das Programmbeispiel berechnet den größten gemeinsamen Teiler zweier Zahlen nach Euklid Ursprungsprogramm (C#): Code für abstrakte Maschine: // Gegeben: Zwei Ganzzahlen a > 0, b > 0, // Variable z für Zwischenberechnungen 1 while (b > 0) | Block A 2 { 3 if (a < b) | Block B 4 { 5 z = a; | Block C 6 a = b; | Block C 7 b = z; | Block C 8 } 9 z = a - b; | Block D 10 a = b; | Block D 11 b = z; | Block D 12 } // Gegeben: Zwei Ganzzahlen a > 0, b > 0 // r0 = Speicherdresse von a, // r1 = Speicherdresse von b, r2 = 0 I1 S: LD r3, r0 I2 LD r4, r1 I3 CJMP r3 < r4, T |--- Ende Grundblock A ---| I4 SUB r5, r3 – r4 I6 ST r0, r4 I7 ST r1, r5 I8 CJMP r4 > r2, S |--- Ende Grundblock B ---| |--- Ende von Programmteil S ---| I9 T: LD r5, r0 I10 ST r0, r4 I11 ST r1, r5 I12 CJMP S |--- Ende Grundblock C ---| |--- Ende von Programmteil T ---| Generiere Zwischencode Abstrakte Maschine RISC-ähnliche Architektur Lade- und Speicherbefehl (LD bzw. ST) Addition und Subtraktion (ADD bzw. SUB) Bedingter Sprungbefehl (CJMP) 1x Rechenwerk (ALU) 1x Speicherkommunikationseinheit (MEM) 6 Grundlagen Darstellungsformen (2) Im Programm befindliche Steuerungs- und Datenabhängigkeiten lassen sich mit Hilfe von Graphen veranschaulichen Kontrollflussgraph (und Verfeinerung) Datenabhängigkeitsgraph B F ALU MEM A T T B SUB r5, r3–r4 SUB r5, r3 – r4 T F C B F ST r0, r4 ST r0, r4 ST r1, r5 CJMP r4 > r2, S F 1 1 ST r1, r5 1 1 1 CJMP S 1 Steuerungsabhängigkeiten echte Datenabängigkeiten Beschreibt Programmfluss mit Bedingungsprüfungen Ressourcenreservierungstabelle Programmverzweigungen mit wahr (T) und unwahr (F) Kantenbeschriftung mit Verzögerungszeiten 7 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 8 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 9 Planung eines Grundblockes (1) Die lokale Codeplanung ergibt einen Ablaufplan für einen Grundblock, und stellt somit den ersten Schritt einer Optimierung dar Datenabhängigkeitsgraph: Optimiertes Maschinenprogramm: B ALU MEM SUB r5, r3–r4 ST r0, r4 1 1 ST r1, r5 1 Listenplanung 1 Takt 1 2 3 Maschinencode SUB r5, r3 – r4 ST r0, r4 ST r1, r5 CJMP r4 > r2, S - ALU MEM 1 CJMP S 1 Grundsatz der Listenplanung „… berechnet der Algorithmus den frühesten Zeitpunkt, zu dem ein Knoten ausgeführt werden kann, gemäß seinen Datenabhängigkeiten zu den vorher verplanten Knoten.“ Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman 10 Planung eines Grundblockes (2) Nicht alle Grundblöcke bieten die Möglichkeit einer parallelen Befehlsausführung Ablaufpläne optimierter Grundblöcke Takt 1 2 3 4 Maschinencode LD r3, r0 LD r4, r1 CJMP r3 < r4, T - ALU Takt 1 2 3 Maschinencode SUB r5, r3 – r4 ST r0, r4 ST r1, r5 CJMP r4 > r2, S - ALU Takt 1 2 3 4 5 Maschinencode LD r5, r0 ST r0, r4 ST r1, r5 CJMP r3 < r4, T - ALU Auswertung MEM Grundblock A: Keine parallele Ausführung Grundblock B: Benötigt 3 statt 4 Takte Grundblock C: Keine parallele Ausführung MEM Fazit Die Listenplanung im Rahmen der lokalen Ablaufplanung erfasst nur ein geringes Parallelitätspotential. MEM - 11 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 12 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 13 Planung mehrerer Grundblöcke / Bereiche (1) Im Rahmen der Bereichsplanung erfolgt eine Herausarbeitung von Parallelität über Grundblockgrenzen hinaus Dominanzbeziehungen und Parallelitätskonzepte Bereichsplanung Dominanzbeziehungen zwischen Grundblöcken berücksichtigt Dominanzbeziehungen • Dominanz • Postdominanz • Kontrolläquivalenz einfache Codeverschiebung (aufwärts) spekulative Ausführung erfolgt an Hand eines azyklischen Graphen Konzepte • einfache Codeverschiebung • aufwärts • abwärts Ein Bereich ist eine Menge von Grundblöcken und im Programmablauf nur durch einen Eingangspunkt erreichbar. (Definition in Anlehnung an David Bernstein, Michael Rodeh) • Spekulative Ausführung • Duplikation 14 Planung mehrerer Grundblöcke / Bereiche (2) Die Bereichsplanung erfolgt von innen nach außen und ermöglicht die parallele Ausführung von Befehlen verschiedener Grundblöcke Global geplanter Ablaufplan Zeile 1 2 3 4 5 6 7 8 9 Block A A A A A B B C C S: T: Maschinencode LD LD CJMP r3 < r4, T LD SUB r5, r3 – r4 ST CJMP r4 > r2, S ST ST CJMP r3 < r4, T ST Auswertung ALU r3, r4, r5, r0, r1, r0, r1, r0 r1 MEM ursprünglich: 11 Zeilen / max. 17 Takte jetzt: 9 Zeilen / max. 9 Takte r0 r4 r5 r4 r5 Der Grad der parallelen Ausführung lässt sich mit Hilfe der Bereichsplanung steigern. Jedoch ist das Parallelitätspotential auf Grund der azyklischen Optimierung von Schleifen begrenzt. 15 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 16 Agenda Grundlagen Lokale Codeplanung Globale Codeplanung Softwarepipelining 17 Schleifentypen Zu beachtende Abhängigkeiten zwischen einzelnen Iterationen einer Schleife existieren in sogenannten Do-Across-Schleifen Do-Schleife Do-Across-Schleife // Gegeben: Array a mit Ganzzahlen, // Indexvariable i mit 0 initialisiert // Anzahl Elemente n des Arrays a, Konstante c 1 while (i < n) 1 { 3 a[i] = a[i] + c; 4 i++; 5 } // // // // 1 2 3 4 5 z.B. Operationen auf Vektoren z.B. Berechnungen mit Zwischenprodukten einzelne Schleifendurchläufe unabhängig Abhängigkeiten zwischen den Iterationen einfacher Fall komplex Gegeben: Array a mit Ganzzahlen, Indexvariable i mit 0 initialisiert Anzahl Elemente n des Arrays a, Variable prod mit 1 initialisiert while (i < n) { prod = prod * a[i]; i++; } 18 Abwickeln von Schleifen Bestehen keine Datenabhängigkeiten zwischen den Durchläufen, kann die Schleife theoretisch vollständig abgewickelt werden Viermal abgewickelte Do-Schleife I1 LD++ // Iteration 1 I2 ADD , LD++ // Iterationen 1 + 2 I3 ST++ , ADD // Iterationen 1 + 2 I4 ST++ // Iteration 2 I5 LD++ // Iteration 3 I6 ADD , LD++ // Iterationen 3 + 4 I7 ST++ , ADD // Iterationen 3 + 4 I8 ST++ // Iteration 4 |----------- Ende der Abwicklung ------------| I9 S: LD++ // Iterationen 5 bis n I10 ADD I11 ST++ , CJMP-- S Softwarepipeling: Lösung Ermöglicht die geforderte Ausführungsbeschleunigung mit einem geringen Zuwachs bzgl. des Codeumfangs. sehr hohes Parallelitätspotential drastischer Codezuwachs Kompromiss notwendig 19 Umsetzung der Do-Schleife in einer Softwarepipeline Eine Pipeline bietet i.d.R. schon für wenige Iterationen einen hohen, mit der Durchlaufzahl wachsenden Geschwindigkeitsvorteil. Bestandteile Softwarepipeline Prolog • „Füllen“ der Pipeline • einmalig ausgeführt Stationärer Zustand („Kernel“) • Mini-Schleife • maximale Parallelität • n-fach ausgeführt Epilog • „Leeren“ der Pipeline • einmalig ausgeführt 1 2 3 4 5 6 Best. (P) (SZ) (E) Maschinencode S: LD++ ADD ST++ LD++ ADD ST++ LD++ ADD ST++ ALU MEM JMP CJMP-- S SZ bearbeitet n – 2 Iterationen SZ benötigt 2 (statt 3) Takte je Iteration Schleife muss mindestens 3x durchlaufen werden Konfliktprüfung: Modulare Ressourcenreservierungstabelle 20 Umsetzung der Do-Across-Schleife (1) Die Umsetzung einer Do-Across-Schleife findet auf Basis eines zyklischen Abhängigkeitsgraphen statt. Planungsverfahren Graphenerweiterung Planung eines zyklischen Graphen ALU MEM JMP LD++ Minimierung des Einleitungsintervalls ist nur NP-lösbar 0,1 LD 0,1 0,1 MULT 1,1 Vereinfachung durch Anwendung einer Heuristik 0,1 0,1 • Ober- und Untergrenze des Einleitungsintervalls • liefert Ergebnisse nahe am Optimum 0,1 ST , CJMP 1 -- S Sukzessive Planung von SCCs (Strong Connected Components) Berechnung der längsten einfachen Pfade SCC1 A • Zyklen haben keine Auswirkung • garantiert Einhaltung aller Abhängigkeiten Rückverfolgung (engl. „Backtracking“) 0,1 SCC2 B 1,1 0,1 0,1 C 0,1 D 21 Umsetzung der Do-Across-Schleife (2) Im Beispiel ergibt sich ein Einleitungsintervall s von 3 Takten Softwarepipeline Verfahrensanwendung s N Intervall Startzeitpunkt 3 3 3 3 A 0, ∞ 1, ∞ 2,2 3,3 0 1 2 3 B C D Modulare Ressourcenreservierung ALU MEM ‼ JMP Rückverfolgung s N Intervall Startzeitpunkt 3 3 3 3 A 0, ∞ 1, ∞ 3,3 4,4 0 2 3 4 B C D Zeile 1 2 3 4 5 6 7 8 Pipeline Prolog SZ Epilog S: Maschinencode LD++ LD MULT LD++ ST LD MULT ST ALU MEM JMP CJMP-- S Modulare Ressourcenreservierung ALU MEM JMP 22 Umsetzung der Do-Across-Schleife (3) Eine geringe Codeverlängerung ist in Betracht des Geschwindigkeitszuwachses zu vernachlässigen Auswertung Codeverlängerung • 8 Zeilen / Takte • ursprünglich 5 Takte Softwarepipeling: Gesamtausführungszeit • Pipeline: 5 + 3n Takte • ursprüngliche Schleife: 4 Takte Fazit Ermöglicht die geforderte Ausführungsbeschleunigung mit einem geringen Zuwachs bzgl. des Codeumfangs. • Vorteil schon ab 6 Durchläufen Planung schon im 2. Versuch erfolgreich 23 Hierarchische Reduktion Durch die hierarchische Reduktion wird das Konzept des Softwarepipelinings universeller anwendbar Bisher Konzept der hierarchischen Reduktion Schleifen mit nur einem Grundblock ähnlich der Bereichsplanung (globale Codeplanung) keine Verzweigungen innerhalb der Schleife Behandlung von Kontrollstrukturen umgebender Code nicht betrachtet „if-then-else“-Konstrukte Zurückführen auf elementares Objekt Objekt wird wie Grundblock behandelt reduzierte Objekte können überlappt werden Glassbox statt Blackbox (Bereichsplanung) Abhängigkeiten als Maximum beider Äste keine Ressourcenüberbeanspruchung Überlappung: Prolog/Epilog und andere Instruktionen Objekte erhalten Ressourcenverbrauch des SZ SZ darf nicht überlappt werden 24 Zusammenfassung Lokale Codeplanung für ein (Grundblock-)Element geringes Parallelitätspotential einfach zu planen Grundlage für globale Planung 25 Zusammenfassung Lokale Codeplanung Globale Codeplanung für ein (Grundblock-)Element Bereichsplanung geringes Parallelitätspotential mittleres Parallelitätspotential einfach zu planen Dominanzbeziehungen Grundlage für globale Planung 26 Zusammenfassung Lokale Codeplanung Globale Codeplanung Softwarepipelining für ein (Grundblock-)Element Bereichsplanung Schleifen geringes Parallelitätspotential mittleres Parallelitätspotential Kompromiss einfach zu planen Dominanzbeziehungen Grundlage für globale Planung • Codelänge • Geschwindigkeit hohes Parallelitätspotential 27 Vielen Dank für die Aufmerksamkeit!