我有一个g++ 4.7.3编译器。我想要遵循优化标志说明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html,但遇到了以下问题:
我有一个程序,在使用-O2和-O3标志时给出不同的时间。-O2比-O3快两倍。时间为8毫秒(O2)和16毫秒(O3)。
因此,我想了解到底是什么导致了差异。在上面的链接中,我看到:
“O3更加优化。-O3开启-O2指定的所有优化,并且还开启了-finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize和-fipa-cp-clone选项。”
所以,我只需取-O2并添加所有描述的标志:
时间是30毫秒。但是这组选项应该与-O3等效。为什么时间不同?我做错了什么吗?
附言:所有结果的可重复性都非常好,精度为1毫秒。
我已经使用...检查了选项。
我有一个程序,在使用-O2和-O3标志时给出不同的时间。-O2比-O3快两倍。时间为8毫秒(O2)和16毫秒(O3)。
因此,我想了解到底是什么导致了差异。在上面的链接中,我看到:
“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
时间是30毫秒。但是这组选项应该与-O3等效。为什么时间不同?我做错了什么吗?
附言:所有结果的可重复性都非常好,精度为1毫秒。
我已经使用...检查了选项。
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
速度仍然是30毫秒。
-O3
有时会导致更大的代码,无法适应缓存,而-O2
的代码则可以适应。这很重要。非常重要。 - JimR