PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compileroptionen



flammenflitzer
08.12.2005, 15:18
Hallo
Ich habe für mich, zum besseren Verständnis einiges über Compileroptionen zusammengetragen. Allerdings sind da noch einige Fragen offen. Vielleicht ist auch etwas nicht richtig .
Vielleicht kann mir da jemand helfen?

GCC 3.4

CFLAGS="-O3 -march=k8 -funroll-all-loops -funit-at-a-time -fpeel-loops -ftracer -funswitch-loops -fomit-frame-pointer -pipe"
Das heißt: -O3 alle Opimierungen eingeschaltet, auch die, die für den Geschwindigkeitsgewinn mehr Speicherplatz benötigen.
-march=k8 Der Compilercode wird für AMD Athlon(tm) 64 bit Prozessor optimiert.
-funroll-all-loops Alle Schleifen, die zur Übersetzungszeit eine feste Anzahl von Durchläufen besitzen,werden
in einzelne Codezeilen aufgelöst.
-funit-at-a-time Jedes File wird erst geparsed und später optimiert. Bei der späteren Optimierung werden
z.B. nicht genutzte Funktionen entfernt.
-fpeel-loops ???
-ftracer ???
-funswitch-loops ???
-fomit-frame-pointer ???
-pipe Die Kommunikation zwischen einzelnen Teilen des Compilers läuft über pipes statt über temporäre Dateien.


-O -On Optionen für Optimierungen
Sie kontrollieren das Niveau der Codeoptimierung. U.a. gibt es
-O Optimierung eingeschaltet.
Diese Option muß benutzt werden, wenn Sie nur eins der Flags zuschalten wollen, da diese selbst die Einschaltung der
Optimierung nicht vornehmen. Die Option -O alleine entspricht demselben Aufruf, wie die Verwendung der -O1-Option.Mit -O0 wird
keinerlei Codeoptimierung durchgeführt. Diese Option ist auch die Standardeinstellung des GCC. Dafür versucht der GCC Code zu
erstellen, der einfacher zum Debuggen ist.
-O1 Opimierungen eingeschaltet. Optimierungen kosten mehr Zeit und deutlich mehr Speicher als Compilation ohne Optimierung. Ohne Op-
timierung versucht der Compiler, die Kosten der Compilation so niedrig wie möglich zu halten und das Debugging zu vereinfachen.
Deshalb sind Statements ohne Optimierung auch unabhängig voneinander. Man kann also zwischen zwei Anweisungen einen Breakpoint
setzen, den Wert einer Variable ändern und fortfahren. Mit Optimierung wird diese Möglichkeit stark eingeschränkt, zum Beispiel weil
diese Variable wegoptimiert werden könnte.
-O2 Starke Optimierung einschalten. Fast alle Opimierungen eingeschaltet. Alle heißt alle, die nicht Geschwindigkeitsgewinn für mehr Spei-
cherplatzbedarf versprechen. Mit -O1 versucht der Compiler die Größe des zu erstellenden Codes zu reduzieren und eventuell auch die
Ausführgeschwindigkeit der Anwendung zu erhöhen. Mit -O2 wird mittels weiterer Flags versucht, die Option von -O1 nochmals erheblich
zu steigern.
-O3 Alles, was -O2 kann und -finline-functions wird eingeschaltet. (-finline-functions tut genau das, was bei -O2 angeführt wurde. Es bietet
einen Geschwindigkeitsvorteil, benötigt aber mehr Speicherplatz. Alle einfachen Funktionen werden (wie bei einem Makro) direkt in ihren
Aufrufer integriert. Was einfach ist, entscheidet der Compiler anhand von Heuristiken ( Übersetzt: Erkenntnistheorie . Die Heuristik
beschäftigt sich mit der theoretischen Problembehandlung, durch bisher gewonnene Erfahrungen, reproduzierbare Fehler erkennen und
diese im Voraus vermeiden zu können.). Wird eine Funktion überall inline gerufen und ist static deklariert , kann die Definition wegoptimiert
werden.) Aktiviert nur noch folgende Optimierungen zusätzlich zu -O2:
-finline-functions, -fweb, -frename-registers
(-finline-functions: ??????????????????
(-fweb: ??????????????????
(-frename-registers: ??????????????????
-O4 ??????????????????
-O5 ??????????????????
-O6 stellt die höchste Stufe dar.
-Os
-march=
Der Parameter "-march=i686" sagt dem Compiler beispilsweise, daß er den Code für Pentium II optimieren soll.Allerdings läuft
dann das Programm nicht mehr auf einem normalen Pentium. Äquivalent wäre auch "-mpentiumpro".Möchte man bereits direkt
beim Compilieren von dem zusätzlichen Befehlssatz seines Prozessors profitieren, so hilft der Parameter "-mcpu=i686" sicher weiter.
march=k8 ist für für AMD's x86_64.
Mögliche march flag: i386, i486, i586, i686, pentium, pentium-mmx, pentiumpro, pentium2, pentium3, pentium4, k6, k6-2, k6-3, k8,
athlon, athlon-tbird, athlon-4, athlon-xp, athlon-mp, winchip-c6, winchip2, c3
-finline-functions
Alle einfachen Funktionen werden (wie bei einem Makro) direkt in ihren Aufrufer integriert. Was einfach ist, entscheidet der Compiler anhand von Heuristiken
-funroll-all-loops
Mit dem Flag -funroll-loops werden alle Schleifen, die zur Übersetzungszeit eine feste Anzahl von Durchläufen besitzen, in einzelne
Codezeilen aufgelöst. Dass bei vielen Schleifendurchläufen die Objektdatei dadurch größer wird, sollte klar sein - was aus der erwünschten
Optimierung wieder ein Loch machen kann.
-funit-at-a-time
Mit -funit-at-a-time wird jedes File erst geparsed und später optimiert. Bei der späteren Optimierung werden z.B. nicht genutzte Funktionen entfernt.
-fpeel-loops ??????????????????
-ftracer ??????????????????
-funswitch-loops ??????????????????
-fomit-frame-pointer ??????????????????
-pipe
Die Kommunikation zwischen einzelnen Teilen des Compilers läuft über pipes statt über temporäre Dateien. (Auch wenn es auf den ersten Blick so aussieht, bringt diese Option meist keinen Performancegewinn, da sowohl die Pipes als auch die temporären Dateien im Speicher gehalten werden.)
This flag tells gcc to communicate to itself through something called a "named pipe." While pipes are faster than the temporary files otherwise used, they use more RAM. Enable at your own risk if you have an exceedingly small amount of ram (Works fine at 24 megabytes).
-ffast-math
Mit der Option -ffast-math wird versucht, eine Floating-Point-Optimierung durchzuführen. Zwar verletzt diese Option den ANSI- als auch den IEEE-Standard, aber die so erzeugten Resultate können erheblich schneller sein - leider auch erheblich fehleranfälliger, daher müssen Sie den Code sorgfältig testen. Der Compilerschalter "-ffast-math" sorgt dafür, daß alle mathematischen Berechnungen schneller durchgeführt werden. Allerdings wird dann zusammen mit "-fexpensive-optimizations" meistens das Programm etwas größer.
-finline_functions
Die Option -finline_functions fügt bei einfachen Funktionen, anstelle eines Funktionsaufrufs, ein Inlining ein (was auch in C/C++ mit dem Schüsselwort inline erreicht wird (C erst seit dem C99-Standard)). Der Compiler entscheidet natürlich weiterhin selbst, welche Funktion er dafür verwendet und welche nicht. Meistens erhalten die kleineren Funktionen den Zuschlag.
-fno-inline
Mit -fno-inline wird das Inlining unterbunden - auch in den Zeilen, die im Code explizit mit inline gekennzeichnet sind.
Inline oder Inlining ( Quelle )
C und C++ erlauben es, eine Funktion als inline zu deklarieren. Das gilt auch für Memberfunktionen, d.h. Methoden.
Die inline-Deklaration ist eine reine Optimierungsmaßnahme, auf die man in erster Näherung gut verzichten kann. Bei
großen Programmen mit vielen nichtvirtuellen Methoden lohnt sich die inline-Optimierung in der Regel. Virtuelle Methoden
kann man nicht per inline-Deklaration optimieren. Sie sorgt bei kurzen Funktionen häufig für kürzeren und schnelleren Code.
Der Compiler erzeugt bei inline-Funktionen keinen Funktionsaufruf, sondern setzt den Binärcode des Funktionskörpers direkt in
die aufrufende Funktion an die Stelle des Aufrufs ein. Das führt dann zu weniger Code, wenn der Funktionskörper kürzer ist als
der Code von Funktionsaufruf und Rücksprung aus der Funktion. Der Code für Aufruf und Rücksprung hat schon eine gewisse
Länge, insbesondere bei Parameterübergabe. Dabei muß man berücksichtigen, daß bei Memberfunktionen stets der this-Parameter
übergeben wird. Außerdem kann der Compiler bei Verwendung von inline-Funktionen die Verwaltung der Register des Prozessors,
auf denen die unmittelbar gebrauchten Adressen z.B. lokaler Variabler gehalten werden, besser optimieren. Als Daumenregel kann
man sagen, daß Funktionen mit ein bis drei Wertzuweisungen sich sicher als inline-Funktionen eignen. Im Zweifelsfall muß man es
ausprobieren und schauen, ob die Länge des Codes sich verringert hat. Wenn ja, läuft das Programm auch mit Sicherheit schneller.

DennisM
08.12.2005, 15:48
-ftracer for details on trace formation.

This mode should produce faster but significantly longer programs.
Also without "-fbranch-probabilities" the traces constructed may
not match the reality and hurt the performance. This only makes
sense when scheduling after register allocation, i.e. with -fsched-
ule-insns2 or at -O2 or higher.



-fpeel-loops
Peels the loops for that there is enough information that they do
not roll much (from profile feedback). It also turns on complete
loop peeling (i.e. complete removal of loops with small constant
number of iterations).



-funswitch-loops
Move branches with loop invariant conditions out of the loop, with
duplicates of the loop on both branches (modified according to
result of the condition).



-fomit-frame-pointer
Don't keep the frame pointer in a register for functions that don't
need one. This avoids the instructions to save, set up and restore
frame pointers; it also makes an extra register available in many
functions. It also makes debugging impossible on some machines.

On some machines, such as the VAX, this flag has no effect, because
the standard calling sequence automatically handles the frame
pointer and nothing is saved by pretending it doesn't exist. The
machine-description macro "FRAME_POINTER_REQUIRED" controls whether
a target machine supports this flag.



-finline-functions
Integrate all simple functions into their callers. The compiler
heuristically decides which functions are simple enough to be worth
integrating in this way.

If all calls to a given function are integrated, and the function
is declared "static", then the function is normally not output as
assembler code in its own right.

Enabled at level -O3.



-funswitch-loops
Move branches with loop invariant conditions out of the loop, with
duplicates of the loop on both branches (modified according to
result of the condition).



-fweb
Constructs webs as commonly used for register allocation purposes
and assign each web individual pseudo register. This allows the
register allocation pass to operate on pseudos directly, but also
strengthens several other optimization passes, such as CSE, loop
optimizer and trivial dead code remover. It can, however, make
debugging impossible, since variables will no longer stay in a
``home register''.

Enabled at levels -O3.



-frename-registers
Attempt to avoid false dependencies in scheduled code by making use
of registers left over after register allocation. This optimiza-
tion will most benefit processors with lots of registers. It can,
however, make debugging impossible, since variables will no longer
stay in a ``home register''.




-O4 ??????????????????
-O5 ??????????????????


Alles über -O2 ist bloated, und bringt eher den gegenteiligen Effekt ;)

siehe man gcc

Mein Tipp, lass die "Optimierungen" weg, die bringen eh nichts, -march=CPU -O2 -pipe reicht völlig.

MFG

Dennis

flammenflitzer
08.12.2005, 16:45
Danke
Muß ich mir mal von meiner Schwiegertochter übersetzten lassen.

DennisM
08.12.2005, 17:00
Muß ich mir mal von meiner Schwiegertochter übersetzten lassen.

Hehe ;)

http://translate.lycoszone.com/

MFG

Dennis