平均操作ARM NEON

时间:2013-09-06 12:27:46

标签: arm sse simd neon intrinsics

我需要计算与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 

我不明白为什么这两个结果不同。你能救我吗?

2 个答案:

答案 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)

您可以使用vrhadd [1] [2]

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