PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compileroptionen



flammenflitzer
08.12.05, 14:19
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.

bluesurfer
08.12.05, 14:28
falls du gentoo benutzt -> /etc/make.conf.example lesen ;)

traffic
08.12.05, 17:43
man gcc
Wenn es irgendwo steht, dann da.

Und wenn einzelne Optionen doch nicht dokumentiert sein sollten oder man die Dokumentation nicht versteht, tut es ganz bestimmt nicht weh, die Option einfach nicht zu benutzen.

Falls Du man pages zu unbequem zum lesen finden solltest:

man -t gcc > /tmp/gcc.ps && ps2pdf /tmp/gcc.ps

bluesurfer
09.12.05, 10:56
nett, dass man aus man-pages pdfs machen kann wusste ich noch ned :)