正如我们在这里看到的“arm integer NEON operations cycles”和手臂浮动NEON运算周期一样,整数乘法运算似乎没有浮点乘法运算的确定优势。当我将浮点代码转换为固定点时,我必须在定点乘法/除法指令后添加额外的“移位”指令。由于指令的增加,程序所需的周期实际上增加了。由于固定点,我的计划表现恶化。 (浮点代码14000周期,定点代码26000周期)。NEON固定点编码和固定浮点运算性能比较
是否有专门的NEON指令专门用于定点操作(乘法和除法)?我只找到一条只是转换Fixed -float的指令。 在NEON中编写定点程序是否有效?
我为浮点代码编写了下面的示例代码。
VMUL Q14.F32,Q8.F32,Q2.F32
VMUL Q15.F32,Q8.F32,Q3.F32
VLD2 {Q10.F32,Q11.F32},[[email protected]],TwdStep
VLD2 {Q4.F32,Q5.F32},[[email protected]],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},[[email protected]],TwdStep
VLD2 {Q4.S32,Q5.S32},[[email protected]],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架构) 。否则,只需使用浮点。 – 2013-04-04 16:23:56
如果可能,您可以通过组合管道获得优势。你正在使用32位值还是SIMD正在进行?只有普通的ARM有'MLA','MUL'等,它们在32位值上执行。您可以在NEON核心中执行一次浮点计算,并使用ARM进行另一次修正。 – 2013-04-04 18:20:26
@artlessnoise我只是想看看NEON的功能。做并行真的有帮助! – Wolfrum 2013-04-05 04:32:14