2013-04-04 50 views
2

正如我们在这里看到的“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  ; 
+0

这些天定点通常只使在其上浮点挑战的CPU,如低端微控制器感,并在具有明确固定点支撑的CPU(各种DSP家庭,一些SIMD架构) 。否则,只需使用浮点。 – 2013-04-04 16:23:56

+0

如果可能,您可以通过组合管道获得优势。你正在使用32位值还是SIMD正在进行?只有普通的ARM有'MLA','MUL'等,它们在32位值上执行。您可以在NEON核心中执行一次浮点计算,并使用ARM进行另一次修正。 – 2013-04-04 18:20:26

+0

@artlessnoise我只是想看看NEON的功能。做并行真的有帮助! – Wolfrum 2013-04-05 04:32:14

回答

2

了一套NEON说明,请参阅Vector Floating Point Instruction Set Quick Reference Card。没有专门的定点指令。

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

它声称:

使用定点算术对计算往往快于浮点 - 它需要较少的存储器带宽来读取和写入使用更少的比特值,以及整数值的乘法通常是比应用于浮点数的操作更快。

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

+0

在上面指出的例子中,“使用更少的位”非常重要,该示例使用32位作为浮点,而使用16位作为固定点。在我的情况下,我使用32位浮点和定点。 – Wolfrum 2013-04-05 08:44:29

+0

@Wolfrum好东西或坏东西?投票还是投票? – auselen 2013-04-08 08:27:33