7

Wie bestimmen moderne Optimierungscompiler, wann bestimmte Optimierungen wie Loop-Abrollung und Code-Inlining angewendet werden sollen?Wie bestimmen moderne optimierte Compiler, wann sie optimiert werden sollen?

Da sich beide auf das Caching auswirken, führt das naive Inlining von Funktionen mit weniger als X Zeilen oder einer anderen einfachen Heuristik wahrscheinlich zu schlechterem Code. Wie gehen moderne Compiler damit um?

Ich habe eine harte Zeit, Informationen darüber zu finden (vor allem Informationen, die einigermaßen einfach zu verstehen ..), über das Beste, was ich finden konnte, ist die wikipedia article. Alle Details, Links zu Büchern/Artikeln/Papieren werden sehr geschätzt!

EDIT: Da die Antworten hauptsächlich über die beiden erwähnten Optimierungen (Inlining und Loop-Enrolling) sprechen, wollte ich nur klarstellen, dass ich an allen Compiler-Optimierungen interessiert bin, nicht nur an diesen beiden. Ich interessiere mich auch mehr für die Optimierungen, die während der Kompilierung vor der Zeit durchgeführt werden können, obwohl die JIT-Optimierung von Interesse ist (wenn auch in etwas geringerem Maße).

Danke!

Antwort

5

In der Regel sowieso so naiv und hoffe, es ist eine Verbesserung.

Aus diesem Grund ist die Just-in-Time-Compilation eine solch erfolgreiche Strategie. Sammeln Sie Statistiken und optimieren Sie sie für den Normalfall.

Referenzen:

+0

JIT hat nicht immer die Zeit für einige massive Optimierungen, und Codepaths variieren manchmal massiv von den Daten, so dass profilgesteuerte Optimierungen nicht immer der richtige Pfad sind. –

1

Sie können ein Spiral Projekt suchen.

Darüber hinaus ist Optimierung eine schwierige Sache, generisch zu tun. Dies ist teilweise der Grund, warum es so viele Optionen für den gcc-Compiler gibt. Wenn Sie etwas über Cache und Seiten wissen, können Sie einige Dinge manuell erledigen und verlangen, dass andere über den Compiler ausgeführt werden, aber keine zwei Maschinen sind gleich, so dass der Ansatz adhoc sein muss.

1

Gute Frage. Sie fragen nach sogenannten spekulativen Optimierungen.

Dynamische Compiler verwenden sowohl statische Heuristiken als auch Profilinformationen. Statische Compiler verwenden Heuristiken und (Offline-) Profilinformationen. Letzteres wird oft als PGO (Profile Guided Optimizations) bezeichnet.

Es gibt viele Artikel zu Inlining-Richtlinien. Die umfassendste

ist

An Empirical Study of Method Inlining for a Java Just-In-Time Compiler

Es auch Verweise auf verwandte Arbeiten und scharfe Kritik an einigen der betrachteten Artikel enthält (gerechtfertigt).

Im Allgemeinen versuchen hochmoderne Compiler Wirkungsanalyse zu verwenden, um mögliche Auswirkungen von spekulativen Optimierungen abzuschätzen, bevor sie angewendet werden.

P.S. Loop-Abrolling ist ein altes klassisches Zeug, das nur für einige enge Loops hilft, die nur Nummern-Knack-Ops ausführen (keine Aufrufe und so weiter). Method Inlining ist eine viel wichtigere Optimierung in den modernen Compilern.

Verwandte Themen