是否可以在运行时选择性地打开/关闭 -ffast-math?例如,使用通用基类 Math 创建 FastMath 和 AccurateMath 类,以便能够在运行时同时使用这两种实现?同上用于将次常态闪烁为零等。
特别是,我不知道使用 -ffast-math 进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将次正规数刷新为零)。
是否可以在运行时选择性地打开/关闭 -ffast-math?例如,使用通用基类 Math 创建 FastMath 和 AccurateMath 类,以便能够在运行时同时使用这两种实现?同上用于将次常态闪烁为零等。
特别是,我不知道使用 -ffast-math 进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将次正规数刷新为零)。
如果您不想破坏构建系统,可以执行以下操作:
#pragma fast-math push
#pragma fast-math on
[..]
#pragma fast-math pop
GCC 的语法可能略有不同,但我希望它也是可能的。
试试这个:
gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
将唯一命名的函数放在 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;
}
第二个.c
double second ()
{
double ddbl;
ddbl = 1.0;
ddbl /= 10.0;
return ddbl;
}
汇编
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
检查 first.s 和 second.s 之间的区别,您会发现:
movapd %xmm1, %xmm2
divsd %xmm0, %xmm2
movapd %xmm2, %xmm0
对此的更改:
mulsd %xmm1, %xmm0
这两个函数都被调用,并且都返回了预期的结果。