我在SPEC基准测试中对GCC Profile-Guided Optimization的开销进行基准测试。我有一些基准测试的奇怪结果。实际上,我的两个基准测试在运行时运行得更快。
使用以下命令编译普通可执行文件:-g -O2 -march = native
使用以下方法编译已检测的可执行文件:-g -O2 -march = native -fprofile-generate -fno-vpt
我正在使用GCC 4.7(确切地说是Google分支)。运行基准测试的计算机具有Intel(R)Xeon(R)CPU E5-2650 0 @ 2.00GHz。
bwaves是Fortran基准和libquantum
结果如下:
bwaves-normal: 712.14
bwaves-instrumented: 697.22
=> ~2% faster
libquantum-normal: 463.88
libquantum-instrumented: 449.05
=> ~3.2% faster
我多次尝试基准测试,认为这可能是ma机器上的一个问题,但每次我确认它们。
我理解某些程序的开销非常小,但我没有看到任何改进的理由。
所以我的问题是:GCC如何检测可执行文件比优化的普通版本更快?
由于
答案 0 :(得分:1)
查看GCC文档,看起来-fprofile-generate
确实激活了一些特定的代码转换,使分析更容易/更便宜,因此检测代码实际上不是原始代码+检测。这些更改可以使代码更快,添加代码也会使缓存行为发生变化。很难知道没有看到有问题的代码。而且从我(很久以前)和LCC一起搞错,当智能分析完成时,它涉及令人惊讶的代码更改。
好奇心:与上述相比,编制的代码如何将考虑中的个人资料编成?
答案 1 :(得分:1)
我可以想到两种可能性,都与缓存有关。
一个是计数器增量“加温”一些重要的缓存行。 其次,添加检测所需的结构会导致一些使用频繁的数组或变量落入不同的缓存行。
另一个问题是,每次在for循环中都不必进行分析/增加计数器 - 如果循环中没有'break'或'return',则允许编译器优化增量循环。