代码之家  ›  专栏  ›  技术社区  ›  nsanders

在打包的SSE浮动上翻转标志

  •  13
  • nsanders  · 技术社区  · 15 年前

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

    我在英特尔体系结构软件开发手册中没有找到这样做的内在原因。下面是我已经试过的东西。

    对于每一个案例,我循环了100亿次代码,并指出了墙的时间。我尝试至少匹配4秒,这需要我的非simd方法,它只使用一元减号运算符。


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


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


    [ 9秒]

    union NegativeMask {
        int   intRep;
        float fltRep;
    } negMask;
    negMask.intRep = 0x80000000;
    
    _mm_xor_ps( _mm_set1_ps( negMask.fltRep ), vec );
    


    编译器是GCC4.2和-O3。CPU是英特尔酷睿2双核处理器。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jens Gustedt    15 年前

    只需在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
  •  22
  •   LiraNuna    15 年前

    这种结合并不是真正需要的,而是所有领域中最好的(可读性、速度和可移植性):

    _mm_xor_ps(vec, _mm_set1_ps(-0.f))
    
        3
  •  2
  •   nsanders    15 年前

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

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