Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Code-Optimierung Philipp Bergener Seminar „Übersetzung künstlicher Sprachen“

Ähnliche Präsentationen


Präsentation zum Thema: "Code-Optimierung Philipp Bergener Seminar „Übersetzung künstlicher Sprachen“"—  Präsentation transkript:

1 Code-Optimierung Philipp Bergener Seminar „Übersetzung künstlicher Sprachen“

2 2 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

3 3 Ziele und Anforderungen Verbesserung des Codes, der bei direkter, „naiver“ Übersetzung entsteht Optimierungsmöglichkeiten Verbesserung der Ausführgeschwindigkeit Verringerung des Speicherbedarfs zur Laufzeit Verkleinerung des erzeugten Codes Anforderungen Semantik des Programms muss erhalten bleiben Aufwand für Optimierung muss sich lohnen

4 4 Systematisierung Nach Zeitpunkt für Code-Optimierung: Nach Zwischen-Codeerzeugung: Eher allgemeine Methoden Nach Maschinen-Codeerzeugung: Eher maschinenspezifisch Globale vs. lokale Optimierung Lokal: Nur Ausschnitt (Basisblock) wird betrachtet Global: Mehrere Basisblöcke werden betrachtet

5 5 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

6 6 Drei-Adress-Code Zur Darstellung des Zwischencodes Maximal 3 Adressen pro Befehl Typen von Befehlen Zuweisung: x = y op z op: arithmetisch (+,-,*,/) oder logisch (AND, OR) Kopieranweisungen: x = y Unbedingte Sprünge: goto L (L Sprungmarke) Bedingte Sprünge: if x goto L bzw. ifFalse x goto L oder if x relop y bzw. ifFalse x relop y (relop:, etc.) Indizierte Kopieranweisungen: x = a[i] bzw. a[i] = x a[i]: Speicherstelle i Einheiten hinter a

7 7 Basisblöcke und Flussgraphen Basisblöcke Strukturieren den Code Eigenschaften eines Basisblocks: Kann nur durch die erste Anweisung betreten werden Wird ohne Sprünge durchlaufen. Sprünge nur in der letzten Anweisung Ein Basisblock beginnt Bei der ersten Codezeile Bei Zeilen, die Ziel von Sprüngen sind Bei Zeilen, die auf Sprünge folgen Flussgraphen stellen Kontrollfluss grafisch dar Basisblöcke sind Knoten 2 zusätzliche Knoten Eingang und Ausgang

8 8 Beispiel: Binäre Suche public Ingeger binsearch(Integer k) { Integer m,l,r; //Anfang l = 0; r = N-1; do { m = (l+r)/2; if(k < a[m]) r = m-1; else l = m+1; while((k != a[m])||(l<r)); //Ende... end E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

9 9 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

10 10 Datenflussanalyse Viele Optimierungsansätze brauchen Informationen über Datenfluss im Programm Programm ist eine Folge von Zuständen Zustand: unter anderem aktuelle Werte der Variablen Anweisungen sind Zustandsübergänge Durch Sprünge sind Zustände nicht immer eindeutig Nur der für ein Problem relevante Teil des Zustandes betrachtet Es wird nicht unterschieden auf welchem Pfad ein Programmpunkt erreicht wird

11 11 Bestandteile eines Datenflussproblems Datenflussproblem ist 4-Tupel (D, V, ^, F) Datenflussrichtung D  {Vorwärts, Rückwärts} Gibt an ob Informationen mit oder gegen Informationsfluss fließen Domäne V relevanter Teil des Zustandes Konfluenzoperator ^ (z.B.  ) Zum Übergang zwischen Blöcken Menge von Transferfunktionen F F: V  V Für ganze Basisblöcke

12 12 Verfügbare Definitionen Fragestellung: Welche Definition für eine Variable ist an einem bestimmten Programmpunkt gültig Datenflussrichtung: D = Vorwärts Domäne: Potenzmenge der Menge aller Definitionen Konfluenzoperator: , also IN[B] =  P Vorgänger von B OUT[P] Transferfunktion: gen B : Menge generierter Definitionen in Block B kill B : Menge gelöschter Definitionen in Block B Dann OUT[B] = gen B  (IN[B] - kill B )

13 13 Verfügbare Definitionen l = 0(d1) r = N-1(d2) l = m+1(d8) r = m-1(d7) goto B5 B1 B3 B4 gen[B1]={d1, d2} kill[B1]={d7,d8} gen[B3]={d7} kill[B3]={d2} gen[B4]={d8} kill[B4]={d1}... B2

14 14 Aktive Variablen Eine Variable x ist aktiv an Punkt p, wenn der Wert von x in p entlang eines Pfades von p an benutzt kann und wird. Andernfalls ist sie passiv. Datenflussrichtung: D = Rückwärts Domäne: Potenzmenge der Menge aller Variablen Konfluenzoperator: , also OUT[B] =  P Nachfolger von B IN[P] Transferfunktion: def B : Menge der Variablen, die in Block B definiert werden use B : Menge der Variablen, die in B benutzt werden (bevor sie neu definiert werden) Dann: IN[B] = use B  (OUT[B] - def B )

15 15 Verfügbare Ausdrücke Ein Ausdruck der Form x op y ist an einem Punkt p verfügbar, wenn der Ausdruck auf jedem Pfad zu p berechnet wird und weder x noch y danach überschrieben werden Datenflussrichtung: D = Vorwärts Domäne: Potenzmenge der Menge aller Ausdrücke Konfluenzoperator:  also IN[B] =  P Vorgänger von B OUT[P] Transferfunktion: e_gen B : Menge aller Ausdrücke, die in B (neu) berechnet werden e_kill B : Menge aller Ausdrücke, die in B ungültig werden Dann: OUT[B] = e_gen B  (IN[B] - e_kill B )

16 16 Halbverband Ein Datenflussproblem bildet einen Halbverband Eigenschaften eines Halbverbands: x ^ x = x x ^ y = y ^ x x ^ (y ^ z) = (x ^ y) ^ zx, y, z  V Halbverbände haben oberstes Element T mit T ^ x = x  x  V Für  : T =  Für  : T = Basismenge der Potenzmenge

17 17 Algorithmus zum Lösen von Datenflussproblemen Zusätzlich noch Startmenge v (meist  ) OUT[Eingang]=v Eingang ; for(jeden Block B außer Eingang) OUT[B] = T; while(min. ein OUT wird geändert) for(jeden Block B außer Eingang) { IN[B]=^ P Vorgänger von p OUT[P]; OUT[B]=f B (IN[B]); } Für D = Rückwärts IN und OUT vertauschen Ausgang statt Eingang

18 18 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

19 19 Eliminierung gemeinsamer Teilausdrücke Gemeinsamer Teilausdruck: Vorkommen von Ausdruck E der schon einmal berechnet wurde und sich nicht mehr geändert hat. Ziel: wiederholte Berechnungen des gleichen Ausdrucks vermeiden Ermitteln mit Verfügbaren Ausdrücken Eliminierung Teilausdruck in Hilfsvariable speichern Dann statt Teilausdruck Hilfsvariable verwenden

20 20 Eliminierung gemeinsamer Teilausdrücke t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[t2] ifFalse k<t3 goto B4 t4 = h1 t5 = a[t4] ifFalse k==t5 goto B2... B2 B5 l = m+1 r = m-1 goto B5 B3 B4 l = m+1 r = m-1 goto B5 B3 B4...

21 21 Weitergabe von Kopien Durch andere Optimierungsverfahren entstehen Kopien der Form x = y Ziel: y anstelle von x benutzen Dadurch kann die Kopieranweisung überflüssig werden Lösung mit Verfügbaren Definitionen: Ersetzung ist in p möglich, wenn x und y noch gleichen Wert besitzen Dazu müssen sowohl die Definition x = y als auch die Definition für y, die in x = y galt, gültig in p sein Außerdem dürfen keine anderen Definitionen x und y p erreichen

22 22 Weitergabe von Kopien t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[t2] ifFalse k<t3 goto B4 t4 = h1 t5 = a[t4] ifFalse k==t5 goto B2 t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[h1] ifFalse k<t3 goto B4 t4 = h1 t5 = a[h1] ifFalse k==t5 goto B2... B2 B5 l = m+1 r = m-1 goto B5 B3 B4 l = m+1 r = m-1 goto B5 B3 B4...

23 23 Eliminierung von totem Code Toter Code: Anweisungen, die nie erreicht werden Zuweisungen, die nie benutzt werden Entsteht durch andere Optimierungen oder (selten) durch Programmierfehler Identifizierung über aktive Variablen Beispiel: x = true...//Hier keine Zuweisungen an x if x goto L1 a = b + c //Toter Code L1:b = 2 * c

24 24 Optimierung von Schleifen Programme verbringen einen Großteil ihrer Zeit in Schleifen Optimierung von Schleifen daher besonders wichtig 2 Ansätze zur Optimierung von Schleifen Export schleifeninvarianter Variablen Eliminierung von Induktionsvariablen

25 25 Optimierung von Schleifen Identifikation von Schleifen Dominator: Knoten d dominiert Knoten n (d dom n), wenn jeder Pfad im Flussgraph von Eingang zu n über d führt Rückwärtskante: Kante n → d mit d dom n Natürliche Schleife einer Rückwärtskante n → d: Alle Knoten von denen n erreicht werden kann ohne durch d zu laufen

26 26 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

27 27 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

28 28 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

29 29 Optimierung von Schleifen Export schleifeninvarianter Variablen: Variable ist schleifeninvariant, wenn in Schleife keine Zuweisung an sie erfolgt Ein Ausdruck ist schleifeninvariant, wenn er nur aus schleifeninvarianten Variablen besteht Diese sollen aus der Schleife herausgezogen werden while (i < max) do x := 3*y//3*y ist schleifeninvariant z := x+j j := i*2 i := i+1 end

30 30 Optimierung von Schleifen Eliminierung von Induktionsvariablen Induktionsvariable, die sich bei jedem Schleifendurchlauf um den gleichen, konstanten Wert ändert Diese sollen (bis auf eine) eliminiert werdenx := 3*y while (i < max) doj := 2*i z := x+jwhile (j < 2*max) do j := i*2z := x+j i := i+1j := j+2end i := max

31 31 Konstantenfaltung Konstanten verbessern die Lesbarkeit von Programmen Auf Ebenen des Zwischencodes nicht nötig Daher: Variablen, die an einer Stelle immer den gleichen Wert haben durch diesen ersetzen Ausdrücke, die nur aus Konstanten bestehen, können dann ebenfalls berechnet werden Ermittlung von Konstanten auch mit Datenflussanalyse möglich

32 32 Konstantenfaltung Beispiel: N = 10//Konstante... x = 2//Wert in nächster Anweisung immer gleich y = N*x//N und x können ersetzt werden N = 10... x = 2 y = 10*2//Ausdruck kann jetzt berechnet werden

33 33 Algebraische Umformungen Ersetzen von langsameren Befehlen durch schnellere Ausnutzen von mathematischen Gesetzen Beispiele x*2 n → x shiftl n x + 0 oder x * 1 → x x 2 → x*x 2*x → x+x x/4 → x * 0,25

34 34 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

35 35 Zusammenfassung Direkt übersetzter Code kann noch weiter optimiert werden Es gibt verschiedene Ansätze zur Optimierung Datenflussanalyse bildet eine wichtige Grundlage für viele dieser Ansätze Es gibt weitere Optimierungsmethoden, z.B. für Maschinen-Code für OO-Sprachen

36 36 Fragen Vielen Dank für die Aufmerksamkeit Fragen?


Herunterladen ppt "Code-Optimierung Philipp Bergener Seminar „Übersetzung künstlicher Sprachen“"

Ähnliche Präsentationen


Google-Anzeigen