无符号整数存储的MMX寄存器速度与堆栈的关系

时间:2018-12-08 12:49:56

标签: assembly x86 cpu-registers micro-optimization mmx

我正在考虑在纯汇编中实现SHA3。 SHA3​​的内部状态为17个64位无符号整数,但是由于使用了转换,因此如果寄存器中有44个这样的整数,则可以实现最佳状态。再加上一个暂存器。在这种情况下,我将能够在寄存器中进行整个转换。

但这是不现实的,并且优化甚至可以一直到只有几个寄存器。尽管如此,取决于对这个问题的答案,更多可能更好。

我正在考虑至少将MMX寄存器用于快速存储,即使我需要交换到其他寄存器进行计算。但是我担心这是古老的建筑。

MMX寄存器和RAX之间的数据传输是否比索引堆栈上的u64并从可能是L1高速缓存访​​问它们更快?或者即使是这样,除了我应该注意的速度问题之外,还有隐藏的陷阱吗?我对一般情况感兴趣,因此即使在我的计算机上一个速度比另一个速度快,也可能尚无定论。

1 个答案:

答案 0 :(得分:5)

Using ymm registers as a "memory-like" storage location-这不是性能上的胜利。 MMX也不会。该用例用于完全避免可能破坏微基准的内存访问。

高效的存储转发和快速的L1d缓存命中率使使用常规RAM变得非常好。 x86允许像add eax, [rdi]这样的内存操作数,现代CPU可以将其解码为单个uop。

使用MMX,您需要2 uop,例如movd edx, mm0 / add eax, edx。因此,更多的机会和更多的延迟。在典型的现代CPU上,与MMX或XMM寄存器之间的movdmovq延迟要比3到5个周期的存储转发延迟更糟糕。


但是,如果您不需要经常来回移动数据,则可以有效地将某些数据保留在MMX / XMM寄存器中,并使用pxor mm0, mm1等上。

如果您可以安排算法,以便使用movd/movq(int <-> XMM或int <-> MMX)和movq2dq / movdq2q来减少总指令/指令( (MMX-> XMM / XMM-> MMX)指令,而不是存储和内存操作数或加载,那么这可能是一个胜利。

但是在Haswell之前的Intel上,只有3个ALU执行端口,因此,如果将存储/加载端口保持空闲状态,那么4宽超标量流水线可能会遇到比前端吞吐量窄的瓶颈(ALU吞吐量)。 / p>

(请参见https://agner.org/optimize/中的the x86 tag wiki和其他性能链接。)