【问题标题】:Flipping sign on packed SSE floats包装好的 SSE 花车上的翻转标志
【发布时间】:2011-03-22 15:03:01
【问题描述】:

我正在寻找最有效的方法来翻转 SSE 寄存器中包含的所有四个浮点数上的符号。

我在英特尔架构软件开发手册中没有找到执行此操作的内在函数。以下是我已经尝试过的事情。

对于每种情况,我都循环了代码 100 亿次,并得到了指示的挂墙时间。我试图至少匹配 4 秒,这需要我的非 SIMD 方法,它只使用一元减号运算符。


[48 秒]
_mm_sub_ps( _mm_setzero_ps(), vec );


[32 秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );


[9 秒]

联合 NegativeMask {
    诠释intRep;
    浮动 fltRep;
} 负掩码;
negMask.intRep = 0x80000000;

_mm_xor_ps(_mm_set1_ps(negMask.fltRep),vec);


编译器是带有 -O3 的 gcc 4.2。 CPU 是 Intel Core 2 Duo。

【问题讨论】:

    标签: c performance optimization sse simd


    【解决方案1】:

    这个联合并不是真正需要的,最好的(可读性、速度和可移植性):

    _mm_xor_ps(vec, _mm_set1_ps(-0.f))
    

    【讨论】:

      【解决方案2】:

      只是为了通过 gcc 文档完成您自己关于这些内置向量的答案:

      The types defined in this manner can be used with a subset of normal C
      operations.  Currently, GCC will allow using the following operators on
      these types: `+, -, *, /, unary minus, ^, |, &, ~'.
      

      在可能的情况下始终坚持这些可能是个好主意。 gcc 很有可能总是为这个 SSE 东西提供最有效的代码。

      对于您的编译器选项,为您的架构添加更具体的内容,例如 -march=native 在大多数情况下都可以。

      【讨论】:

        【解决方案3】:

        关于编码的生活课直到凌晨 3 点.....

        我从来没有尝试过只在我的压缩向量上使用一元减号。这实际上编译并具有与非 SIMD 方法完全相同的性能。

        【讨论】:

        • 但要小心 - 使用像这样的 gcc 特定扩展,这会使您的代码不可移植。
        猜你喜欢
        • 2020-04-23
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 2010-10-03
        • 1970-01-01
        相关资源
        最近更新 更多