Compileroptionen

Dieses Thema: "Compileroptionen" im Forum "Programmieren allgemein" wurde erstellt von flammenflitzer, 08.12.2005.

  1. #1 flammenflitzer, 08.12.2005
    flammenflitzer

    flammenflitzer Routinier

    Dabei seit:
    26.12.2003
    Beiträge:
    388
    Zustimmungen:
    0
    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?
    Code:
    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.
    
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 DennisM, 08.12.2005
    Zuletzt bearbeitet: 08.12.2005
    DennisM

    DennisM Moderator u. Newsposter

    Dabei seit:
    08.05.2004
    Beiträge:
    4.883
    Zustimmungen:
    0
    Ort:
    GER/NRW/Essen
    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
     
  4. #3 flammenflitzer, 08.12.2005
    flammenflitzer

    flammenflitzer Routinier

    Dabei seit:
    26.12.2003
    Beiträge:
    388
    Zustimmungen:
    0
    Danke
    Muß ich mir mal von meiner Schwiegertochter übersetzten lassen.
     
  5. #4 DennisM, 08.12.2005
    DennisM

    DennisM Moderator u. Newsposter

    Dabei seit:
    08.05.2004
    Beiträge:
    4.883
    Zustimmungen:
    0
    Ort:
    GER/NRW/Essen
    Hehe ;)

    http://translate.lycoszone.com/

    MFG

    Dennis
     
Thema:

Compileroptionen

Die Seite wird geladen...

Compileroptionen - Ähnliche Themen

  1. GCC Compileroptionen

    GCC Compileroptionen: Als CLAGS werden bei Gentoo üblicherweise -march=xxx -02 angegeben. Welche Compileroptionen erhöhen die Ausführungsgeschwindigleit auf das...