2

正如我们在这里看到的“手臂整数 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     ;
4

1 回答 1

2

有关指令集,请参阅矢量浮点指令集快速参考NEON。没有专门的定点指令。

我建议您阅读blog.arm.com标题为 NEON 编码 - 第 3 部分:矩阵乘法/定点的帖子,它可能会给您一些尝试的想法。

它声称:

使用定点算法进行计算通常比浮点数更快——它需要更少的内存带宽来读取和写入使用更少位的值,并且整数值的乘法通常比应用于浮点数的相同运算更快。

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

于 2013-04-05T07:39:50.193 回答