正如我们在这里看到的“手臂整数 NEON 运算周期”和手臂浮点 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 ;