首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果链接时启用了“-ffast-数学”,会发生什么情况?

如果链接时启用了“-ffast-数学”,会发生什么情况?
EN

Stack Overflow用户
提问于 2021-08-26 12:02:22
回答 1查看 306关注 0票数 4

我在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下链接到任何特殊的系统库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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选项:

代码语言:javascript
复制
#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规范是可以接受的,并且性能是关键的,那么在启用FTZDAZ模式的情况下运行SSE/SSE 2/SSE3应用程序。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68938175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档