我有g ++ 4.7.3编译器。我正在尝试按照优化标记说明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html进行操作,并遇到下一个问题:
我有一个程序,它给出了-O2和-O3标志的不同时间。 -O2比-O3快两倍。 O2时间为8ms,O3时间为16ms。
所以我想了解到底有什么不同。在上面的链接中,我看到:
“O3优化更多。-O3打开-O2指定的所有优化,并打开-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload,-ftree-vectorize和-fipa-cp-clone选项。“
所以我只需要-O2并添加所有描述的标志:
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone
时间是30ms。 但是这组选项应该等效到-O3。为什么时间不同?我在哪里做错了什么?
P.S。所有结果均可完美再现,精度为1ms。
我已经使用
检查了选项g++ -c -Q -Ox --help=optimizers
并且看到O3还有一个额外的选项:-ftree-loop-distribute-patterns。但是当我添加选项集时:
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns
速度仍然是30ms。
答案 0 :(得分:7)
您可以g++
向-Q
选项显示哪些选项处于有效状态:
g++ -c -Q -O3 --help=optimizers
输出类似于:
-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..