【问题标题】:What is the point of SSE2 instructions such as orpd?orpd 等 SSE2 指令的意义何在?
【发布时间】:2020-09-18 13:22:12
【问题描述】:

orpd 指令是“压缩双精度浮点值的按位逻辑或”。这与por(“按位逻辑或”)不完全相同吗?如果是这样,拥有它有什么意义?

【问题讨论】:

    标签: assembly x86 sse instruction-set sse2


    【解决方案1】:

    请记住,SSE1 orps 先出现。 (实际上MMX por mm, mm/mem 甚至在 SSE1 之前就出现了。)

    我猜,具有新前缀的相同操作码是SSE2 orpd 指令对于硬件解码器逻辑是有意义的,就像movapd 与movaps 一样。在ps 和pd 版本之间,类似这样的一些指令是多余的,但有些不是,例如addps 与addpd 或unpcklps 与unpcklpd 是不同的洗牌。

    SSE2 也引入 66 0F EB /r por xmm,xmm/mem 的原因至少部分是为了与 MMX 0F EB /r por mm, mm/mem 保持一致,同样的操作码具有新的强制性前缀。就像paddb mm, mm 与paddb xmm, xmm。

    但也考虑到 vec-integer 与 FP 的不同绕过转发域的可能性。不同的微架构对于它们如何实际解码和运行这些不同的指令有不同的行为。有些人以相同的方式运行所有 XMM or 指令,从而为 FP 和 simd-integer 域之间的转发产生额外的延迟。

    对于 FP-float 和 FP-double,没有任何 CPU 实际上具有不同的转发域,所以是的,movapd 和 orpd 实际上是你不应该使用的无用空间浪费。请改用较小的orps 编码。

    (或者使用 VEX 编码也没关系;vorps 和 vorpd 大小相同:2 字节前缀 + 操作码 + modrm ...)


    por 与 orps

    有关在addps 等 FP 数学指令之间使用por 或在paddb 等 SIMD 整数 insn 之间使用orps 时绕过延迟的更多信息,请参阅


    如果有人想知道,对标题的另一种解释的答案是:FP 值上的按位布尔值主要用于设置、清除或切换符号位。或者用 cmpps/pd 掩码做一些事情,比如混合。

    【讨论】:

    • 在整数和浮点指令之间切换对性能有影响吗?
    • 如果我没记错的话,AMD Opteron 的第一个实现在 SIMD 数据类型(即使宽度相同)之间切换时会产生延迟。我认为这适用于 float 与 double 以及 FP 与 int,但已经有大约 15 年了......
    • @JohnDMcCalpin:Agner 的 uarch 指南说 float 通常是 K8/K10 上的一个域。也许您正在考虑 Bulldozer 系列,其中不同宽度的 FMA/数学指令具有重新格式化延迟,例如 addps -> addpd。这仅适用于实际数学,而不是布尔值或洗牌。 addps 可以毫无延迟地转发到 unpcklpd,因此这不是 3 个单独的旁路网络的证据,也不是存在 orpd 的任何理由。有证据表明,BD 保留了要重用的向量元素的额外内容,并且在转发 FMA->FMA 时比 orps -> FMA 具有更低的延迟。
    • @JohnDMcCalpin: TL:DR: 绝对是 Bulldozer 系列(和 Jaguar/Bobcat)的东西,不是 K8/K10,但不是 orpd / orps。只有实际的数学。假设 Agner Fog 的总结是完全准确的。对于 K8/K10 确实考虑了重新格式化延迟作为假设,但基于仅看到 i-vec 和 FP 之间的额外延迟而不是该 uarch 系列的单精度和双精度指令之间的额外延迟而拒绝了它。
    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多