我在Ubuntu中同时使用gcc10和clang12。我刚刚发现,如果我启用-ffast-math标志,在我的C++项目中,性能将提高大约4倍。
但是,如果我只在编译时而不是在链接时启用-ffast-math,那么性能就不会有任何改善。在链接时使用-ffast-math意味着什么,它会链接到系统中的任何特殊ffast-math库吗?
P.S:这种性能的提高实际上使性能正常。我曾经问过一个question关于英特尔处理器上AVX指令性能不佳的问题。现在只要我使用-ffast-math标志在Linux上编译和链接程序,就可以使性能正常,但是即使在windows上使用clang和-ffast-math,性能仍然很差。所以我想知道我是否在Linux下链接到任何特殊的系统库。
发布于 2021-08-26 12:30:10
但是,如果我只在编译时启用
,而不是在链接时启用
-ffast-math,那么性能就不会有任何改善。在链接时使用-ffast-math意味着什么,它会链接到系统中的任何特殊的数学库吗?
结果表明,当为链接器(无文档化特性)指定gcc时,-ffast-math确实在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/SSE 2/SSE3代码中的浮点例外
大多数涉及隐藏浮点异常的特殊情况都在硬件中得到有效处理。当执行SSE/SSE 2/SSE3代码时发生屏蔽溢出异常时,处理器硬件可以处理它而不影响性能。
底流异常和非规范源操作数通常根据IEEE 754规范进行处理,但这可能会导致显着的性能延迟。如果程序员愿意将纯粹的IEEE754遵从性转换为速度,则将提供两种非IEEE 754兼容模式,以加速频繁发生下流和输入的情况:FTZ模式和DAZ模式。
当启用FTZ模式时,下流结果将自动转换为零,并带有正确的符号。尽管此行为不符合IEEE 754,但在性能比IEEE 754遵从性更重要的应用程序中提供。由于在启用FTZ模式时不产生反正法结果,所以在FTZ模式中唯一可以遇到的异常浮点数字是那些指定为常量(只读)的数字。
在运行SIMD浮点应用程序时,提供了DAZ模式来有效地处理非正常源操作数。当启用DAZ模式时,输入正态被视为具有相同符号的零。启用DAZ模式是处理异常浮点常数的方法,而perfor是目标。
如果偏离IEEE 754规范是可以接受的,并且性能是关键的,那么在启用FTZ和DAZ模式的情况下运行SSE/SSE 2/SSE3应用程序。
https://stackoverflow.com/questions/68938175
复制相似问题