【问题标题】:adding the components of an SSE register添加 SSE 寄存器的组件
【发布时间】:2012-01-22 02:09:31
【问题描述】:

我想添加 SSE 寄存器的四个组件以获得单个浮点数。这就是我现在的做法:

float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];

有没有直接实现这个的SSE指令?

【问题讨论】:

  • 我怀疑它是否存在,但如果存在,该指令可能会将结果放入 128 位输出寄存器的 32 位区域,而不是 32 位寄存器本身。跨度>

标签: c++ floating-point sse simd addition


【解决方案1】:

您可能会使用 HADDPS SSE3 指令,或其编译器内在 _mm_hadd_ps

例如,见http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

如果你有两个寄存器 v1 和 v2 :

v = _mm_hadd_ps(v1, v2);
v = _mm_hadd_ps(v, v);

现在,v[0] 包含 v1 的分量之和,v[1] 包含 v2 的分量之和。

【讨论】:

    【解决方案2】:

    如果您希望您的代码在 SSE3 之前的 CPU(不支持 _mm_hadd_ps)上运行,您可以使用以下代码。它使用更多指令,但在大多数 CPU 上解码为更少的微操作。

     __m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128);
     float x;
     _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));
    

    【讨论】:

      【解决方案3】:

      好吧,我不知道有什么这样的函数,但是可以使用 _mm_hadd_ps() 两次来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多