【发布时间】:2016-04-22 18:57:03
【问题描述】:
我考虑了来自 Agner Fog 的 Optimizing Assembly 的一个例子。他测试:
示例 12.6b。 DAXPY 算法,32 位模式
L1:
movapd xmm1, [esi+eax] ; X[i], X[i+1]
mulpd xmm1, xmm2 ; X[i] * DA, X[i+1] * DA
movapd xmm0, [edi+eax] ; Y[i], Y[i+1]
subpd xmm0, xmm1 ; Y[i]-X[i]*DA, Y[i+1]-X[i+1]*DA
movapd [edi+eax], xmm0 ; Store result
add eax, 16 ; Add size of two elements to index
cmp eax, ecx ; Compare with n*8
jl L1 ; Loop back
他估计在 Pentium M 上大约 6 个循环/迭代。我尝试在我的 CPU-Ivy Bridge 上做同样的事情。我每次迭代实现了 3 个周期,但从我在纸上的计算来看,有可能得到 2 个周期。也不知道是不是我在理论计算上犯了错误,还是可以改进的。
我做了什么:
来自http://www.realworldtech.com/sandy-bridge/5/ 我知道我的 CPU 可以退出 4 个 microops 循环,所以它不是瓶颈。
#uops fused = 8 / 4 = 2
所以2 是我们当前的瓶颈。让我们看看另一种可能性:
Microps 有模式:1-1-1-1-1-1-1-1 并且根据 Agner Fog 我的 CPU 有模式 1-1-1-1(和其他)。从中我们可以看出,可以在 2 个周期内解码指令。这不是瓶颈。此外,SnB cpus 具有微缓存,因此获取和解码都不是瓶颈。
以字节为单位的指令大小为 32,因此它适合微缓存窗口(32 字节)。
根据我的实验,当我添加 nop 指令时,它会增加每次迭代的周期数(大约 0.5 个周期)。
所以,问题是:
ONE 循环在哪里? :D
【问题讨论】:
标签: optimization x86