NEON定点编码和固定与浮点运算性能比较

时间:2013-04-04 15:18:18

标签: floating-point embedded arm neon fixed-point

正如我们在这里看到的那样“arm integer NEON operations cycles”和arm浮动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     ;

1 个答案:

答案 0 :(得分:2)

请参阅Vector Floating Point Instruction Set Quick Reference Card了解NEON条指令集。没有专门的定点指令。

我建议你阅读标题为Coding for NEON - Part 3: Matrix Multiplication / 固定点blog.arm.com帖子,它可能会给你一些尝试的想法。

声称:

  
    

使用定点算法进行计算通常比浮点更快 - 读取和写入使用更少位的值需要更少的内存带宽,并且整数值的乘法通常比应用于浮点数的操作更快。 / p>          

但是,使用定点运算时,必须仔细选择表示以避免溢出或饱和,同时保持应用程序所需结果的精度。