2012-02-12 11 views
5

Pracuję dla platformy AVR i mam pytanie. Nie chcę, aby biblioteka zmiennoprzecinkowa była połączona z moim kodem, ale podoba mi się koncepcja posiadania wartości analogowych z zakresu 0.0 ... 1.0 zamiast 0 ... 255 i 0 ... 1023, w zależności od czy używam portu jako wejścia lub wyjścia.Optymalizacja zmiennoprzecinkowej kompilacji GCC

Postanowiłem więc pomnożyć argumenty funkcji wejściowych/wyjściowych przez odpowiednio 1023.0 i 255.0. Teraz moje pytanie brzmi: czy mogę wdrożyć podział takiego:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0))) 

będzie GCC (z flagą -O3 włączony) optymalizacji czasu kompilacji pływających mnożenia punktów, znane w czasie kompilacji i oddanych do integralną typ, na operacje całkowite? (Wiem, że podczas używania tych makr z niestałymi argumentami, optymalizacja nie jest możliwa, chcę tylko wiedzieć, czy zostanie to zrobione w drugim przypadku).

+1

nie powinien to być mnożenie, a nie podział? ('analog_out (7, 0.5)' staje się zapisem '0.5 * 255' do portu 7, zamiast zapisu 0 pocięte z 1/510) ... – Borealid

+0

tak, oczywiście :) Naprawiono. –

+3

Wypróbuj i przekonaj się! 'gcc -S' spowoduje utworzenie zrzutu zespołu. Prawdopodobnie potrzebujesz '-O2 -ffast-math', a nie' -O3' ('-O3' włącza optymalizacje, które prawie zawsze są net * lose *, jak over-aggressive inline, to ma być używane na jeden plik, w którym twój program spędza 90% czasu). – zwol

Odpowiedz

3

GCC powinien zawsze robić stałe składanie, jeśli podasz bit jako literał numeryczny. Jeśli chcesz kompilator egzekwować constness, można uciec z mniej więcej tak:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0)) 
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0))) 
2

Ogólnie rzecz biorąc, myślę, że gcc -O2 wykona wszystkie operacje arytmetyczne na stałe w czasie kompilacji.
Nie przekształci to w arytmetykę całkowitą - tylko na stałą liczbę całkowitą.

Użycie kodu może być niebezpieczne, zwłaszcza jeśli inne osoby zachowują kod. Sytuacja, w której przekazanie niestałego parametru do makra powoduje błąd, nie jest dobra.

+0

To nie powoduje błędu, po prostu chcę go zoptymalizować. –

Powiązane problemy