【问题标题】:How to turn on Fused Multiply Add in GCC for ARM processor如何在 GCC 中为 ARM 处理器打开 Fused Multiply Add
【发布时间】:2017-08-27 15:39:10
【问题描述】:

在我的 C 程序中,我希望处理器使用 FMADD 指令而不是 MUL 和 ADD 来计算 a*b +c。我如何将此指定给编译器以执行此操作。另外我想在编译后在汇编代码中看到 FMADD 指令。

gcc 版本 4.9.2 ARM v7 处理器

【问题讨论】:

  • 使用 math.h 中的函数 fma,并确保将合适的 -march 标志传递给编译器。
  • 好的。有用。是否可以使用 FP_CONTRACT 和通常的 *, + 运算符而不是 fma ?我试过#pragma STDC FP_CONTRACT ON。它没有工作
  • 根据您的 -march 和 -ffp-contract 标志,您甚至可能不需要任何编译指示。默认情况下,gcc 会在原生支持 fma 的目标上进行收缩。
  • 添加-ffast-math 是否有助于让编译器通过加法和乘法生成它?
  • 我不相信 -ffast-math 有帮助。

标签: gcc arm


【解决方案1】:

您需要拥有以下 FPU 之一,

  • vfpv4
  • vfpv4-d16
  • fpv4-sp-d16
  • fpv5-sp-d16
  • fpv5-d16
  • 霓虹灯-vfpv4
  • fp-armv8
  • neon-fp-armv8
  • crypto-neon-fp-armv8

您必须使用 hard-float ABI 选项。

An example with integers.
An example with floats.

您不需要指定任何特殊的函数调用;如果编译器发现它们是有益的,它将使用该指令。


arm.c中负责生成的代码是,

case FMA:
  if (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA)

TARGET_FMA 是版本 '4' 或更好的 FPU。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2011-09-01
    • 2010-11-16
    • 2020-07-02
    • 2013-02-04
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多