【问题标题】:NEON Fixed point coding and Fixed vs Floating point operations performance comparisonNEON 定点编码和定点与浮点操作性能比较
【发布时间】:2013-03-26 18:22:02
【问题描述】:

正如我们在此处看到的“arm integer NEON operations cycles”和 arm float 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     ;

【问题讨论】:

  • 现在,定点通常只在面临浮点挑战的 CPU 上有意义,例如低端微控制器,以及明确支持定点的 CPU(各种 DSP 系列,一些 SIMD 架构) )。否则只使用浮点数。
  • 如果可能,您可以通过组合管道获得优势。您使用的是 32 位值还是正在进行 SIMD?只是普通的 ARM 有 MLA、MUL 等,它们在 32 位值上执行。您可以在 NEON 内核中进行一次浮动计算,并在 ARM 中进行另一次固定。
  • @artlessnoise 我只是想看看 NEON 的能力。并行操作真的很有帮助!!
  • 对不起,我对NEON不熟悉。寄存器是 64 位的,所以你同时做两个操作。我的观点是,您可以在 NEON 单元也在运行代码的同时使用 ARM 整数单元进行一些计算;看起来这不适用于您的 FFT。

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


【解决方案1】:

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

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

它声称:

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

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

【讨论】:

  • 在上面指出的示例中,“使用更少的位”很重要,该示例将 32 位用于浮点,而将 16 位用于定点。就我而言,我将 32 位用于浮点和定点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2011-02-23
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多