2013-09-06 8 views
3
나는 SSE와 동일한 동작을 계산하기 위해 필요

: NEON으로평균 작동 ARM의 NEON

__m128i result1=_mm_avg_epu8 (upper, lower); 

나는 다음을 수행하십시오

uint8x16_t result1=vhaddq_u8(upper, lower); 

결과는 동일해야하지만, SSE와 명령 I을 얻었다 :

91cb c895 aaa3 b0d4 cfc0 c1b0 aac7 b9b9 

는 네온 지시 반면 I 얻을 :

01,235,
91ca c894 a9a2 b0d3 cec0 c1af aac7 b8b8 

왜 두 결과가 다른지 알 수 없습니다. 나 좀 도와 줄 수있어? SSE를 평균 고유 _mm_avg_epu8이 수행하는 반면

A = (B + C) >> 1 

: 즉

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

를 네온은 평균을 절단하지

답변

5

네온 작동이 같은 vhadd 작품 "을 추가 절반으로" SSE는 결과를 정확하게 반올림하는 반면, "반감 추가"연산을 수행합니다.

다행히도 SSE의 _mm_avg_epu8과 같은 방식으로 둥근 네온 명령이 있습니다.이 코드는 vrhadd - 벡터 라운딩 반가 첨가라고합니다.

+1

감사합니다. SSE Vr [i] : = (Va [i] + Vb [i] +1) >> 1과 똑같은 vrhadd를 사용하여 해결했습니다. – 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은 반올림 기능이 있습니다. –