Оптимизация кода SSE2 - PullRequest
       107

Оптимизация кода SSE2

8 голосов
/ 03 ноября 2011

Я использую встроенные функции SSE2 для оптимизации узких мест моего приложения, и у меня возникает следующий вопрос:

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

В компиляторе Microsoft C ++ это не скомпилируется, потому что типы __m128i и unsigned 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;

Ответы [ 2 ]

11 голосов
/ 03 ноября 2011

Должно быть:

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

Обратите внимание на i для «немедленного».Без этого внутренняя смена ожидает вектор как второй аргумент.

6 голосов
/ 03 ноября 2011

Вы можете использовать _mm_slli_epi32 (обратите внимание на i ) и аналогично _mm_srli_epi32.Он принимает целочисленный аргумент, а не __m128i.

...