由于fldz指令导致的周期停止

时间:2015-05-26 19:21:28

标签: c++ assembly floating-point profiling perf

我试图在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-missesL1-dcache-load/store-misses;这两个都显示了与热点相同的指令。奇怪的是,L1-icache-load-misses 显示fldz指令。

我最后的猜测是指令停顿是由于分支错误预测造成的,但录制branch-misses也没有显示fldz指令。

我如何解释fldz引起的指令和数据停顿?

编辑:澄清变量是查找而不是计算。

0 个答案:

没有答案