【问题标题】:Collapse xmm register into a scalar将 xmm 寄存器折叠成标量
【发布时间】:2015-05-25 11:27:01
【问题描述】:

我需要能够获取 4 个压缩整数,并使用 or 操作将它们一个一个重叠地折叠成一个组合整数。

最有效的方法是什么?请注意,压缩整数中的 1 永远不会有一个共同的位置,所以我认为无符号的“加法”也可以解决问题。

我看到了水平加法指令,但它是用于有符号加法的。

【问题讨论】:

  • 允许使用哪种 SIMD 指令集?
  • 有符号和无符号加法是一回事。
  • @MarcusMüller 更喜欢 sse2,但会升级到 4.1
  • @harold:哦,你说得有道理。哎呀;我错过了。 Ragdoll,看看负数是如何表示的以及为什么它很方便。

标签: assembly x86 sse simd intrinsics


【解决方案1】:

cmets 中提到的 SSSE3 方式,有 2 个phaddd 会是这样的:

phaddd xmm0, xmm0
phaddd xmm0, xmm0

不幸的是,这不是很快,SB 为 4 个周期,其他一切为 6 个周期(AMD 为 8 或 10 个)。

带有随机播放和正常添加的普通 SSE2 方式可能如下所示:(未测试)

pshufd xmm1, xmm0, 0x4E
paddd xmm0, xmm1
pshufd xmm1, xmm0, 0xB1
paddd xmm0, xmm1

除 AMD 处理器外,这需要 4 个周期。缺点:代码比较大,需要临时寄存器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2020-05-07
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多