【问题标题】:how to use the gcc preprocessor macro __FAST_MATH__?如何使用 gcc 预处理器宏 __FAST_MATH__?
【发布时间】:2017-03-31 12:22:27
【问题描述】:

man gcc(1) 说:选项 -ffast-math 导致预处理器宏 __FAST_MATH__被定义为。是否有关于该宏的进一步文档?

我希望这样的代码

#define __FAST_MATH__ blabla
y = pow(x,a);
#undef __FAST_MATH__

允许控制数学优化,细粒度到单个语句。

但是,我的测试表明

#define __FAST_MATH__
#define __FAST_MATH__ on

无论放在哪里,都会被忽略。

[EDIT] 即使将它们放在之前

,它们也会被忽略
#include <math.h>

“忽略”的意思是:没有可衡量的影响。而 -ffast-math 将我的测试代码加速了 3 倍。

【问题讨论】:

  • 如果使用-ffast-math,则定义__FAST_MATH__。这可能就是它的全部内容,并且没有进一步的影响。
  • 我猜头文件 math.h 在某处包含一些#ifdef __FAST_MATH?另外,我仍然认为编译器内部的某些东西与 -ffast-math 的行为不同。
  • 答案stackoverflow.com/questions/7420665/… 有很多关于标志实际作用的信息。
  • @Uli:确实,#ifdef __FAST_MATH__ 出现在 math.h、x86_64-linux-gnu/bits/mathinline.h 以及更多位置。它也出现在 Eigen3 或 boost/math 等独立项目中。
  • 如果它的细粒度控制你可能能够显式调用特定的库函数。例如,fdlibm 库有许多不同的入口点,用于每个数学函数的特定实现。它具有 SVID、X/OPEN 或 POSIX/ANSI 版本的不同功能。不过,您可能会失去便携性。

标签: math gcc optimization c-preprocessor


【解决方案1】:

-ffast-math 导致定义预处理器宏 __FAST_MATH__

它只是一个功能测试宏,即您可以根据是否指定-ffast-math 来使用条件编译:

#if defined (__FAST_MATH__)
/* Code to use with -ffast-math. */
#else
/* Code to use with -fno-fast-math. */
#endif /* -ffast-math ? */

在大多数情况下,您不需要条件编译,但如果您需要它,您可以方便地使用宏,并且不需要在代码中或在命令行上按-D 定义它。

此外,如果-ffast-math 开启,一些(系统)标头可能会依赖它并使用更快的代码。

更常见的此类宏是__OPTIMIZE____OPTIMIZE_SIZE__。前者是在优化开启时定义的(-Og-O1-O2-Os、...),后者在针对大小进行优化时根据 -Os 开启。

注意:只有在将-ffast-math 作为 multilib 选项引入时,才能在标准库中使用此类选项,以便指定它会链接 libc、libm、 libstdc++ 等,如 -m32 / -m64。您可以使用 gcc -print-multi-lib 在我的 x86_64 上显示多库布局:

.;
32;@m32

这意味着我们有 2 个变体,一个默认变体,一个用 -m32 选择。

【讨论】:

    【解决方案2】:

    我相信你把它弄反了。定义宏是为了让标准库使用数学函数的不同实现。

    自己定义它没有任何效果,实际上可能存在危险的错误,因为当编译器没有生成预期的代码时,程序将使用那些替代实现。

    【讨论】:

    • 在标准库中使用 __FAST_MATH__ 将无法按预期工作,因为您需要 -ffast-math 作为 multilib 选项,即您需要 2 个不同的变体(如果有更多的 multilib,则需要更多变体-f[no-]fast-math 分别选择的库的变体(例如 32 位、64 位等)。使用gcc -print-multi-lib 显示多库布局。 -ffast-math(将被编码为 @fast-math) 未提及。
    猜你喜欢
    • 2011-02-10
    • 2011-09-01
    • 1970-01-01
    • 2016-07-30
    • 2016-09-02
    • 2021-12-29
    • 2011-05-04
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多