【问题标题】:Divide by floating-point number using NEON intrinsics使用 NEON 内在函数除以浮点数
【发布时间】:2011-10-09 05:58:03
【问题描述】:

我当时正在处理一个 4 个像素的图像,这是在 armv7 上用于 Android 应用程序。

我想将 float32x4_t 向量除以另一个向量,但其中的数字从大约 0.73.85 不等,在我看来,唯一的除法方法是使用右移,但那是对于 2^n 的号码。

另外,我是这方面的新手,所以欢迎任何建设性的帮助或评论。

例子:

如何使用 NEON 内部函数执行这些操作?

float32x4_t a = {25.3,34.1,11.0,25.1};
float32x4_t b = {1.2,3.5,2.5,2.0};
//    somthing like this
float32x4 resultado = a/b; // {21.08,9.74,4.4,12.55}

【问题讨论】:

    标签: android c arm intrinsics neon


    【解决方案1】:

    NEON 指令集没有浮点除法。

    如果您先验知道您的值缩放比例并不差,并且您不需要正确的舍入(如果您正在进行图像处理,这几乎肯定是这种情况),那么您可以使用倒数估计、细化步骤和乘法而不是除法:

    // get an initial estimate of 1/b.
    float32x4_t reciprocal = vrecpeq_f32(b);
    
    // use a couple Newton-Raphson steps to refine the estimate.  Depending on your
    // application's accuracy requirements, you may be able to get away with only
    // one refinement (instead of the two used here).  Be sure to test!
    reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal);
    reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal);
    
    // and finally, compute a/b = a*(1/b)
    float32x4_t result = vmulq_f32(a,reciprocal);
    

    【讨论】:

    • 我也教过这种解决方案,但我不知道 vrecpeq_f32,所以非常感谢。我认为霓虹内在函数需要更好地记录它所具有的功能
    • @Darkmax:你应该从 ARM 下载架构参考手册,而不是依赖 NEON 头文件。
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2013-09-18
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多