【问题标题】:arm-none-eabi-gcc not inferring floating point multiply-accumulate from codearm-none-eabi-gcc 不从代码中推断浮点乘法累加
【发布时间】:2019-09-21 07:59:18
【问题描述】:

ARM fpv5 指令集支持双精度浮点运算,包括 ISA 文档中详述的单周期乘法累加指令 (VMLA/VMLS)。

很遗憾,我无法让我的代码在任何 C 应用程序中使用此指令。

这是一个简单的例子:

float64_t a=0, b=0, c=0;

while(1)
{
        b += 1.643;
        c += 3.901;
        a += b * c; // multiply accumulate???

        do_stuff(a) // use the MAC result

}

上面的代码为(我认为应该是的)MAC 操作生成以下程序集

170               a += b * c;
00000efe:   vldr    d6, [r7, #64]   ; 0x40
00000f02:   vldr    d7, [r7, #56]   ; 0x38
00000f06:   vmul.f64        d7, d6, d7
00000f0a:   vldr    d6, [r7, #72]   ; 0x48
00000f0e:   vadd.f64        d7, d6, d7
00000f12:   vstr    d7, [r7, #72]   ; 0x48

如您所见,它分别执行乘法和加法步骤。 编译器不能在这里使用VMLA.f64 指令有充分的理由吗?

  • 目标:ARM Cortex M7 (NXP iMXRT1051)
  • 工具链:arm-none-eabi-gcc(用于 Arm 嵌入式处理器的 GNU 工具 8-2018-q4-major)8.2.1 20181213(发布)[gcc-8-branch 修订版 267074]

【问题讨论】:

  • 对此不是很了解,但从逻辑上讲,要确保 MAC 是您想要的东西要困难得多。只进行乘法然后相加可能更安全,成本也不会更高。

标签: gcc arm compiler-optimization cortex-m


【解决方案1】:

解决了。这是优化级别。当设置为 -O3 时,指令更改为正确使用 MAC。

我认为利用硬件加速(例如 FPU)不会依赖于优化级别,因为它本质上是“免费的”,但我想我错了。

【讨论】:

  • 请注意,由于精度的细微差别,您可能需要使用 -ffast-math 来获得诸如乘法累加之类的融合指令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2016-05-01
相关资源
最近更新 更多