【问题标题】:Why do some SSE "mov" instructions specify that they move floating-point values?为什么某些 SSE “mov”指令指定它们移动浮点值?
【发布时间】:2013-04-24 00:53:38
【问题描述】:

许多 SSE “mov”指令指定它们正在移动浮点值。例如:

  • MOVHLPS - 将压缩单精度浮点值从高移到低
  • MOVSD - 移动标量双精度浮点值
  • MOVUPD - 移动未对齐的压缩双精度浮点值

为什么这些指令不简单地说它们移动 32 位或 64 位值?如果它们只是移动位,为什么指令指定它们用于浮点值?无论您是否将这些位解释为浮点,它们肯定会起作用吗?

【问题讨论】:

  • 可能浮点数在协处理器寄存器上
  • 这些指令在 SSE 寄存器 (xmm0-9) 上运行,它可以保存浮点或整数值。

标签: assembly x86 sse


【解决方案1】:

我想我找到了答案:一些微架构在与整数指令不同的执行单元上执行浮点指令。当指令流保持在同一“域”(整数或浮点)内时,您会获得更好的整体延迟。这在 Agner Fog 的优化手册中的“数据绕过延迟”部分中进行了非常详细的介绍:http://www.agner.org/optimize/microarchitecture.pdf

我在这个类似的 SO 问题中找到了这个解释:Difference between MOVDQA and MOVAPS x86 instructions?

【讨论】:

  • 只是评论以确认这是正确的。 :) 跨不同域折腾值通常有 1-2 个周期的延迟。
【解决方案2】:

如果有人关心,这正是为什么在 Agner Fog 的矢量类中,他有单独的矢量类与布尔浮点 (Vec4fb) 和布尔整数 (Vec4i) 一起使用 http://www.agner.org/optimize/#vectorclass

他在手册中写道。 “我们定义一个单独的布尔向量类的原因是 与浮点向量一起使用是它使我们能够生成更快的代码。 (许多 现代 CPU 具有用于整数向量和浮点的单独执行单元 点向量。有时可以在 浮点单元,从而避免在两者之间移动数据的延迟 单位)。”

大多数关于 SSE 和 AVX 的问题都可以通过阅读他的手册来回答,更重要的是查看他的矢量类中的代码。

【讨论】:

  • 感谢参考!阿格纳雾是不可思议的。我不知道一个人怎么能像他一样写出这么多有用的代码、文档和信息。
  • 所以我想这也是“为什么有 ANDPS、ANDPD 和 PAND,它们用于执行条件(以及 ANDN、OR、XOR)的答案。那么,为什么ANDPS 与 ANDPD 有什么不同?我猜是同一 ex. 单元中的不同管道配置文件...
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 2017-09-15
  • 2013-11-20
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多