• Keine Ergebnisse gefunden

Kapitel 10 SSA­Form

N/A
N/A
Protected

Academic year: 2022

Aktie "Kapitel 10 SSA­Form"

Copied!
277
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Kapitel 10 SSA­Form

Prof. Dr. Dr. h.c. Gerhard Goos

ggoos@ipd.info.uni-karlsruhe.de

Institut fur Programmstrukturen und Datenorganisation Universitat Karlsruhe

Wintersemester 2007/8

(2)

SSA Aufbau

(3)

Inhalt

1 Einfuhrung { Motivation IdeeFIRM

2 Aufbau Theorie

3 Praxis Beispiel

Konstruktion aus dem AST

(4)

Statische Einmalzuweisung { SSA

Ziel:

Ezienz prozedurglobaler Optimierungen steigern Datenuanalysen beschleunigen

Deniert-Benutzt-Beziehungen explizit darstellen

Denition SSA (Static Single Assignment, statische Einmalzuweisung): Ein Programm ist in SSA Form, wenn an jede Variable jeweils an genau einer Programmstelle zugewiesen wird.

Programm bedeutet hier zunachst Prozedur verlangt: Ablauf des Programms ist reduzibel

Variable bedeutet hier zunachst aliasfreie, lokale Variable

beachte: SSA bedeutet nicht, da jeder Wert nur einmal berechnet wird.

(5)

SSA intuitiv: Erkenntnisse

Maschinenbefehle verarbeiten Werte im Speicher/Registern. Es kommt nicht darauf an, wie die zugehorigen Variablen im

Quellprogramm heien. (Viele Werte entstammen der Adrerechnung und sind namenlos.)

Wenn zweimal dieselbe Operation auf die gleichen Operanden angewandt wird, kann man eine Operation weglassen (Idee der Wertnumerierung)

gleicher Operand heit hier: gleicher Wert zur Laufzeit Ob zwei Operanden gleichen Wert besitzen, kann von der Vorgeschichte, dem Ablaufpfad, der zu der Berechnung fuhrt, abhangen.

(6)

SSA intuitiv: schematische Konstruktion

Konstruktionsidee:

Ersetze alle Zuweisungen durch Vereinbarungen (Denitionen) dynamischer Konstanter, an die kein zweites Mal zugewiesen werden kann (daher SSA: statische Einmalzuweisung)

Verschiedene Zuweisungen an eine Programmvariable a fuhren zu Vereinbarungen verschiedener Konstanter a1; a2; :::

Uberall, wo a als Operand benutzt wird, setze die dort gultige Denition ai ein

Problem: Was tun, wenn die gultige Denition vom Ablaufpfad abhangt, auf dem die Benutzung als Operand erreicht wird?

Losung: Setze zuvor eine Auswahlfunktion (-Funktion) ein, die die gultige Denition abhangig vom Ablaufpfad selektiert.

Nebenbei: Diese Idee lost das Datenuproblem "ordne der Verwendung einer Variablen ihre letzte Denition zu\!

(7)

Abstrakte Werte

Problem: Wie verfahrt man mit verschiedenen abstrakten Werten bei Ablauf-Vereinigung?

Welches i ist hier gultig?

Vorher:

Jetzt:

i := ...

... := i i := ...

... := i

i1 := ...

... := i

1

i2 := ...

... := i

2

... := i

?

i1 := ... i

2 := ...

(8)

Abstrakte Werte II

Problem: Wie verfahrt man mit verschiedenen abstrakten Werten bei Ablauf-Vereinigung?

Welches i ist hier gultig?

Bei Zusammenfuhrungen des Ablaufs den Wert durch eine Pseudooperati- on i3 := (i1; i2), eine -Funktion, auswahlen.

Vorher:

Jetzt:

i3 := f(i1,i2) ... := i3 i1 := ... i2 := ...

i := ...

... := i i := ...

... := i

i1 := ...

... := i1 i2 := ...

... := i2

... := i? i1 := ... i2 := ...

(9)

Explizite Deniert-Benutzt-Beziehungen

Die SSA Form verringert den Aufwand zur Darstellung von Deniert-Benutzt-Beziehungen:

vorher: #Defs #Bens jetzt: #Defs + #Bens

i := ... i := ... i := ...

... := i ... := i

i1 := ...

... := i4

i4 := f(i1, i2, i3) i2 := ... i3 := ...

... := i4

(10)

-Funktionen

Eine -Funktion i3:= (i1; i2) wahlt abhangig vom Programmablauf einen der Werte i1; i2 aus und benutzt ihn als Wert i3.

Eine -Funktion hat genau so viele Operanden, wie der zugehorige Grundblock Vorganger im Ablaufgraph.

Das k-te Argument einer -Funktion ist eineindeutig dem k-ten Vorganger zugeordnet.

Das Ergebnis einer -Funktion ist das Argument, das dem Pfad, auf dem die -Funktion erreicht wurde, zugeordnet ist.

-Funktionen stehen immer am Blockanfang.

Alle -Funktionen eines Blocks werdensimultan ausgewertet.

(11)

Implementierung

Optimierungen benotigen Deniert-Benutzt-Beziehungen.

Dafur Operationen in Tripelform als Ecken eines Graphen reinterpretieren:

Graph-Interpretation:

Jeder abstrakte Wert (Wertnummer) ist eine Ecke.

Jede Ecke enthalt Operation oder Konstante.

Def.-Ben. Beziehungen sind Kanten (Datenukanten).

Umkehrung der Pfeile entspricht Datenabhangigkeiten.

Ablaufkante: Welchen Grundblock erreicht ein Sprung?

Zu welchem Grundblock gehort eine Operation?

Weitere Kantenarten spater

a := 1 b := 2 c := a + b d := c * a ...

1 2

+

*

c d

(12)

Implementierung: Firm

Firm ist eine moderne SSA-Zwischendarstellung in Graphform;

entstanden aus Diplomarbeiten, Dissertationen, Industriekooperationen des Lehrstuhls 1995-2006.

Ablauf, Datenu und Sequentialisierung von Operationen werden in einem Graphen dargestellt.

Firm ist ein Abhangigkeitsgraph, die Kantenrichtung ist also umgekehrt zur Datenurichtung.

Zur Unterscheidung der Konzepte sind die Kanten des Graphen typisiert, die Typen heien Modi.

Grundblocke sind auch Ecken, jede andere Ecke hat eine Grundblockecke als Vorganger (ermoglicht einheitlichen ADT)

Firm ist durch Angabe der Operationen (Ecken), Kantenmodi und der Signatur der Operationen deniert.

(13)

Beispiel: Grundblock- und SSA-Grundblockgraph

(3) c:=a+b (4) d:=c-a (1) a:=1 (2) b:=2

(5) d:=b*d

(6) d:=a+b (7) e:=e+1

(6) b:=a+b (7) e:=c-a (6) a:=b*d (7) b:=a-d

b2:=f(b1,b3) e2:=f(e1,e

5) c1:=a1+b2 d1:=c

1-a

1

a1:=1 b1:=2

d2:=f(d1,d4) e3:=f(e2,e

4) d3:=b2*d2

d4:=a

1+b

2

e4:=e

3+1

d5:=f(d

1,d

3) b3:=a1+b2 e5:=c

1-a

1

a2:=b

3*d

5

b4:=a2-d5

(14)

Inhalt

1 Einfuhrung { Motivation IdeeFIRM

2 Aufbau Theorie

3 Praxis Beispiel

Konstruktion aus dem AST

(15)

Wdh.: Dominanz und Dominatorbaume

Dominanz: X Y

Auf jedem Pfad vom Startblock S im Ablaufgraph kommt X vor Y . ist reexiv: X X .

Strikte Dominanz:

X > Y =) X Y ^ X 6= Y : Unmittelbare (direkte) Dominanz: ddom(X )

X = ddom(Y ) =) X > Y ^ :9Z : X > Z > Y :

Nach-Dominanz: X Y Auf jedem Pfad von Y zum Endblock E im Ablaufgraph kommt Y vor X .

Ubrige Denitionen fur Nach-Dominanz analog.

(16)

Wdh.: Dominanzgrenze und iterierte DG

Dominanzgrenze DG(X )

Menge von Blocken die gerade nicht mehr von X dominiert werden.

DG(X ) := fY j9P 2 Vor(Y ) : X P ^ :(X > Y )g:

Dominanzgrenze einer Menge M von Blocken DG(M) DG(M) := [

X 2M

DG(X )

Iterierte Dominanzgrenze DG+(M) minimaler Fixpunkt von:

DG0 := DG(M);

DGi+1 := DG(M [ DGi)

(17)

Plazierung der -Funktionen

Wo mussen die -Funktionen optimal plaziert werden?

SSA-Eigenschaft mu erfullt sein (nur eine Denition) Programm mu korrekt dargestellt sein

Minimale Anzahl von -Funktionen Satz Plazierung -Funktionen:

Sei P eine Prozedur in SSA Form mit minimaler Anzahl -Funktionen.

Seien X , Y Grundblocke in P mit einer Denition von v und Ablaufpfaden X !+ Z; Y !+ Z, wobei Z der erste gemeinsame GB dieser Pfade ist.

Dann enthalt Z eine -Funktion fur v, falls noch ein Gebrauch von v folgt.

Beweisidee

-Funktion kann nicht fruher eingesetzt werden.

-Funktion darf nicht in einen spateren Block Z0 eingesetzt werden:

Die Wege Z !+Z0 enthalten keine Moglichkeit, die ursprunglichen Denitionen von v zu dierenzieren.

(18)

Folgerungen

X bzw. Y mussen alle direkten Vorganger von Z dominieren, sonst gabe es einen Gebrauch von v ohne vorherige Denition.

Daher gilt Z 2 DG(X ; Y ).

Nebenbei: beim Einsetzen von -Funktionen werden alle

nicht-initialisierten, aber benutzten einfachen Variablen entdeckt!

Da die -Funktion in Z eine neue Denition von v ist, werden -Funktionen in den iterierten Dominanzgrenzen der ursprunglichen Denitionen eingesetzt. Hier werden weitere Denitionen von v, die erst in einem Block =2 DG(X ; Y ) hinzugenommen werden, vereinigt.

Achtung:

Dominanzgrenzen sind als Konstruktionsvorschrift weniger geeignet!

(19)

Inhalt

1 Einfuhrung { Motivation IdeeFIRM

2 Aufbau Theorie

3 Praxis Beispiel

Konstruktion aus dem AST

(20)

Wie konstruiert man SSA-Form

mehrere Konstruktionsverfahren moglich

im schlimmsten Fall enthalten alle Grundblocke -Funktionen fur alle Variable:

Aufwand O(n2), n = Anzahl Variable, nicht vermeidbar praktisch ist der Aufwand linear

Grundidee unseres Verfahrens (Click 1995):

wahrend eines Durchlaufs des Strukturbaums (AST) fuhre erweiterte Wertnumerierung durch:

bei nur einem Vorgangerblock Wertnummern ubernehmen

bei mehreren Vorgangern vorlauge -Funktionen 0(: : :) einsetzen Argumentliste der 0-Funktionen erweitern, wenn weitere Vorganger gefunden werden

am Ende 0-Funktionen in -Funktionen umwandeln oder streichen (wenn Wert nicht mehr benotigt)

(21)

SSA Aufbau mit Wertnumerierung

Ausgangspunkt:

AST oder Grundblockgraph mit Zuweisungen der Form x := (y; z);

x; y; z lokale Variable (also aliasfrei)

Anzahl in Prozedur verwendeter lokaler Variablen bekannt (n) Vorgehen:

Merke in jedem Grundblock aktuellen Wert jeder Variablen, d.h. den denierenden Ausdruck (Reihung der Groe n)

Bei Verwendung einer Variablen benutze Wertnummer dieses Ausdrucks Funktionen "hole Wertnummer\ HW(v), "merke Wertnummer\

MW (v; wn)

HW (v) fugt -Funktion ein, wenn Variable in Vorgangerblock deniert praktisch: -Funktionen werden nur generiert, wenn Wert noch lebendig!

Berechnen einer Wertnummer fur Ausdrucke t; t = (y; z) mit WN(t) wie gehabt

(22)

SSA Aufbau mit Wertnumerierung

Fur jede Zuweisung x := (y; z):

hole Wert fur y; z 7! HW (y); HW (z)

berechne Wertnummer WN(; y; z) fur (y; z) Falls Wertnummer neu, fuge Zuweisung

WN(; y; z) := (HW (y); HW (z)) in Grundblock ein.

Merke Wert fur x: MW (x; WN(; y; z))

Bemerkung: Aufruf von WN eliminiert gemeinsame Teilausdrucke!

(23)

SSA Aufbau mit Wertnumerierung

Vorgehen von HW (v):

Wenn in aktuellem Grundblock Wert w fur Variable v bereits gemerkt, verwende diesen

Wenn genau ein Vorgangerblock rufe HW (v) dort auf Wenn zwei (mehrere) Vorgangerblocke:

rufe HW (v) in jedem dieser Blocke auf ) liefert Werte w1; w2

fuge Zuweisung WN(; v; v) := (w1; w2; : : :) in aktuellem Grundblock ein.merke neuen Wert fur v : MW (v; WN(; v; v))

gebe neuen Wert als Ergebnis zuruck

(24)

SSA Aufbau und unbekannte Vorganger

Beobachtung: Beim Aufbau von Schleifen sind die Wertnummern aus den Vorgangerblocken u.U. nicht bekannt, HW (v) also (noch) nicht deniert Abhilfe: Zweistuges Vorgehen:

Markiere Blocke in SSA-Form

Wenn alle Vorganger in SSA-Form, berechne -Funktion wie gehabt.

Wenn Vorganger nicht in SSA-Form, fuge 0 ein und merke Operand des 0 zum spateren Fertigstellen (passiert nur an Dominanzgrenzen) Wenn Grundblock in SSA-Form gebracht, teste, ob schon vorhandene Nachfolger fertig gestellt werden konnen, und stelle sie fertig.

(25)

SSA Aufbau und unbekannte Vorganger

Beobachtungen:

Geht man beim Aufbau soweit moglich in Ablaufrichtung vor, sind eindeutige Vorganger immer vor ihren Nachfolgern in SSA-Form:

Dominatoren werden immer zuerst aufgebaut.

Bei Aufbau aus dem AST ist bekannt, wann alle Vorganger aufgebaut sind (auer bei expliziten Sprungen mit goto).

Folgerung:

Aufbau bei reduziblem Ablauf ezient!

Wenn Dominatoren bekannt, ist globale Eliminierung gemeinsamer Teilausdrucke ezient.

(26)

unbekannte Vorganger: Beispiel

a:=...

a:=a+1 ...:=a

a1:=...

a:=a+1 a2:=f'(a) ...:=a2

a1:=...

a3:=a

2+1 a4:=f(a1,a3) a2:=a4 ...:=a2 a1:=...

a3:=a

2+1

a1:=...

a3:=a

2+1 a1:=...

a:=a+1 ...:=a

fnicht berechen-

bar

a2:=f'(a) ...:=a2

a2:=f(a1,a3) ...:=a2 löst Fertig-

stellung aus

(27)

SSA Aufbau - Abbruchkriterien fur HW

Beobachtung:

Algorithmus HW kann rekursiv uber alle Vorgangerblocke iterieren.

Erreicht er den Startblock, wird ein undenierter Wert verwendet (Fehlermeldung: nicht initialisierte Variable)

Bei zyklischem Ablauf ohne Denitionen wird Endlosrekursion durch 0 unterbunden

(dies ist die zweite wichtige Aufgabe der 0-Funkionen!)

(28)

Abbruchkriterien fur HW : Beispiel

...:=a

a1:=...

a1:=...

a2:=f'(a) ...:=a2

aunbenutzt

a1:=...

a3:=f(a1,a2) a2:=a3 ...:=a2

a1:=...

a2:=f(a1,a2) ...:=a2

(29)

SSA Aufbau und unnotige -Funktionen

Beobachtung:

Es entstehen unnotige -Funktionen:

Die Operanden sind das Ergebnis der -Funktion

Da jede Schleife mindestens einen Vorganger auerhalb der Schleife hat, existiert mindestens ein sinnvoller Operand

Gibt es nur einen Operanden, so ersetze die -Funktion durch diesen.

(Bei nicht reduziblem Ablauf gibt es Kompli- kationen.)

a1:=...

a2:=a1 ...:=a

2

a1:=...

a2:=f(a1,a2) ...:=a2

(30)

Beispielprogramm und Grundblockgraph

(1) a:=1;

(2) b:=2;

while true { (3) c:=a+b;

(4) if (d=c-a)

(5) while (d=b*d) {

(6) d:=a+b;

(7) e:=e+1;

} (8) b:=a+b;

(9) if (e=c-a) break;

}

(10) a:=b*d;

(11) b:=a-d;

(3) c:=a+b (4) d:=c-a (1) a:=1 (2) b:=2

(5) d:=b*d

(6) d:=a+b (7) e:=e+1

(6) b:=a+b (7) e:=c-a (6) a:=b*d (7) b:=a-d

(31)

SSA Aufbau Block 1

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

(32)

SSA Aufbau Block 2

Holen der wn fur a erzeugt zuerst 0 fur a . . .

a2:=f'(a) c:=a2+b a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

(33)

SSA Aufbau Block 2

. . . dann fur b . . .

a2:=f'(a) b2:=f'(b) c:=a2+b

2

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

(34)

SSA Aufbau Block 2

. . . und schlielich eine wn fur c.

a2:=f'(a) b2:=f'(b) c1:=a

2+b

2

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

(35)

SSA Aufbau Block 2

Der Aufbau fur d :=

c a funktioniert wie normale Wertnume- rierung.

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c

1-a

2

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

(36)

SSA Aufbau Block 3

a1:=1 b1:=2

b3:=f'(b) d:=b3*d

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c

1-a

2

(37)

SSA Aufbau Block 3

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

b3:=f'(b) d2:=f'(d) d:=b3*d

2

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c1-a2

(38)

SSA Aufbau Block 3

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

b3:=f'(b) d2:=f'(d) d3:=b

3*d

2

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c

1-a

2

(39)

SSA Aufbau Block 4

Der Aufruf HW (a) in 4 fuhrt zu rekursi- vem Aufruf HW (a) in 3.

Dieser erzeugt in 3 eine neue 0-Funktion fur a.

a1:=1 b1:=2

d4:=a

3+b

3

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

b3:=f'(b) d2:=f'(d) a3:=f'(a) d3:=b3*d2

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c

1-a

2

(40)

SSA Aufbau Block 4

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2

GB1

GB5

GB6

GB4

GB3

d4:=a

3+b

3

e4:=e3+1 b3:=f'(b) d2:=f'(d) a3:=f'(a) e3:=f'(e) d3:=b

3*d

2

a2:=f'(a) b2:=f'(b) c1:=a2+b2 d1:=c

1-a

2

(41)

SSA Aufbau Block 4

Jetzt alle Vorganger von Block 3 in SSA Form: -Funktionen werden berechnet.

Fur e wird rekursiv eine 0-Funktion in Block 2 eingesetzt.

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d4:=a3+b3 e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=f'(a) b2:=f'(b) e2:=f'(e) c1:=a2+b2 d1:=c1-a2

(42)

SSA Aufbau Block 5

HW (a) in 5 uber- springt Kopien, ndet eindeutige Denition:

keine -Funktion notig.

a1:=1 b1:=2

b:=a2+b

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d4:=a3+b3 e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=f'(a) b2:=f'(b) e2:=f'(e) c1:=a2+b2 d1:=c1-a2

(43)

SSA Aufbau Block 5

a1:=1 b1:=2

b5:=a2+b2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d4:=a3+b3 e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=f'(a) b2:=f'(b) e2:=f'(e) c1:=a2+b2 d1:=c1-a2

(44)

SSA Aufbau Block 5

a1:=1 b1:=2

b5:=a2+b2 e5:=c1-a2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d4:=a3+b3 e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=f'(a) b2:=f'(b) e2:=f'(e) c1:=a2+b2 d1:=c1-a2

(45)

SSA Aufbau Block 5

Jetzt alle Vorganger von Block 2 in SSA Form: -Funktionen werden berechnet.

Algorithmus be- merkt:

e ist uninitialisiert!

Annahme: Wert e1

a1:=1 b1:=2

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

b5:=a2+b2 e5:=c1-a2 d4:=a3+b3

e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=a1 b2:=f(b1,b5) e2:=f(e1,e5) c1:=a2+b2 d1:=c1-a2

(46)

SSA Aufbau Block 6

Rekursiver Aufruf von HW (a) in 5 setzt komplette -Funktion d5 ein

a1:=1 b1:=2

a4:=b5*d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d

d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,d1) b5:=a2+b2 e5:=c1-a2 d4:=a3+b3

e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=a1 b2:=f(b1,b5) e2:=f(e1,e5) c1:=a2+b2 d1:=c1-a2

(47)

SSA Aufbau Block 6

a1:=1 b1:=2

a4:=b5*d5 b6:=a4-d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,d1) b5:=a2+b2 e5:=c1-a2 d4:=a3+b3

e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b3*d2

a2:=a1 b2:=f(b1,b5) e2:=f(e1,e5) c1:=a2+b2 d1:=c1-a2

(48)

Vereinfachungen: Kopienfortpanzung

a1:=1 b1:=2

a4:=b5*d5 b6:=a4-d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,d1) b5:=a1+b2 e5:=c1-a1 d4:=a1+b2

e4:=e3+1 b3:=b2 d2:=f(d1,d4) a3:=a2 e3:=f(e2,e4) d3:=b2*d2

a2:=a1 b2:=f(b1,b5) e2:=f(e1,e5) c1:=a1+b2 d1:=c1-a1

(49)

Vereinfachungen: Konstantenfortpanzung

a1:=1 b1:=2

a4:=b5*d5 b6:=a4-d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,d1) b5:=1+b2 e5:=c1-1 d4:=1+b2

e4:=e3+1 b3:=2 d2:=f(d1,d4) a3:=1 e3:=f(e2,e4) d3:=b2*d2

a2:=1 b2:=f(2,b5) e2:=f(e1,e5) c1:=1+b2 d1:=c1-1

(50)

Vereinfachungen: Toten Code eliminieren

a4:=b5*d5 b6:=a4-d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,d1) b5:=1+b2 e5:=c1-1 d4:=1+b2

e4:=e3+1 d2:=f(d1,d4) e3:=f(e2,e4) d3:=b2*d2

b2:=f(2,b5) e2:=f(e1,e5) c1:=1+b2 d1:=c1-1

(51)

Weitere Vereinfachungen

Gemeinsame Teilausdrucke Reassoziation konstante Ausdrucke auswerten Kopien fortschreiben Toten Code

eliminieren a

4:=c1*d5 b6:=a4-d5

c:=a+b d:=c-a a:=1 b:=2

d:=b*d d:=a+b e:=e+1

b:=a+b e:=c-a a:=b*d b:=a-d

GB2 GB1

GB5

GB6 GB4

GB3

d5:=f(d3,b2)

e4:=e3+1 d2:=f(b2,c1) e3:=f(e2,e4) d3:=b2*d2

b2:=f(2,c1) e2:=f(e1,d1) c1:=1+b2 d1:=b2

(52)

SSA-Aufbau aus dem AST

Ein Links-Rechts Baumdurchlauf:

Halte aktuellen Grundblock in globaler Variablen Ausdrucke: Generiere SSA fur aktuellen Grundblock,

Zwischenergebnisse werden nur einmal verwendet, daher kein Holen/Merken von Wertnummern notig!

Anweisungen:

generiere Grundblocke

generiere Code fur Grundblocke

Fuge Ablauf der Grundblocke zusammen Schliee SSA Aufbau fur die Grundblocke ab

Prozeduraufrufe sind in diesem Zusammenhang Ausdrucke.

Bei Sprungen: Schliee Grundblocke mit Sprungmarken in einem zweiten Baumdurchlauf ab.

(53)

Aufbau aus dem AST, Beispiel while

Schliee SSA Aufbau fur aktuellen Block (V ) ab Erzeuge neuen Block (B) fur Schleifenbedingung Fuge Ablauf V ! B ein

Erzeuge SSA-Code fur Bedingung (rekursiver Abstieg) Erzeuge neuen aktuellen Block (R) fur Schleifenrumpf, merke Block B

Erzeuge SSA-Code fur Rumpf (rekursiver Abstieg) Schliee SSA-Aufbau fur aktuellen Block (R0) ab Fuge Ablauf R0! B ein

Schliee SSA-Aufbau fur Block B ab Erzeuge neuen Block (F ) fur Fortsetzung Fuge Ablauf B ! F ein

Rekursion kehrt zu Vater zuruck und generiert weiteren Code in Block F

V Vater while

Rumpf Bed.

AST Ausschnitt:

generierter Ablauf:

B

F R

R'

...

(54)

Zusammenfassung

SSA bedeutet: statt Variablen dynamische Konstanten -Funktionen notig bei Ablaufzusammenu

-Funktionen werden an Dominanzgrenzen plaziert Darstellung als Datenugraph

Ermoglicht eziente Formulierung intraprozeduraler Optimierungen die auf Datenuanalysen aufbauen

Aufbau der -Funktionen: nur, wenn Wert verwendet;

rekursiv fur Vorgangerblocke

Endlosrekursionen vermeiden und Handhabung nicht fertiger Vorgangerblocke mit '-Funktionen

(55)

Optimierungen auf

SSA­Form

(56)

Inhalt

4 Einleitung

5 Grundlegende Transformationen Normalisierung

Konstantenfaltung Operatorvereinfachung

6 Eliminieren gemeinsamer Teilausdrucke

7 Eliminieren partieller Redundanzen

8 Weitere Optimierungen Speicheroptimierungen

Eliminieren unnotiger Berechnungen Oener Einbau von Prozeduren

(57)

Optimierungen (nicht notwendigerweise auf SSA)

Fortschreiben v. Konstanten u. Kopien, intra- und interprozedural Konstanten Falten (Auswerten konstanter Ausdrucke)

Beseitigen von totem/unerreichbarem Code

Operatorvereinfachung (Beseitigen von Induktionsvariablen) Verschieben von schleifeninvariantem Code

Eliminieren partieller Redundanzen Codeverschiebung, -plazierung

Spezialisieren und Klonen von Grundblocken und Prozeduren Eliminieren Indexgrenzenprufung

Oener Einbau von Prozeduren Ablauf-Vereinfachung

Ausrollen/Verschmelzen/Teilen von Schleifen; Software-Flieband Umordnen von Reihungen und -zugrien (D-Cache-Optimierungen) Vorladen von Daten (prefetching)

Optimieren von Blatt-Prozeduren

Beseitigen von End-Aufrufen und Endrekursionen Registerzuteilung

(58)

Stand der Forschung

Oenes Problem:

Welche Optimierungen auszuwahlen?

Optimale Reihenfolge der Optimierungen?

Es gibt keineaktuellen wissenschaftliche Aussagen zu einer solchen Taxonomie!

Faustregel:

Abgesehen von Cacheoptimierung und Operatorvereinfachung bringt die 1. durchgefuhrte Optimierung 15% alle weiteren < 5%.

Das ist weitgehend unabhangig von der Wahl der Optimierungen und ihrer Reihenfolge.

Viele Optimierungen bewirken ahnliches bzw. sind ineinander enthalten.

Bei numerischen Programmen bringt Operatorvereinfachung Faktoren

> 2; Cacheoptimierung zwischen 2 und 5.

(59)

Das Vollbeschaftigungstheorem fur Ubersetzerbauer

Satz (Rice, 1953): Zu jedem algorithmisch arbeitenden Ubersetzer U gibt es einen Ubersetzer U0, der fur bestimmte Programme kurzeren Code erzeugt.

Korollar (Vollbeschaftigungstheorem fur Ubersetzerbauer): Zu jedem optimierenden Ubersetzer gibt es einen besseren.

Beweis des Satzes:

Annahme: es gibt einen Ubersetzer U, der jedes Programm mit algorithmischen Methoden in das absolut kurzeste Programm Opt() mit gleichem Ein-/Ausgabeverhalten ubersetzt. Sei ein nicht haltendes Programm ohne E/A. Dann wird von U ubersetzt in:

Opt() 7! m : goto m

Um zu prufen, ob nicht halt, mu man nur Opt() berechnen und das Ergebnis inspizieren. Damit lost man also das Halteproblem. Da das Halteproblem unentscheidbar ist, kann es also ein solches U nicht geben.

(60)

Prinzip von Kostenmodellen bei Optimierungen

Kostenmodell: Laufzeit eines Programms, eventuell kombiniert mit Energieverbrauch

Speicherbedarf kann in Laufzeit umgerechnet werden

daher ist oft auch Verkurzung des Codes Laufzeitoptimierung Statisch nur konservativ abschatzbar wegen Unkenntnis der

Anzahl Wiederholungen von Schleifen Sprungbedingungen

Selbst bei linearem Code nicht statisch bekannt Befehlsanordnung durch Prozessor

Puerspeicher (Cache): Zugrie auf Speicher sind datenabhangig Fliebandverarbeitung im Prozessor

Laufzeit gewohnlich 6= Summe der Laufzeiten der einzelnen Befehle!

(61)

Optimierungen auf SSA

Optimierungen

sind auf SSA mit wenig Analyseaufwand durchfuhrbar konnen oft mit SSA-Aufbau verschrankt werden

konnen von weiteren Programmanalysen protieren (mehr dazu in folgenden Vorlesungen)

Zwei Arten von Transformationen:

Normalisierende Transformationen

bringen SSA-Graph in denierte Form, um unterschiedlich geschriebene Ausdrucke (syntaktisch) vergleichbar zu machen

ermoglichen optimierende Transformationen

nutzen z.B. algebraische Identitaten (Aquivalenzoperationen) Assoziativgesetz

Distributivgesetz sind eingeschrankt durch

Auswertungsreihenfolge (Java) Ausnahmen (Java, Eiel)

Gleitpunktarithmetik (nicht assoziativ, nicht distributiv)

Optimierende Transformationen

(62)

Betrachtete Optimierungen

Operatorvereinfachung(strength reduction)

Idee:Ersetze teuere Operationen durch billigere, semantisch

aquivalente Operationen

Hauptanwendung:Vereinfache Multiplikationen mit Indexvariable in Schleifen zu Additionen (Induktionsanalyse, Lineare

Adrefortschaltung)

Eliminieren gemeinsamer Teilausdrucke (GTE) (common subexpression elimination, CSE)

Idee:Eliminiere Mehrfachberechnungen von identischen Werten Hauptanwendung:Adrerechnung

Eliminieren partieller Redundanzen (EPR) (partial redundancy elimination, PRE)

schwachere Varianten:Code-Plazierung, Code-Verschiebung Ziel:Vermeide Berechnung von Werten die nicht auf allen Ausfuhrungspfaden gebraucht werden

Anwendung:Verschieben von schleifeninvarianten Berechnungen aus Schleifen

(63)

Inhalt

4 Einleitung

5 Grundlegende Transformationen Normalisierung

Konstantenfaltung Operatorvereinfachung

6 Eliminieren gemeinsamer Teilausdrucke

7 Eliminieren partieller Redundanzen

8 Weitere Optimierungen Speicheroptimierungen

Eliminieren unnotiger Berechnungen Oener Einbau von Prozeduren

(64)

Normalisierung - Kommutativgesetz

Ziel der Normalisierung: arithmetische Ausdrucke vergleichbar machen, um gemeinsame Teilausdrucke zu nden (Problem: keine kanonische Normalform arithmetischer Ausdrucke)

Deniere Ordnung B auf SSA-Knoten (z. B. Reihenfolge des Aufbaus) Ordne kommutative Operation (a; b) um, so da B(a) > B(b).

add add

b a a b

(65)

Normalisierung - Distributivgesetz

Deniere Ordnung B0 auf Operationen

Ordne Operationen 1 2 um, so da B0(1) > B0(2)

add mult

x y

x c

mult c mult

y

add

(66)

Normalisierung - Vergleiche andern

Wenn die Ergebnisse der Operationen (x; c) und (c; y) nur zum Vergleichen benotigt werden, konnen die Operationen u.U. wegfallen.

x

x c

= y y

=

(67)

Optimierungen - Konstantenfaltung I

Berechne (Teil-)Ausdrucke mit konstanten Operanden Beachte Arithmetik der Sprache

Beachte Arithmetik der Zielmaschine

Zu faltende Konstanten werden zu 80 bis 90% bei der Adrerechnung erzeugt.

const y const x

t const

(x t y)

Referenzen

ÄHNLICHE DOKUMENTE

Zeigen Sie, dass die Palais-Smale Bedingung nicht erf¨ ullt

6) Daß die Differenz von nc und 'E durch die Verhältnisse von Haupt- und Nebenton bedingt seien (Brockelmann a. O.), hat an keiner Parallele eine StUtze. Selbstverständlich konnte

[r]

Oliver Schn¨ urer, Universit¨ at Konstanz Sommersemester 2013 Matthias Makowski.. Ubungen zur Vorlesung Partielle Differentialgleichungen 1a ¨

Oliver Schn¨ urer, Universit¨ at Konstanz Sommersemester 2013 Matthias Makowski. Ubungen zur Vorlesung Partielle Differentialgleichungen 1a ¨

[r]

Das bedeutet, dass Du selbst dann den Wachs- tumsfaktor q berechnen kannst, wenn Du den absoluten Bestand ¨ uberhaupt nicht kennst, da sich beim Aufl¨ osen der Gleichung B ( 0 )

Bei den meisten Regularit¨ atsaussagen beschr¨ ankt man sich im Beweis auf den Nach- weis der gew¨ unschten Aussage bez¨ uglich der Einheitskugel. Wie man den allgemeinen Fall dann