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

Retain bit-exact floating point calculations on AArch64 with O2

我正在比较使用浮点数学的信号处理库的输出,它是为 AArch64 (ARMv8) 构建的,使用例如海湾合作委员会 4.9.

根据优化级别会出现差异。未优化的构建 (O0) 根据 ARMv7 参考计算精确到位的结果。在 ARMv7 环境中 'O2' 构建没有在浮点计算中引入偏差。 ARMv8 不是这种情况。优化构建实际上计算出不同的结果。

是否可以使用编译器开关来保持未优化构建的位精确性?

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

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

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

-ffp-contract=style

-ffp-contract=off disables floating-point expression contraction.

-ffp-contract=fast enables floating-point expression contraction such as forming of fused multiply-add operations if the target has native support for them.

-ffp-contract=on enables floating-point expression contraction if allowed by the language standard. This is currently not implemented and treated equal to -ffp-contract=off.

The default is -ffp-contract=fast.