【问题标题】:Sum of the four 32bits elements of a _m128 vector_m128 向量的四个 32 位元素之和
【发布时间】:2023-03-24 23:30:02
【问题描述】:

我正在使用内在函数来优化我的程序。但现在我想将 __m128 向量中的四个元素相加,以便将结果与浮点值进行比较。例如,假设我有这个 128 位向量:{a, b c, d}。如何将 a+b+c+d 与 e 进行比较,其中 e 的类型为 float ?

SSE2 或 SSE3 是否提供了一种简单的方法,或者您有任何可以帮助我的代码 sn-p 吗?谢谢!

【问题讨论】:

  • 您可以在 SSE3 中使用两个 HADDPS 执行此操作,但这不是很快。这个向量来自哪里?任何计算都可以重新排列,以避免水平加法吗?
  • 好吧,我必须比较 (aa + bb) 和 4.0。为此,我将 a 和 b 存储在 __m128 向量中,例如 vec = {a, b, UNUSED, UNUSED}。我通过 square = _mm_mul_ps(vec, vec) 获得 {a², b², X, X}。现在,我正在寻找一种获得 a² + b² 的方法,以便将其与 4.0 进行比较。这当然不是最佳的,所以如果您有任何建议,将不胜感激:)
  • 抱歉,我的处理器不支持 SSE4。
  • 真遗憾,DPPS 非常适合解决这个问题。好的,我得考虑一下。

标签: sum simd sse2 sse3


【解决方案1】:

我能做到的最好的是:

; assumes    xmm0 = [0, B, 0, A] or similar
mulps xmm0,xmm0   ; [0, B*B, 0, A*A]
xorps xmm1,xmm1
movhlps xmm1,xmm0 ; [0, 0, 0, B * B]
addps xmm0,xmm1   ; [0, 0, 0, A * A + B * B]

如果 A 和 B 绝对必须在低四字中,那么据我所知,您需要一个 shuffle,这在 pre-Penryn 上较慢(在 Penryn 上,DPPS 解决方案可用)。

【讨论】:

  • 非常感谢。但是现在我有了这个向量,如何将它与 4 进行比较。?我应该创建一个包含 {0, 0, 0, 4} 的向量并将它们与 _mm_cmpeq_ss 进行比较吗?
  • 如果你愿意,但这是浮点数,所以它不能很好地与 EQ 变体混合。这是为了什么?比较可以用 LE 或 NLT 变体代替吗?
  • 其实我也可以使用 LE。感谢您的帮助!
猜你喜欢
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多