动态 - 数学 - 数学

Mic*_*ael 6 c optimization performance gcc fast-math

是否可以在运行时选择性地打开/关闭-ffast-math?例如,使用公共基类Math创建类FastMath和AccurateMath,以便一个人能够在运行时使用这两个实现?将次正常闪烁归零等同样如此.

特别是,我不知道使用-ffast-math进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将subnormals刷新为零).

TTi*_*imo 6

如果您不想使用构建系统,您可以执行以下操作:

#pragma fast-math push
#pragma fast-math on
[..]
#pragma fast-math pop
Run Code Online (Sandbox Code Playgroud)

GCC 的语法可能略有不同,但我希望它也是可能的。

  • 只是为了避免其他人用谷歌搜索;MS编译器也有这样的编译指示:https://learn.microsoft.com/en-us/cpp/preprocessor/float-control?view=vs-2019 (2认同)

ash*_*ash 3

尝试这个:

gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
Run Code Online (Sandbox Code Playgroud)

将唯一命名的函数放入first.c 和second.c 中。这应该可以解决问题。编译器优化很少有任何“全局”影响。如果确实存在,链接可能会因冲突而失败。

我尝试了一个小样本,没有问题。

这是一个例子。

首先.c

extern double second();

double  first ()
{
    double  dbl;

    dbl = 1.0;
    dbl /= 10.0;

    return  dbl;
}

int main ()
{
    printf("first = %f\n", first());
    printf("second = %f\n", second());

    return  0;
}
Run Code Online (Sandbox Code Playgroud)

第二个.c

double  second ()
{
    double  ddbl;

    ddbl = 1.0;
    ddbl /= 10.0;

    return  ddbl;
}
Run Code Online (Sandbox Code Playgroud)

汇编

gcc -S first.c
gcc -c first.s
gcc -ffast-math -S second.c
gcc -ffast-math -c second.s
gcc -o prog first.o second.o
Run Code Online (Sandbox Code Playgroud)

检查first.s和second.s之间的区别,你会发现:

movapd  %xmm1, %xmm2
divsd   %xmm0, %xmm2
movapd  %xmm2, %xmm0
Run Code Online (Sandbox Code Playgroud)

对此进行更改:

mulsd   %xmm1, %xmm0
Run Code Online (Sandbox Code Playgroud)

这两个函数都被调用,并且都返回预期结果。