使用O2保留AArch64上的位精确浮点计算

时间:2016-04-21 09:30:26

标签: c gcc arm arm64 fpu

我正在使用浮点数学比较信号处理库的输出,浮点数学是使用例如AArch64(ARMv8)构建的。 gcc 4.9。

根据优化级别会出现差异。未优化的构建(O0)计算相对于ARMv7引用的位精确结果。在ARMv7环境中,“O2”构建未在浮点计算中引入偏差。 这不是ARMv8的情况。优化的构建实际上计算出不同的结果。

编译器开关是否可用于保持非优化构建的精确性?

已在DragonBoard 410c(Cortex-A53)上进行了测试。

1 个答案:

答案 0 :(得分:1)

根据您对ARMv7-A版本的选择(如果您使用的是-mfpu=vfpv4或同等版本,这个答案可能是错误的)您看到的最可能的差异将是生成FMA操作。

要避免这种情况,请使用-ffp-contract=off。此选项的GCC documentation表示:

  

-ffp-contract=style

     

-ffp-contract=off禁用浮点表达式收缩。

     

-ffp-contract=fast启用浮点表达式收缩等   如果目标具有原生的,则形成融合的乘法 - 加法运算   支持他们。

     

-ffp-contract=on启用浮点表达式   如果语言标准允许收缩。目前还没有   实施和处理等于-ffp-contract=off

     

默认值为-ffp-contract=fast