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.
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
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. –
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