使用 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
.
我正在比较使用浮点数学的信号处理库的输出,它是为 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
.