【问题标题】:SSE2 code optimizationSSE2代码优化
【发布时间】:2011-12-21 04:48:57
【问题描述】:

我正在使用 SSE2 内在函数来优化我的应用程序的瓶颈并且有以下问题:

ddata = _mm_xor_si128(_mm_xor_si128(
    _mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata);

在 Microsoft C++ 编译器上,这不会编译,因为类型 __m128iunsigned int(传递给 _mm_sll_epi32 指令)不可互换。

为什么会这样?我应该如何将任意的unsigned int 值传递给_mm_sll_epi32


_m128i 是:

typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
    __int8              m128i_i8[16];
    __int16             m128i_i16[8];
    __int32             m128i_i32[4];    
    __int64             m128i_i64[2];
    unsigned __int8     m128i_u8[16];
    unsigned __int16    m128i_u16[8];
    unsigned __int32    m128i_u32[4];
    unsigned __int64    m128i_u64[2];
} __m128i;

【问题讨论】:

    标签: c++ sse simd intrinsics sse2


    【解决方案1】:

    应该是:

    ddata = _mm_xor_si128(_mm_xor_si128(
        _mm_slli_epi32(xdata, 0x7), _mm_srli_epi32(tdata, 0x19)), xdata);
    

    注意i 表示“立即”。没有这个,移位内在函数需要一个向量作为第二个参数。

    【讨论】:

      【解决方案2】:

      您可以使用_mm_slli_epi32(注意i)和_mm_srli_epi32。它需要一个整数参数而不是 __m128i

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 2022-11-23
        • 2011-12-09
        相关资源
        最近更新 更多