我正在尝试优化sin / cos逼近函数。其核心是一个简单的Horner scheme,其中包含一堆乘法和加法。编译器是VS2017的MSVC,处理器是Intel Xeon E5-1650,超线程已打开(但如果关闭,则观察到的结果基本相同)。
使用Intel的VTune Amplifier 2019,我获得了分析结果(当然是发布版本),在随机双打(-2 pi和2 pi之间)上运行该函数> 1分钟,其中约有40%的时钟花在下面显示的部分(其余为范围缩小+测试线束)。但是,我无法理解VTune为我提供的微体系结构指标:
以下是内联的相应C ++代码:
void stableSinCosApproximation(double x, double* sinApprox, double* cosApprox)
{
double x2 = x * x;
*sinApprox = x * (sinCoeff[7] + x2 * (sinCoeff[6] + x2 * (sinCoeff[5] + x2 * (sinCoeff[4] + x2 * (sinCoeff[3] + x2 * (sinCoeff[2] + x2 * (sinCoeff[1] + x2 * sinCoeff[0])))))));
*cosApprox = (cosCoeff[7] + x2 * (cosCoeff[6] + x2 * (cosCoeff[5] + x2 * (cosCoeff[4] + x2 * (cosCoeff[3] + x2 * (cosCoeff[2] + x2 * (cosCoeff[1] + x2 * cosCoeff[0])))))));
}
很明显,程序集清单只有一个连续的指令块。没有跳转(也没有跳转目标),根本没有分支或有条件的执行。但是,这里有多个指标,对于VTune内置或在线帮助提供的信息,我无法理解它们的值。
具体问题:
代码的后半部分几乎没有归因,也没有时钟标记。为什么?
上半年CPI不断上涨。好的,也许这和上一点是由于归因出了错,但我不明白。
度量标准表明存在错误的推测。但是在扩展该列时,它既不会显示分支预测错误,也不会显示机器清除: 这应该告诉我什么? CPU在这里猜测什么容量?
优先注意事项:
重新实现这一点的目的是确保跨多个平台(来自同一二进制文件)的一致性。内置的sin / cos函数在不同的机器上可能会有一些ULP的变化,这会破坏结果的可重复性。
是的,我了解FMA,但并非该(单个)二进制文件必须在其上运行的每个平台都提供它们。我现在不打算进行运行时调度。
答案 0 :(得分:0)
可以从VTune的“自下而上”窗格而不是程序集窗格中显示屏幕截图吗?有趣的是,可以看到整个功能的特征(例如不良推测和前端绑定的值,BR_MISP_RETIRED.ALL_BRANCHES_PS和MACHINE_CLEARS.COUNT个事件的计数)。