it-swarm.it

Cosa fa realmente la matematica veloce di gcc?

Capisco gcc's --ffast-math flag può aumentare notevolmente la velocità delle operazioni mobili e va oltre gli standard IEEE, ma non riesco a trovare informazioni su ciò che sta realmente accadendo quando è attivo. Qualcuno può spiegare alcuni dettagli e forse dare un chiaro esempio di come cambierebbe qualcosa se la bandiera fosse accesa o spenta?

Ho provato a scavare attraverso S.O. per domande simili ma non riuscivo a trovare nulla che spiegasse il funzionamento della matematica veloce.

134
Ponml

Come accennato, consente ottimizzazioni che non preservano la rigorosa conformità IEEE.

Un esempio è questo:

x = x*x*x*x*x*x*x*x;

a

x *= x;
x *= x;
x *= x;

Poiché l'aritmetica in virgola mobile non è associativa, l'ordinamento e il factoring delle operazioni influenzeranno i risultati a causa dell'arrotondamento. Pertanto, questa ottimizzazione non viene eseguita in base al comportamento rigoroso FP.

In realtà non ho verificato per vedere se GCC effettivamente esegue questa particolare ottimizzazione. Ma l'idea è la stessa.

76
Mysticial

-ffast-math fa molto di più che rompere la rigida conformità IEEE.

Innanzitutto, ovviamente non si rompe rigorosa conformità IEEE, che consente ad es. il riordino delle istruzioni su qualcosa che è matematicamente lo stesso (idealmente) ma non esattamente lo stesso in virgola mobile.

In secondo luogo, disabilita impostazione errno dopo le funzioni matematiche a istruzione singola, il che significa evitare una scrittura su una variabile thread-local (questo può fare una differenza del 100% per quelle funzioni su alcune architetture ).

In terzo luogo, si assume che tutta la matematica è finita, il che significa che non vengono effettuati controlli per NaN (o zero) laddove avrebbero effetti dannosi. Si presume semplicemente che ciò non accadrà.

In quarto luogo, abilita approssimazioni reciproche per divisione e radice quadrata reciproca.

Inoltre, disabilita lo zero con segno (il codice presuppone che lo zero con segno non esista, anche se l'obiettivo lo supporta) e arrotondando la matematica, che consente tra l'altro una costante piegatura in fase di compilazione.

Infine, genera codice che presume che non possano verificarsi interruzioni hardware a causa della segnalazione/trapping matematico (ovvero, se questi non possono essere disabilitati sull'architettura di destinazione e di conseguenza succede, non verranno gestiti) .

226
Damon