在寻找了很长时间的性能错误之后,我读到了有关非正规浮点值的内容。
显然,非规范化浮点值可能是一个主要的性能问题,如本问题所示:为什么将 0.1f 更改为 0 会使性能降低 10 倍? https://stackoverflow.com/questions/9314534/why-does-changing-0-1f-to-0-slow-down-performance-by-10x
我有一个 Intel Core 2 Duo,我正在使用 gcc 进行编译,使用-O2
.
那我该怎么办?我可以以某种方式指示 g++ 避免非正规值吗?
如果没有,我可以以某种方式测试是否float
是非正常的吗?
等待。在执行任何操作之前,您是否真的知道您的代码遇到了非正规值,并且它们对性能产生了可衡量的影响?
假设您知道这一点,您是否知道如果关闭非正规支持,您正在使用的算法是否稳定?以 10 倍的速度得到错误答案通常并不是一个好的性能优化。
抛开这些问题不谈:
如果您想检测非正规值以确认它们的存在,您有几种选择。如果您有 C99 标准库或 Boost,则可以使用fpclassify
宏。或者,您可以将数据的绝对值与最小正正态数进行比较。
您可以将硬件设置为将非正规值刷新为零 (FTZ),或将非正规输入视为零 (DAZ)。如果您的平台正确支持它,最简单的方法可能是使用fesetenv( )
C 头文件中的函数fenv.h
。然而,这是 C 标准中支持最不广泛的功能之一,而且本质上是特定于平台的。您可能只想使用一些内联汇编直接将 FPU 状态设置为 (DAZ/FTZ)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)