【问题标题】:Difference between MOVDQA and MOVAPS x86 instructions?MOVDQA 和 MOVAPS x86 指令之间的区别?
【发布时间】:2011-10-04 10:03:00
【问题描述】:

我正在查看英特尔数据表:英特尔® 64 和 IA-32 架构 软件开发者手册和我找不到区别

  • MOVDQA:移动对齐的双四字
  • MOVAPS:移动对齐打包单精度

在英特尔数据表中,我可以找到两条指令:

该指令可用于从 128 位加载 XMM 寄存器 内存位置,将 XMM 寄存器的内容存储到 128 位内存位置,或在两个 XMM 寄存器之间移动数据。

唯一的区别是:

要将双四字移入或移出未对齐的内存位置,请使用 MOVDQU 指令。

将压缩单精度浮点值移入或移出 未对齐的内存位置,请使用 MOVUPS 指令。

但我找不到两条不同指令的原因?

那么谁能解释一下区别?

【问题讨论】:

  • 看起来,MOVAPD 也与它们相同。

标签: assembly x86 sse simd mov


【解决方案1】:

在功能上,它们是相同的。

一些(但不是全部)微架构上,由于“跨域惩罚”而存在时间差异。出于这个原因,当数据与整数 SSE 指令一起使用时,通常应使用movdqa,当数据与浮点指令一起使用时,应使用movaps。有关此主题的更多信息,请参阅英特尔优化手册或 Agner Fog 出色的微架构指南。请注意,这些延迟通常与寄存器-寄存器移动有关,而不是与加载或存储有关。

【讨论】:

  • 您能否链接到特定的手动条目?我很难相信这一点,因为 SSE 寄存器没有与之关联的类型(类型在指令中编码),因此我认为没有不同的浮点和整数路径。但是,它们确实具有不同的操作码,并在不同的指令集中引入。 MOVAPS 是 SSE1,而 MOVDQA 是 SSE2。根据intel.com/Assets/PDF/manual/248966.pdf,它们还具有相同的延迟和吞吐量
  • @Jasper Bekkers:你不能随便相信,但它仍然是真的。有关域和它们之间的旁路延迟的一般讨论,请参阅英特尔优化手册(例如,2.2.3 讨论了 Nehalem 微架构上的域)。有关危害的具体具体示例,请参阅 Agner Fog 的优秀参考文献agner.org/optimize/microarchitecture.pdf 的第 86 和 87 页
  • Agners 手册中的页面似乎已经改变,最好只搜索“数据绕过延迟”,每个 uArch 都有一个部分。
  • movapsmovapd 怎么样?它们都在浮点域中,所以我不明白为什么有两条指令。
  • @Zboson:保留将来引入单独的浮点/双域的可能性。这几乎肯定不会发生,但一些建筑师在很多年前就认为它可能会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2015-01-12
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多