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

Preview:

Citation preview

Code-OptimierungPhilipp BergenerSeminar „Übersetzung künstlicher Sprachen“

2

Agenda

Einführung

Grundlagen

Datenflussanalyse

Methoden zur Code-Optimierung

Zusammenfassung

3

Ziele und Anforderungen

Verbesserung des Codes, der bei direkter, „naiver“ Übersetzung entsteht

OptimierungsmöglichkeitenVerbesserung der Ausführgeschwindigkeit

Verringerung des Speicherbedarfs zur Laufzeit

Verkleinerung des erzeugten Codes

AnforderungenSemantik des Programms muss erhalten bleiben

Aufwand für Optimierung muss sich lohnen

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

Agenda

Einführung

Grundlagen

Datenflussanalyse

Methoden zur Code-Optimierung

Zusammenfassung

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

Basisblöcke und FlussgraphenBasisblöcke

Strukturieren den CodeEigenschaften eines Basisblocks:

Kann nur durch die erste Anweisung betreten werdenWird ohne Sprünge durchlaufen. Sprünge nur in der letzten Anweisung

Ein Basisblock beginntBei der ersten CodezeileBei Zeilen, die Ziel von Sprüngen sindBei Zeilen, die auf Sprünge folgen

Flussgraphen stellen Kontrollfluss grafisch darBasisblöcke sind Knoten2 zusätzliche Knoten Eingang und Ausgang

8

Beispiel: Binäre Suchepublic Ingeger

binsearch(Integer k) {Integer m,l,r;//Anfangl = 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

Eingang

l = 0r = N-1

t1 = l+rm = t1/2t2 = 8*mt3 = a[t2]ifFalse k<t3 goto B4

Ausgang

l = m+1r = m-1goto B5

if l<r goto B2

t4 = 8*mt5 = a[t4]ifFalse k==t5 goto B2

B1

B2

B3 B4

B5

B6

9

Agenda

Einführung

Grundlagen

Datenflussanalyse

Methoden zur Code-Optimierung

Zusammenfassung

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

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

Verfügbare Definitionen

Fragestellung: Welche Definition für eine Variable ist an einem bestimmten Programmpunkt gültig

Datenflussrichtung: D = VorwärtsDomäne: Potenzmenge der Menge aller DefinitionenKonfluenzoperator: , also IN[B] = P Vorgänger von BOUT[P]Transferfunktion:• genB: Menge generierter Definitionen in Block B• killB: Menge gelöschter Definitionen in Block B• Dann OUT[B] = genB (IN[B] - killB)

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

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ärtsDomäne: Potenzmenge der Menge aller VariablenKonfluenzoperator: ,

also OUT[B] = P Nachfolger von BIN[P]Transferfunktion:• defB: Menge der Variablen, die in Block B definiert werden• useB: Menge der Variablen, die in B benutzt werden (bevor sie neu

definiert werden)• Dann: IN[B] = useB (OUT[B] - defB)

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 BOUT[P]

Transferfunktion:• e_genB: Menge aller Ausdrücke, die in B (neu) berechnet werden

• e_killB: Menge aller Ausdrücke, die in B ungültig werden

• Dann: OUT[B] = e_genB (IN[B] - e_killB)

16

Halbverband

Ein Datenflussproblem bildet einen HalbverbandEigenschaften eines Halbverbands:

x ^ x = xx ^ y = y ^ xx ^ (y ^ z) = (x ^ y) ^ z x, y, z V

Halbverbände haben oberstes Element T mitT ^ x = x x VFür : T = Für : T = Basismenge der Potenzmenge

17

Algorithmus zum Lösen von Datenflussproblemen

Zusätzlich noch Startmenge v (meist )

OUT[Eingang]=vEingang;

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 pOUT[P];

OUT[B]=fB(IN[B]);

}

Für D = RückwärtsIN und OUT vertauschen

Ausgang statt Eingang

18

Agenda

Einführung

Grundlagen

Datenflussanalyse

Methoden zur Code-Optimierung

Zusammenfassung

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

Eliminierung gemeinsamer Teilausdrücke

t1 = l+rm = t1/2t2 = 8*mt3 = a[t2]ifFalse k<t3 goto B4

t4 = 8*mt5 = a[t4]ifFalse k==t5 goto B2

t1 = l+rm = t1/2h1 = 8*mt2 = h1t3 = a[t2]ifFalse k<t3 goto B4

t4 = h1t5 = a[t4]ifFalse k==t5 goto B2

......

B2B2

B5 B5

l = m+1r = m-1goto B5

B3 B4

l = m+1r = m-1goto B5

B3 B4

... ...

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

Weitergabe von Kopien

t1 = l+rm = t1/2h1 = 8*mt2 = h1t3 = a[t2]ifFalse k<t3 goto B4

t4 = h1t5 = a[t4]ifFalse k==t5 goto B2

t1 = l+rm = t1/2h1 = 8*mt2 = h1t3 = a[h1]ifFalse k<t3 goto B4

t4 = h1t5 = a[h1]ifFalse k==t5 goto B2

... ...B2 B2

B5B5

l = m+1r = m-1goto B5

B3 B4l = m+1r = m-1

goto B5

B3 B4

......

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 VariablenBeispiel:

x = true... //Hier keine Zuweisungen an xif x goto L1a = b + c //Toter Code

L1: b = 2 * c

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 SchleifenExport schleifeninvarianter Variablen

Eliminierung von Induktionsvariablen

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

Optimierung von Schleifen

Eingang

l = 0r = N-1

t1 = l+rm = t1/2t2 = 8*mt3 = a[t2]ifFalse k<t3 goto B4

Ausgang

l = m+1r = m-1goto B5

if l<r goto B2

t4 = 8*mt5 = a[t4]ifFalse k==t5 goto B2

B1

B2

B3 B4

B5

B6

27

Optimierung von Schleifen

Eingang

l = 0r = N-1

t1 = l+rm = t1/2t2 = 8*mt3 = a[t2]ifFalse k<t3 goto B4

Ausgang

l = m+1r = m-1goto B5

if l<r goto B2

t4 = 8*mt5 = a[t4]ifFalse k==t5 goto B2

B1

B2

B3 B4

B5

B6

28

Optimierung von Schleifen

Eingang

l = 0r = N-1

t1 = l+rm = t1/2t2 = 8*mt3 = a[t2]ifFalse k<t3 goto B4

Ausgang

l = m+1r = m-1goto B5

if l<r goto B2

t4 = 8*mt5 = a[t4]ifFalse k==t5 goto B2

B1

B2

B3 B4

B5

B6

29

Optimierung von Schleifen

Export schleifeninvarianter Variablen:Variable ist schleifeninvariant, wenn in Schleife keine Zuweisung an sie erfolgtEin Ausdruck ist schleifeninvariant, wenn er nur aus schleifeninvarianten Variablen bestehtDiese sollen aus der Schleife herausgezogen werden

while (i < max) dox := 3*y //3*y ist

schleifeninvariantz := x+jj := i*2i := i+1

end

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 werden

x := 3*y x := 3*y

while (i < max) do j := 2*i

z := x+j while (j < 2*max) do

j := i*2 z := x+j

i := i+1 j := j+2

end end

i := max

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

Konstantenfaltung

Beispiel:N = 10 //Konstante...x = 2 //Wert in nächster Anweisung immer gleichy = N*x //N und x können ersetzt werden

N = 10...x = 2y = 10*2 //Ausdruck kann jetzt berechnet werden

33

Algebraische Umformungen

Ersetzen von langsameren Befehlen durch schnellere

Ausnutzen von mathematischen Gesetzen

Beispiele• x*2n → x shiftl n• x + 0 oder x * 1 → x• x2 → x*x• 2*x → x+x• x/4 → x * 0,25

34

Agenda

Einführung

Grundlagen

Datenflussanalyse

Methoden zur Code-Optimierung

Zusammenfassung

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

Fragen

Vielen Dank für die

Aufmerksamkeit

Fragen?

Recommended