在XCode中将denormal flush设置为零(FTZ)

时间:2013-05-25 07:09:41

标签: xcode performance gcc

我正在使用XCode在OS X Mountain Lion上使用C ++进行开发,以便在本地计算机上运行。我遇到与非正规数有关的性能问题,我希望设置FTZ标志,以便将它们刷新为零。 (我已经检查过denormals确实是问题,将它们刷新为零不会导致我的情况下的准确性问题。)但是,我找不到任何关于如何在XCode中实现这一点的信息。这是我可以在构建设置中更改的选项吗?或者我应该在某处输入一些代码?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

如果我正确理解“/usr/include/fenv.h”中的注释,

#include <fenv.h>
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);

应该做你想做的事。

    FE_DFL_DISABLE_SSE_DENORMS_ENV

    A pointer to a fenv_t object with the default floating-point state modifed
    to set the DAZ and FZ bits in the SSE status/control register.  When using
    this environment, denormals encountered by SSE based calculation (which
    normally should be all single and double precision scalar floating point
    calculations, and all SSE/SSE2/SSE3 computation) will be treated as zero.
    Calculation results that are denormals will also be truncated to zero.

设置此选项可将Why does changing 0.1f to 0 slow down performance by 10x?(@Mysticial在评论中给出的链接)中的程序运行时间从27秒减少到0.3秒 (MacBook Pro,2.5 GHz Intel Core 2 Duo)。