2013-10-28 17 views
5

Ich habe g ++ 4.7.3 Compiler. Ich versuche, die Optimierung Flags Beschreibung http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html zu folgen und ein nächstes Problem zu haben:Zweifel über gcc O3 Optimierung Flag

Ich habe ein Programm, das verschiedene Zeiten mit -O2 und -O3 Flag gibt. -O2 ist zweimal schneller als -O3. Die Zeit ist 8ms mit O2 und 16ms mit O3.

Also ich würde gerne verstehen, was genau einen Unterschied macht. Im obigen Link sehe ich:

"O3 Optimiere noch mehr. -O3 schaltet alle Optimierungen ein, die durch -O2 spezifiziert sind und schaltet auch die -finline-Funktionen ein, -funswitch-loops, -fpredictive-commoning, -fgcse- nach-reload, -tree-vectorize und-fipa-cp-clone optionen. "

Also nehme ich einfach -O2 und fügen Sie alle beschriebenen Fahnen:

-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone 

Und Zeit ist 30ms. Aber diese Reihe von Optionen sollte gleich zu -O3 sein. Warum ist die Zeit anders? Wo mache ich etwas falsch?

P.S. Alle Ergebnisse sind mit einer Genauigkeit von 1 ms perfekt reproduzierbar.


Ich habe die Optionen geprüft

g++ -c -Q -Ox --help=optimizers 

und sah mit, dass O3 eine weitere zusätzliche Option hat: -ftree-Loop-distribute-Muster. Aber wenn ich es addiere die Optionen gesetzt:

-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns 

die Geschwindigkeit ist immer noch 30ms.

+2

Optimierung ist keine perfekte Wissenschaft. Es gibt keinen definitiven Grund zu denken, dass Sie etwas falsch machen (aber da Sie nicht Ihre Methode zur Durchführung dieser Messungen angegeben haben, gibt es keine Möglichkeit zu wissen, dass Sie nicht auch etwas falsch machen). – mah

+1

Mindestens GCC-Optimierungsoptionen garantieren keine schnellere Leistung für die eingestellten Leistungsoptionen. Es gibt viele Dinge, weniger Größe könnte die Leistung mehr beschleunigen, z.B. Cache-Hits, Verzweigungsvorhersage, etc. –

+0

Für was es wert ist, sagen die Dokumente ** nicht ** explizit, dass -O3 -O2 plus einige zusätzliche Optionen ist - sie können ganz andere Dinge tun _ zusätzlich zu_ diesen Optimierungsflags einschalten, zumindest durch die von Ihnen gepostete Dokumentation. – CmdrMoozy

Antwort

7

können Sie erhalten g++ Ihnen zu zeigen, welche Möglichkeiten mit dem -Q Option aktiv ist:

g++ -c -Q -O3 --help=optimizers 

Der Ausgang so etwas wie ist:

-O<number> 
    -Ofast 
    -Os 
    -falign-functions      [enabled] 
    -falign-jumps       [enabled] 
    -falign-labels      [enabled] 
    -falign-loops       [enabled] 
    -fasynchronous-unwind-tables   [enabled] 
    -fbranch-count-reg     [enabled] 
    -fbranch-probabilities    [disabled] 
    -fbranch-target-load-optimize   [disabled] 
    -fbranch-target-load-optimize2  [disabled] 
    -fbtr-bb-exclusive     [disabled] 
    -fcaller-saves      [enabled] 
    -fcombine-stack-adjustments   [enabled] 
    -fcommon        [enabled] 
    -fcompare-elim      [enabled] 
    -fconserve-stack      [disabled] 
    -fcprop-registers      [enabled] 
    -fcrossjumping      [enabled] 
    -fcse-follow-jumps     [enabled] 
    -fcx-fortran-rules     [disabled] 
    -fcx-limited-range     [disabled] 
    -fdata-sections      [disabled] 
    -fdce         [enabled] 
ETC.. 
+0

Danke. Es zeigt also eine weitere Option mit O3: -Floe-Loop-Distribution-Patterns. Wenn ich es zu den Optionen hinzufüge, ist die Geschwindigkeit immer noch 30ms. – klm123

Verwandte Themen