【问题标题】:What happens if "-ffast-math" is enabled when linking?如果在链接时启用“-ffast-math”会发生什么?
【发布时间】:2021-08-26 12:02:22
【问题描述】:

我在 Ubuntu 中同时使用 gcc10 和 clang12。我刚刚发现,如果我启用-ffast-math标志,在我的C++项目中,会有大约4倍的性能提升。

但是,如果我只在编译时启用-ffast-math 而不是在链接时启用,则不会有性能提升。链接时使用-ffast-math是什么意思,会不会链接到系统中任何特殊的ffast-math库?

P.S:这个性能改进实际上使性能正常。我曾经向question 询问过英特尔处理器上 AVX 指令性能不佳的问题。现在我在Linux上只要使用-ffast-math标志编译链接程序就可以使性能正常,但是即使我在windows上使用clang和-ffast-math,性能仍然很差。所以我想知道我是否链接到了Linux下的任何特殊系统库。

【问题讨论】:

标签: c++ gcc linker clang


【解决方案1】:

但是,如果我只在编译时而不是在链接时启用-ffast-math,则不会有性能提升。链接时使用-ffast-math是什么意思,会不会链接到系统中任何特殊的ffast-math库?

当为链接器指定 -ffast-math 时,gcc 确实链接到 crtfastmath.o(未记录的功能)。

对于x86 参见https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/i386/crtfastmath.c#L83,它设置了以下CPU 选项:

#define MXCSR_DAZ (1 << 6)  /* Enable denormals are zero mode */
#define MXCSR_FTZ (1 << 15) /* Enable flush to zero mode */

非规范化浮点数的处理速度要慢得多,因此在 CPU 中禁用它们会使浮点计算更快。

来自 Intel 64 和 IA-32 架构优化参考手册:

6.5.3 清零和非正规化为零模式

清零 (FTZ) 和非规范化为零 (DAZ) 模式与 IEEE 标准 754 不兼容。提供它们是为了提高下溢常见和生成非规范化的应用程序的性能结果不是必需的。

3.8.3.3 SSE/SSE2/SSE3 代码中的浮点异常

大多数涉及屏蔽浮点异常的特殊情况都在硬件中得到有效处理。当在执行 SSE/SSE2/SSE3 代码时发生掩码溢出异常时,处理器硬件可以处理它而不会降低性能。

下溢异常和非规范化源操作数通常根据 IEEE 754 规范进行处理,但这会导致显着的性能延迟。如果程序员愿意以纯 IEEE 754 合规性换取速度,则提供两种非 IEEE 754 合规模式来加快下溢和输入频繁的情况:FTZ 模式和DAZ 模式。

启用FTZ 模式时,下溢结果会自动转换为具有正确符号的零。尽管此行为不符合 IEEE 754,但它提供用于性能比 IEEE 754 合规性更重要的应用程序。由于启用FTZ 模式时不会产生非正规结果,因此在FTZ 模式下可以遇到的唯一非正规浮点数是指定为常量(只读)的浮点数。

DAZ 模式用于在运行 SIMD 浮点应用程序时有效地处理非规范源操作数。当DAZ 模式被启用时,输入非正规将被视为具有相同符号的零。当以性能为目标时,启用DAZ 模式是处理非正规浮点常量的方法。

如果可以接受偏离 IEEE 754 规范并且性能至关重要,请在启用 FTZDAZ 模式的情况下运行 SSE/SSE2/SSE3 应用程序。

【讨论】:

  • 谢谢!我想知道它是否仅适用于Linux? Windows下有类似的吗?
  • @TianZerL 这就是gcc 所做的,它似乎是特定于 CPU 的,而不是特定于操作系统的。使用 -v gcc 选项查看它链接的确切内容。
  • 好吧,微软不应该提供类似的库,所以mingw64 gcc和clang都不能通过使用-ffast-math标志编译和链接我的程序在Windows下获得性能提升。
  • @TianZerL crtfastmath.o 带有编译器,而不是操作系统。
  • crtfastmath.o 也可用于 Windows 上的 gcc
猜你喜欢
  • 2019-09-22
  • 2021-11-26
  • 2016-03-25
  • 2013-08-14
  • 2018-08-03
  • 2016-03-07
  • 2013-12-10
  • 2011-11-17
  • 2012-12-17
相关资源
最近更新 更多