我需要计算与SSE相同的操作:
__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
我不明白为什么这两个结果不同。你能救我吗?
答案 0 :(得分:5)
霓虹灯“减半添加”操作vhadd
的工作原理如下:
A = (B + C) >> 1
而SSE平均内在_mm_avg_epu8
就是这样做的:
A = (B + C + 1) >> 1
换句话说,Neon通过“减半添加”操作执行截断平均值,而SSE正确舍入结果。
幸运的是,有一条霓虹灯指令以与SSE _mm_avg_epu8
相同的方式进行舍入 - 它被称为vrhadd - 向量舍入减半添加。
答案 1 :(得分:5)