我在x86_64系统上遇到了从Linux内核3.11到3.12的奇怪性能回归.在Fedora 20,3.12上运行Mark Stock's Radiance基准测试的速度明显变慢.没有其他任何改变 - 相同的二进制,相同的glibc - 我只是启动一个不同的内核版本,性能改变.定时程序rpict是100%CPU绑定的用户级代码.
在我将此报告为错误之前,我想找到导致此行为的原因.我对Linux内核了解不多,从3.11到3.12的更改日志并没有给我任何线索.
我在两个系统上观察到了这一点,Intel Haswell(i7-4771)和AMD Richland(A8-6600K).在Haswell系统上,用户时间从895秒变为3.11到962变为3.12.在里奇兰,从1764年到1844年.这些时间可以在几秒钟内重复.
我用perf进行了一些分析,发现IPC与减速的比例下降了.在Haswell系统中,这似乎是由更多错过的分支引起的,但为什么预测率会下降?Radiance确实使用随机数生成器 - 可能"更好"的随机性导致错过的分支?但除了OMAP4支持外,RNG在3.12中似乎没有变化.
在AMD系统上,perf只指向更多空闲的后端周期,但原因尚不清楚.
Haswell系统:
3.11.10 895s user, 3.74% branch-misses, 1.65 insns per cycle
3.12.6 962s user, 4.22% branch-misses, 1.52 insns per cycle
Run Code Online (Sandbox Code Playgroud)
里奇兰系统:
3.11.10 1764s user, 8.23% branch-misses, 0.75 insns per cycle
3.12.6 1844s user, 8.26% branch-misses, 0.72 insns per cycle
Run Code Online (Sandbox Code Playgroud)
我还查看了两个内核的dmesg输出中的差异,但没有看到任何可能导致CPU绑定程序如此减速的事情.
我尝试将cpufreq 调控器从默认的ondemand切换到peformance但是没有任何效果.
可执行文件是使用gcc 4.7.3编译的,但不使用AVX指令.libm似乎仍然使用一些AVX(例如__ieee754_pow_fma4),但这些功能仅占总执行时间的0.3%.
附加信息: