Is it possible to selectively turn -ffast-math on/off during runtime? For example, creating classes FastMath and AccurateMath with the common base class Math, so that one would be able to use both implementations during runtime? Ditto for flashing subnormals to zero, etc.
In particular, I don't know whether compiling with -ffast-math would emit an instruction that would, once executed, affect all numerical computations in the thread (for example, setting a flag to flush subnormals to zero).
1a : marked by usually continuous and productive activity or change a dynamic city. b : energetic, forceful a dynamic personality. 2 or less commonly dynamical \ dī-ˈna-mi-kəl \ a : of or relating to physical force or energy.
adjective Also dy·nam·i·cal. pertaining to or characterized by energy or effective action; vigorously active or forceful; energetic: the dynamic president of the firm. Physics. of or relating to force or power.
If you don't want to muck with the build system, you can do the following:
#pragma fast-math push
#pragma fast-math on
[..]
#pragma fast-math pop
GCC may have a slightly different syntax, but I would expect it's possible too.
Try this:
gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
Putting uniquely-named functions in first.c and second.c. This should do the trick. There is rarely any "global" impact of a compiler optimization. If one does exist, linking will likely fail due to the conflict.
I tried a small sample without problem.
Here's an example.
first.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;
}
second.c
double second ()
{
double ddbl;
ddbl = 1.0;
ddbl /= 10.0;
return ddbl;
}
compilation
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
Check the difference between first.s and second.s and you'll find this:
movapd %xmm1, %xmm2
divsd %xmm0, %xmm2
movapd %xmm2, %xmm0
changes to this:
mulsd %xmm1, %xmm0
Both functions are called, and both return the expected result.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With