【问题标题】:average operation ARM NEON平均操作 ARM NEON
【发布时间】:2013-09-10 13:27:22
【问题描述】:

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

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

【问题讨论】:

    标签: arm sse simd neon intrinsics


    【解决方案1】:

    Neon“减半”操作vhadd 的工作原理如下:

    A = (B + C) >> 1
    

    而 SSE 平均内在 _mm_avg_epu8 这样做:

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

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

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

    【讨论】:

    • 好的,非常感谢。我使用与 SSE Vr[i]:=(Va[i]+Vb[i]+1)>>1 完全相同的 vrhadd 解决了问题。
    【解决方案2】:

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

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

    【讨论】:

    • 许多 NEON 指令具有 Q 和 R 标志,q 表示饱和,r 表示舍入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2012-10-09
    • 2015-09-20
    • 2012-06-25
    相关资源
    最近更新 更多