Динамический -перед математикой

Можно ли по выбору включать -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 может иметь немного другой синтаксис, но я ожидаю, что это тоже возможно.

Другие вопросы по тегам