3

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

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

4

2 回答 2

8

霓虹灯“减半”操作的vhadd工作原理如下:

A = (B + C) >> 1

而 SSE 平均内在函数_mm_avg_epu8是这样做的:

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

换句话说,Neon通过其“减半相加”操作来截断平均值,而 SSE 正确地舍入了结果。

幸运的是,有一条 Neon 指令以与 SSE 相同的方式舍入_mm_avg_epu8- 它被称为vrhadd - 矢量舍入减半相加。

于 2013-09-06T12:40:22.837 回答
5

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

Vector rounding halving add: vrhadd -> Vr[i]:=(Va[i]+Vb[i]+1)>>1
于 2013-09-06T12:51:51.097 回答