Динамический -перед математикой
Можно ли по выбору включать -ffast-math во время выполнения? Например, создание классов FastMath и AccurateMath с общим базовым классом Math, чтобы можно было использовать обе реализации во время выполнения? То же самое для мигания субнормалей в ноль и т. Д.
В частности, я не знаю, будет ли компиляция с -ffast-math генерировать команду, которая после выполнения повлияет на все численные вычисления в потоке (например, установление флага для сброса субнормалей в ноль).
2 ответа
Попробуй это:
gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
Помещение функций с уникальными именами в first.c и second.c. Это должно сделать свое дело. Редко наблюдается какое-либо "глобальное" влияние оптимизации компилятора. Если таковой существует, связь, вероятно, потерпит неудачу из-за конфликта.
Я попробовал небольшой образец без проблем.
Вот пример.
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;
}
сборник
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
Обе функции вызываются, и обе возвращают ожидаемый результат.
Если вы не хотите портить систему сборки, вы можете сделать следующее:
#pragma fast-math push
#pragma fast-math on
[..]
#pragma fast-math pop
GCC может иметь немного другой синтаксис, но я ожидаю, что это тоже возможно.