在包装的SSE浮标上翻转标志

时间:2010-07-29 09:43:05

标签: c performance optimization sse simd

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

我没有在英特尔架构软件开发手册中找到这样做的固有内容。以下是我已经尝试过的事情。

对于每个案例,我将代码循环100亿次,并显示了挂号时间。我试图至少匹配4秒,这需要我的非SIMD方法,这只使用一元减号运算符。


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


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


[9 sec]

union NegativeMask {
    int   intRep;
    float fltRep;
} negMask;
negMask.intRep = 0x80000000;

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


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

3 个答案:

答案 0 :(得分:22)

这种联盟并不是真正需要的,最好的世界(可读性,速度和便携性):

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

答案 1 :(得分:4)

只需通过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在大多数情况下都会这样做。

答案 2 :(得分:2)

关于早上3点编码的人生课程......

我从未尝试过在我的打包矢量上使用一元减号。这实际上编译并具有与非SIMD方法完全相同的性能。