2013-08-12 29 views
6

Czy można włączać/wyłączać opcję -ffast-matath w czasie wykonywania? Na przykład, tworzenie klas FastMath i AccurateMath ze wspólną matematyczną klasą podstawową, aby można było używać obu implementacji w czasie wykonywania? To samo dotyczy flashowania podnormałów do zera, itp.Dynamic -ffast-matath

W szczególności nie wiem, czy kompilacja z opcją -ffast-math wyemitowałaby instrukcję, która po uruchomieniu wpłynęłaby na wszystkie obliczenia numeryczne w wątku (na przykład ustawienie flaga do opróżniania podnormałów do zera).

+13

Należy skompilować dwie wersje, jedną z optymalizacją i jedną bez. Następnie połącz je i wybierz, które wywoływać w czasie wykonywania. – Mysticial

+2

To niefortunne, że http://stackoverflow.com/questions/7420665/what-does-gccs-ffast-math-actually-daje tylko jeden przykład, ale efekt '-ffast-matath' jest w większości (w całości?) wybory w czasie kompilacji, takie jak kompilowanie '/ 10' jako' * 0.1' lub "upraszczanie" 'a + bab' na' 0' (nie jest to zero dla obliczeń IEEE 754). Dlatego, jak mówi Mysticial, nie ma sposobu, aby włączyć i wyłączyć flagę w czasie wykonywania: musisz skompilować dwie wersje, jeśli tego naprawdę chcesz. –

+1

@Mysticial dokonaj komentarza w odpowiedzi - to jedyna wiadomość ... – ldrumm

Odpowiedz

3

Spróbuj tego:

gcc -ffast-math -c first.c 
gcc -c second.c 
gcc -o dyn_fast_math first.o second.o 

Umieszczenie wyjątkowo nazwach funkcji w first.c i second.c. To powinno wystarczyć. Rzadko występuje "globalny" wpływ optymalizacji kompilatora. Jeśli taki istnieje, połączenie prawdopodobnie zakończy się niepowodzeniem z powodu konfliktu.

Próbowałem małej próbki bez problemu.

Oto przykład.

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; 
} 

kompilacja

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 

Sprawdź differe nce między first.s i second.s a znajdziesz to:

movapd %xmm1, %xmm2 
divsd %xmm0, %xmm2 
movapd %xmm2, %xmm0 

zmian do tego:

mulsd %xmm1, %xmm0 

Obie funkcje są wywoływane i zwracają oczekiwanego rezultatu.

+1

Dzięki. Zastanawiam się jednak, czy coś takiego jest wykonalne bez zmiany systemu kompilacji, który w moim przypadku zawiera dziesiątki na skryptach w stylu makefile dla tysięcy plików źródłowych. Czy istnieje szybka matematyka #pragma? Googling prowadzi do raportu o błędzie, który twierdzi, że taka pragma powinna działać w GCC, ale nie. – Michael

+0

Ah, nie wiem o pragma lub w inny sposób. Dokonaj modyfikacji podpór ustawień określonych celów, jeśli to pomaga. – ash

4

Jeśli nie chcesz błoto z systemem gromadzenia, można wykonać następujące czynności:

#pragma fast-math push 
#pragma fast-math on 
[..] 
#pragma fast-math pop 

GCC może mieć nieco inną składnię, ale bym się spodziewał, że to też możliwe.