2015-01-25 12 views
14

GCC's man page afferma che -funsafe-math-optimizations consente ottimizzazioni che "(a) presuppongono che argomenti e risultati siano validi e (b) possano violare gli standard IEEE o ANSI", ma non è molto preciso, vero?Che tipo di ottimizzazioni sono incluse in -funsafe-math-optimization?

Cosa potrebbe essere un argomento "non valido" in questo caso? NaN? Infiniti? Subnormals? Numeri negativi a sqrt()?

Quanto sono lontani i risultati consentiti per deviare dagli standard IEEE o ANSI? È "semplicemente" roba come operation associativity and ordering, o potrebbe includere ad es. confronti reali con NaNs o confronti scorretti con infiniti? Una variabile memorizzata può essere arrotondata dopo essere stata già utilizzata (in modo che, per variabilix e , (x == y) + (x == y) potrebbe valutare 1)? Potrebbe isinf()/isnan() smettere di funzionare?

Gli sviluppatori GCC seguono un particolare sistema o disciplina per quanto riguarda tali domande o la risposta potrebbe differire da una versione all'altra?

+0

Per quanto ne so, non ci scherza. '-ffinite-math-only' e' -ffast-math' fanno però. – harold

risposta

3

Secondo gcc.gnu.org (il mio grassetto):

Questa modalità permette ottimizzazioni che permettono reassociations arbitrarie e trasformazioni senza precisione garantisce. Inoltre, non prova a conservare il segno di zeri.

che include il tuo menzione di associative reordering, così come "funzioni incorporate [che] hanno nomi come __builtin_sqrt" essere applicata quando "possono avere meno di precisione o essere limitato a un dominio più piccolo"

+0

Forse questo è semplicemente un bug nell'implementazione e/o documentazione, ma la realtà non sembra corrispondere a ciò che descrivi, perché osservo GCC che ottimizza solo una chiamata 'floor()' a un'istruzione 'roundsd' quando' -funsafe- la funzione di ottimizzazione della matematica è abilitata, anche se questa istruzione non può violare ragionevolmente i vincoli che descrivi, visto che questa singola istruzione è anche l'implementazione della funzione 'floor()' in glibc per i processori SSE4.1 +. Dovrò indagare. – Dolda2000

+0

Apparentemente, l'ottimizzazione di 'roundsd' è abilitata solo con' -fno-trapping-math' che fa parte di '-funsafe-math-optimizations'. Secondo la gente sulla mailing list del GCC, questa limitazione sembra comunque essere eccessivamente cauta, quindi non sembra esserci alcuna ragione per pensare che ciò implichi meno sicurezza di quanto indica questa risposta. Con quello chiarito, sto marcandolo come accettato. – Dolda2000