变量移位是否会产生部分寄存器停顿(或寄存器重组微指令)ecx
?如果是,在哪种微架构上?
我已经在Core2(65nm)上测试过这个,它似乎是只读的cl
.
_shiftbench:
push rbx
mov edx, -10000000
mov ecx, 5
_shiftloop:
mov bl, 5 ; replace by cl to see possible recombining
shl eax, cl
add edx, 1
jnz _shiftloop
pop rbx
ret
更换mov bl, 5
by mov cl, 5
没有什么区别,如果正在进行寄存器重组,就会有区别,这可以通过替换来证明shl eax, cl
by add eax, ecx
(在我的测试中,版本为add
写入时速度减慢 2.8 倍cl
代替bl
).
检测结果:
- Merom:未观察到失速
- Penryn:未观察到失速
- Nehalem:未观察到失速
更新:新的shrx
- Haswell 的一组轮班does显示那个摊位。移位计数参数没有写成 8 位寄存器,因此这可能是预料之中的,但文本表示确实没有说明此类微架构细节。
正如目前的措辞(“可以使用 CL 寄存器进行移位……”),问题的标题包含其自己的答案:使用现代处理器,CL 上永远不会出现部分寄存器停顿,因为 CL 永远无法从较小的东西重新组合。
是的,处理器知道您要移动的量实际上包含在 CL 中,准确地说是 CL 的 5 或 6 个最低有效位。它可能在 ECX 上停滞的一种方式是,如果它考虑指令依赖性的粒度没有低于完整寄存器。不过,这种担心已经过时了:将整个 ECX 寄存器视为依赖项的最新 Intel 处理器是 Pentium 4。请参阅 Agner Fog 的非官方优化手册 http://www.agner.org/optimize/microarchitecture.pdf,第 121 页。但话又说回来,对于 P4,这不会被称为部分寄存器停顿,程序只能成为错误依赖性的受害者(例如,如果 CH 在移位之前是修饰符)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)