使用NEON内在函数除以浮点数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NEON内在函数除以浮点数相关的知识,希望对你有一定的参考价值。

我正在处理一个四像素的图像,这是在一个android应用程序的armv7上。

我想将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}
答案

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);

以上是关于使用NEON内在函数除以浮点数的主要内容,如果未能解决你的问题,请参考以下文章

你如何使用霓虹内在函数加载 3 个浮点数

SSE1 使用 divps 内在 xmmintrin.h 来划分四个 32 位浮点数并使用 printf?

SSE 内在函数:将 32 位浮点数转换为 UNSIGNED 8 位整数

在 C 中使用英特尔内在函数加载和存储复杂的浮点数

NEON 汇编代码,如何将 BYTE 转换为浮点数?

使用内在函数将双 SSE2/AVX/AVX512 存储为浮点数的最佳方法