Amm*_*mar 4 assembly arm vectorization atan2 neon
我想用霓虹灯指令SIMD和臂组件计算4点的幅度和角度.在大多数语言中都有一个内置库,在我的例子中是C++,它计算角度(atan2),但只计算一对浮点变量(x和y).我想利用处理q寄存器的SIMD指令来计算atan2的4个值的向量.
要求精度不高,速度更重要.
我已经有一些汇编指令来计算4个浮点寄存器的幅度,我的应用程序的准确度可以接受.q1包含4"x"值(x1,x2,x3,x4).q2包含4个"y"值(y1,y2,y3,y4).q7包含4个结果的大小(x1 ^ 2 + y1 ^ 2,x2 ^ 2 + y2 ^ 2,x3 ^ 2 + y3 ^ 2,x4 ^ 2 + y4 ^ 2).
vmul.f32 q7, q1, q1  
vmla.f32 q7, q2, q2    
vrecpe.f32  q7, q7   
vrsqrte.f32 q7, q7 
使用SIMD指令计算两个向量的近似atan2的最快方法是什么?
有关现有的单值浮点实现,请参见math-neon.由于它没有(或很少)条件,它应该很好地转换为SIMD实现.
由于ARM NEON没有直接计算它的指令,因此有各种技术可以创建比Taylor系列更好的近似.具体地,min-max方法给出了用于近似的良好多项式候选. min-max是指最小化最大误差; 与Chebyshev近似通常非常好.
DSP大师对功能近似的不同方法有详细说明.网上也有很多书.您可以使用matlab,octave或其他工具包搜索最佳多项式.通常,您需要将其与范围和精度绑定.一旦你有一个单一值的好算法,将它扩展到任何类型的SIMD应该是微不足道的.
问题计算atan2引用了Apple的atan.c源代码.代码中的系数很可能来自我上面给出的内容.这段代码的问题在于它不能很好地扩展到SIMD,因为atan()近似是分段的,并且根据范围需要不同的系数.对于您的SIMD,您需要在整个范围内使用相同的系数(乘数,除数,方程).
Abramowitz和Stegun:"数学函数手册"有一章关于圆函数,第4.4.28节给出了对数公式.这似乎与eglibc实现类似.
| 归档时间: | 
 | 
| 查看次数: | 1944 次 | 
| 最近记录: |