2016-05-03 2 views
3

Мне нужно горизонтально добавить __m128i, что соответствует 16 x epi8. Инструкции XOP сделали бы это тривиальным, но у меня его нет.Самый быстрый способ горизонтальной суммы SSE без знакового байтового вектора

Текущий метод:

hd = _mm_hadd_epi16(_mm_cvtepi8_epi16(sum), _mm_cvtepi8_epi16(_mm_shuffle_epi8(sum, swap))); 
hd = _mm_hadd_epi16(hd, hd); 
hd = _mm_hadd_epi16(hd, hd); 

Есть ли лучший способ с до SSE4.1?

ответ

4

Вы можете сделать это с SSE2-х _mm_sad_epu8 (psadbw), например .:

inline uint32_t _mm_sum_epu8(const __m128i v) 
{ 
    __m128i vsum = _mm_sad_epu8(v, _mm_setzero_si128()); 
    return _mm_extract_epi16(vsum, 0) + _mm_extract_epi16(vsum, 4); 
} 
Смежные вопросы