【发布时间】:2013-03-26 18:22:02
【问题描述】:
正如我们在此处看到的“arm integer NEON operations cycles”和 arm float NEON 运算周期,整数乘法运算似乎没有浮点乘法运算明显的优势。当我将浮点代码转换为定点时,我必须在定点乘法/除法指令之后添加额外的“移位”指令。由于指令的增加,程序所需的周期实际上增加了。由于定点,我的程序的性能恶化了。 (浮点代码为 14000 个周期,定点代码为 26000 个周期)。
NEON 是否有专门用于定点运算(乘法和除法)的特殊指令?我只找到了一条指令,它只转换 Fixed -float 和其他方式。 有没有在 NEON 中编写定点程序的有效方法?
我为浮点代码编写了以下示例代码。
VMUL Q14.F32,Q8.F32,Q2.F32
VMUL Q15.F32,Q8.F32,Q3.F32
VLD2 {Q10.F32,Q11.F32},[pTw2@256],TwdStep
VLD2 {Q4.F32,Q5.F32},[pT1@256],fftSize
VMLA Q14.F32,Q9.F32,Q3.F32
VMLS Q15.F32,Q9.F32,Q2.F32
通过在 VMUL A 指令之后插入移位操作,将以下代码转换为定点代码。
VMUL Q14.S32,Q8.S32,Q2.S32
VMUL Q15.S32,Q8.S32,Q3.S32
VLD2 {Q10.S32,Q11.S32},[pTw2@256],TwdStep
VLD2 {Q4.S32,Q5.S32},[pT1@256],fftSize
VMLA Q14.S32,Q9.S32,Q3.S32
VMLS Q15.S32,Q9.S32,Q2.S32
VRSHR Q14.S32,Q14.S32,#12 ;Shift instructions to account for fixed point
VRSHR Q15.S32,Q15.S32,#12 ;
【问题讨论】:
-
现在,定点通常只在面临浮点挑战的 CPU 上有意义,例如低端微控制器,以及明确支持定点的 CPU(各种 DSP 系列,一些 SIMD 架构) )。否则只使用浮点数。
-
如果可能,您可以通过组合管道获得优势。您使用的是 32 位值还是正在进行 SIMD?只是普通的 ARM 有
MLA、MUL等,它们在 32 位值上执行。您可以在 NEON 内核中进行一次浮动计算,并在 ARM 中进行另一次固定。 -
@artlessnoise 我只是想看看 NEON 的能力。并行操作真的很有帮助!!
-
对不起,我对NEON不熟悉。寄存器是 64 位的,所以你同时做两个操作。我的观点是,您可以在 NEON 单元也在运行代码的同时使用 ARM 整数单元进行一些计算;看起来这不适用于您的 FFT。
标签: floating-point embedded arm neon fixed-point