我正在使用浮点数学比较信号处理库的输出,浮点数学是使用例如AArch64(ARMv8)构建的。 gcc 4.9。
根据优化级别会出现差异。未优化的构建(O0)计算相对于ARMv7引用的位精确结果。在ARMv7环境中,“O2”构建未在浮点计算中引入偏差。 这不是ARMv8的情况。优化的构建实际上计算出不同的结果。
编译器开关是否可用于保持非优化构建的精确性?
已在DragonBoard 410c(Cortex-A53)上进行了测试。
答案 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
。