Optimierung in GCC

8

Ich habe zwei Fragen:

(1) Ich habe irgendwo gelernt, dass -O3 bei GCC nicht empfohlen wird, weil

  

Die Optimierungsstufe -O3 kann die Geschwindigkeit der resultierenden ausführbaren Datei erhöhen, sie kann jedoch auch ihre Größe erhöhen. Unter Umständen, bei denen diese Optimierungen nicht günstig sind, könnte diese Option ein Programm verlangsamen. Tatsächlich sollte es nicht systemweit mit gcc 4.x verwendet werden. Das Verhalten von gcc hat sich seit Version 3.x erheblich geändert. In 3.x wurde gezeigt, dass -O3 zu geringfügig schnelleren Ausführungszeiten über -O2 führt, dies ist jedoch mit gcc 4.x nicht mehr der Fall. Das Kompilieren all Ihrer Pakete mit -O3 führt zu größeren Binaries, die mehr Speicher benötigen, und erhöht signifikant die Wahrscheinlichkeit eines Kompilierungsfehlers oder eines unerwarteten Programmverhaltens (einschließlich Fehlern). Die Nachteile überwiegen die Vorteile; Erinnere dich an das Prinzip abnehmender Erträge. Die Verwendung von -O3 wird für gcc 4.x nicht empfohlen.

Angenommen, ich besitze eine Workstation (Kubuntu9.04), die 128 GB Arbeitsspeicher und 24 Kerne hat und von vielen Benutzern gemeinsam genutzt wird, von denen einige intensive Programme mit 60 GB Speicher ausführen können. Ist -O2 eine bessere Wahl für mich als -O3?

(2) Ich habe auch gelernt, dass bei einem unerwarteten Absturz eines laufenden Programms jede Debugging-Information besser ist als keine, weshalb die Verwendung von -g für optimierte Programme sowohl für die Entwicklung als auch für die Bereitstellung empfohlen wird. Aber wenn es mit -gdb3 zusammen mit -O2 oder -O3 kompiliert wird, wird es die Geschwindigkeit der Ausführung verlangsamen? Angenommen, ich benutze immer noch dieselbe Workstation.

    
Tim 02.09.2009, 16:23
quelle

6 Antworten

6
  1. Die only Methode, um sicher zu sein, besteht darin, Ihre Anwendung mit -O2 und -O3 zu vergleichen. Außerdem gibt es einige individuelle Optimierungsoptionen, die -O3 beinhaltet und Sie können individuell ein- und ausschalten. In Bezug auf die Warnung vor größeren Binärdateien ist zu beachten, dass das Vergleichen ausführbarer Dateigrößen, die mit -O2 und -O3 kompiliert wurden, hier nicht viel bringt, da hier die Größe der kleinen kritischen internen Schleifen am wichtigsten ist. Sie müssen wirklich benchmarken.

  2. Es wird zu einer größeren ausführbaren Datei führen, aber es sollte keine messbare Verlangsamung geben.

Laurynas Biveinis 02.09.2009, 16:30
quelle
4

Probieren Sie es aus Sie können selten genaue Angaben über Geschwindigkeit und Optimierung ohne Daten machen.

ps. Dies wird Ihnen auch sagen, ob es die Mühe wert ist. Wie viele Millisekunden, die in einer Funktion gespeichert wurden, die einmalig beim Start verwendet wird, sind sinnvoll?

    
Martin Beckett 02.09.2009 16:27
quelle
4

Zunächst scheint es, dass das Compiler-Team im Wesentlichen zugibt, dass -O3 nicht zuverlässig ist. Es scheint, als würden sie sagen: probiere -O3 auf deinen kritischen Schleifen oder kritischen Modulen aus, oder dein Lattice QCD Programm, aber es ist nicht zuverlässig genug für den Aufbau des gesamten Systems oder der Bibliothek.

Zweitens besteht das Problem, dass der Code größer wird (Inline-Funktionen und andere Dinge), nicht nur darin, dass er mehr Speicher benötigt. Selbst wenn Sie mehr RAM haben, kann es Sie verlangsamen. Dies liegt daran, je schneller der CPU-Chip wird, desto mehr tut es weh, zum DRAM gehen zu müssen. Sie sagen, dass einige Programme mit den zusätzlichen Routineaufrufen und nicht explodierten Zweigen (oder was immer O3 durch größere Dinge ersetzt) ​​schneller laufen, weil sie ohne O3 immer noch in den Cache passen, und das ist ein größerer Gewinn als die O3-Transformationen.

>

Bei dem anderen Thema würde ich normalerweise nichts mit -g erstellen, wenn ich nicht gerade daran arbeite.

    
DigitalRoss 02.09.2009 16:41
quelle
3

-g und / oder -ggdb fügt der ausführbaren Datei nur Debugsymbole hinzu. Es macht die ausführbare Datei größer, aber dieser Teil wird nicht in den Speicher geladen (außer wenn in einem Debugger oder ähnlichem ausgeführt).

Was die Leistung von -O2 und -O3 am besten angeht, gibt es keine Wunderwaffe. Sie müssen es für Ihr spezielles Programm messen / profilieren.

    
nos 02.09.2009 16:30
quelle
3

Nach meiner Erfahrung habe ich herausgefunden, dass GCC keine optimale Assemblierung mit O2 und O3 erzeugt. Der beste Weg ist, spezifische Optimierungs-Flags anzuwenden, die Sie hier finden können, da dort Code besser als -O2 und -O3 erzeugt wird sind Flags, die Sie nicht in -O2 und -O3 finden können, und sie werden für Ihren schnelleren Code nützlich sein.

Ein gutes Beispiel ist, dass Code- und Daten-Prefetch-Befehle niemals in Ihren Code mit -O2 und -O3 eingefügt werden. Aber die Verwendung zusätzlicher Flags für das Prefetching macht Ihren Speicher-Code 2 bis 3% schneller.

Sie finden eine Liste mit GCC-Optimierungsflags unter Ссылка .

    
SunnyShah 02.09.2009 17:17
quelle
0

Ich denke, das beantwortet deine Frage ziemlich genau:

  

Die Nachteile überwiegen die Vorteile; Erinnere dich an das Prinzip abnehmender Erträge. Die Verwendung von -O3 wird für gcc 4.x nicht empfohlen.

Wenn die Leute, die den Compiler schreiben, sagen, es nicht zu tun, würde ich sie nicht zweitraten.

    
Eric Petroelje 02.09.2009 16:31
quelle

Tags und Links