我试图在Xeon x5675处理器上解释一些性能结果。我有一个程序,其中大部分周期是停顿(来自perf stat
)。使用perf record -e stalled-cycles-frontend,stalled-cycles-backend
,我发现两个前端和后端停顿在很大程度上是由于单个fldz
指令。
此指令位于执行以下操作的循环内(来自objdump -D -S objectfile.o
):
// function is inlined by compiler
void doit(double someval, float cutoff) {
double other = lookupOther(); // just a memory access
if (someval && other - someval > cutoff) // fldz instruction is from the 'someval != 0' check
...
}
我首先想到由于超线程可能会导致FPU的资源争用(进程的多个实例在同一台机器上连续运行),因此我使用taskset
将每个实例绑定到核心,并确保没有其他进程正在使用我的profiled进程'core的超线程伴随核心(我无法重启机器来设置isolcpus
启动参数)。我在top
验证了FPU-heavy没有使用核心(只是中断和bash shell)。不幸的是,我得到了几乎相同的分析结果。
我同样检查了LLC-load/store-misses
和L1-dcache-load/store-misses
;这两个都显示了与热点相同的指令。奇怪的是,L1-icache-load-misses
不显示fldz
指令。
我最后的猜测是指令停顿是由于分支错误预测造成的,但录制branch-misses
也没有显示fldz
指令。
我如何解释fldz
引起的指令和数据停顿?
编辑:澄清变量是查找而不是计算。