2013-09-06 2 views
3

Мне нужно вычислить ту же операцию, что и SSE один:средняя операция ARM NEON

__m128i result1=_mm_avg_epu8 (upper, lower); 

С NEON я следующее:

uint8x16_t result1=vhaddq_u8(upper, lower); 

Результаты должны быть одинаковыми, но с SSE инструкция я получаю:

91cb c895 aaa3 b0d4 cfc0 c1b0 aac7 b9b9 

в то время как с инструкцией NEON я получаю:

91ca c894 a9a2 b0d3 cec0 c1af aac7 b8b8 

Я не понимаю, почему два результата различны. Вы можете мне помочь?

ответ

5

Неон "наполовину добавить" операция vhadd работает следующим образом:

A = (B + C) >> 1 

в то время как средняя SSE внутренняя _mm_avg_epu8 делает это:

A = (B + C + 1) >> 1 

Другими словами Неон делает усечения среднем с его операция «halving add», тогда как SSE правильно округляет результат.

К счастью, есть инструкция Neon, которая округляется так же, как SSE _mm_avg_epu8 - это называется vrhadd - Vector Rounding Halving Add.

+1

Хорошо, спасибо. Я решил использовать vrhadd, который делает то же самое, что и SSE Vr [i]: = (Va [i] + Vb [i] +1) >> 1. – user1926328

5

Вы можете использовать vrhadd[1][2].

Vector rounding halving add: vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1 
+0

Да, точно. Это работает отлично. – user1926328

+1

Многие инструкции NEON содержат флагов Q и R, q для насыщения и r для округления. –

Смежные вопросы