2015-01-25 11 views
14

GCC stwierdza, że ​​-funsafe-math-optimizations pozwala na optymalizacje, które "(a) zakładają, że argumenty i wyniki są prawidłowe i (b) mogą naruszać standardy IEEE lub ANSI", ale to nie jest zbyt dokładne, prawda?Jakie optymalizacje są uwzględnione w optymalizacjach -funsafe-matematycznych?

Co może być "nieważny" argument w tym przypadku? NaNs? Infinites? Podnormały? Liczby ujemne do sqrt()?

Na ile wyniki mogą odbiegać od standardów IEEE lub ANSI? Czy jest to "po prostu" materiał taki jak operation associativity and ordering, czy może to np. prawdziwe porównania z NaN lub nieprawidłowe porównania z nieskończonymi? Czy zmienna przechowywana może zostać ponownie zaokrąglona po użyciu (tak, aby dla zmiennych można było ocenić 1)? Czy może przestać działać isinf()/isnan()?

Czy deweloperzy GCC postępują zgodnie z konkretnym systemem lub dyscypliną w odniesieniu do takich pytań, czy też odpowiedź może różnić się w różny sposób w zależności od wersji?

+0

O ile mi wiadomo, nie zadzieraj z tym. Jednakże '-ffinite-math-only' i' -ffast-matath'. – harold

Odpowiedz

3

Według gcc.gnu.org (mój bold):

Ten tryb umożliwia optymalizacje, które pozwalają arbitralne reassociations i transformacje bez dokładność gwarantuje. Nie próbuje także zapisać znaku zer.

Obejmuje swoją wzmianki associative reordering, jak również „wbudowanych funkcji [który] mają nazwy takie jak __builtin_sqrt” stosowane gdy „może mieć mniejszą precyzję lub być ograniczone do mniejszej domenie”

+0

Być może jest to po prostu błąd w implementacji i/lub dokumentacji, ale rzeczywistość nie pasuje do tego, co opisujesz, ponieważ obserwuję GCC tylko optymalizując wywołanie 'floor()' do instrukcji 'roundsd' kiedy' -funsafe- "matematyka-optymalizacja" jest włączona, nawet jeśli ta instrukcja nie może rozsądnie naruszyć ograniczeń, które opisujesz, widząc, że ta pojedyncza instrukcja jest również implementacją funkcji 'floor()' w glibc dla procesorów SSE4.1 +. Będę musiał zbadać. – Dolda2000

+0

Wygląda na to, że optymalizacja "roundsd" jest włączona tylko z opcją '-fno-trap-math', która jest częścią' -funsafe-math-optimizations'. Według osób znajdujących się na liście mailingowej GCC, to ograniczenie wydaje się jednak zbyt ostrożne, więc wydaje się, że nie ma powodu, aby sądzić, że oznacza to mniejsze bezpieczeństwo, niż wynika z tej odpowiedzi. Po tym wyjaśnieniu zaznaczam to jako zaakceptowane. – Dolda2000