【发布时间】:2025-12-23 13:40:15
【问题描述】:
我试图了解英特尔 x86-64 上 SSE 的不同 MOV 指令。
根据this,在 2 个寄存器之间移动数据时,您应该使用对齐指令(MOVAPS、MOVAPD 和 MOVDQA),并为您正在使用的类型使用正确的指令。并且在将寄存器移动到内存时使用 MOVUPS/MOVAPS,反之亦然,因为类型在移入/移出内存时不会影响性能。
那么有任何理由使用 MOVDQU 和 MOVUPD 吗?我在链接上的解释有误吗?
【问题讨论】:
-
我认为这可能对某些 CPU 上的负载使用延迟很重要,但我没有测试过/不记得我读到了什么(我可能稍后再回答)。 MOVUPD 总是无用的,因为没有 CPU 关心双浮点数和单浮点数,但是当使用 MOVUPS 负载的结果作为整数向量指令的输入时,有些可能会有额外的旁路延迟。如果您查看编译器输出,一些编译器总是使用 MOVU/APS 进行存储,但仍然使用匹配类型进行加载。
-
类型在从/向内存移动时不会影响性能,但如果您使用
movups加载一个值,然后对其执行整数运算,则会受到惩罚。这就是存在整数类型和浮点类型移动指令的原因。 -
所以如果我用movdqu从内存中加载一些东西到xmm1,然后用xmm1做一个浮点运算,会有惩罚吗?
-
@DamianPereira 没错。这就是为什么您应该始终使用适合类型的
mov指令。 -
请注意,您引用的有关 SSE 移动性能的链接相当陈旧,可能仅适用于老一代
标签: assembly x86 x86-64 intel sse