178 votes

Que fait réellement ffast-math de gcc ?

Je comprends que gcc --ffast-math Le drapeau peut augmenter considérablement la vitesse des opérations de flottement, et va au-delà des normes IEEE, mais je ne peux pas trouver d'informations sur ce qui se passe réellement quand il est activé. Quelqu'un peut-il expliquer certains détails et peut-être donner un exemple clair de la façon dont quelque chose changerait si le drapeau était activé ou désactivé ?

J'ai essayé de fouiller dans le S.O. pour des questions similaires mais je n'ai rien trouvé qui explique le fonctionnement de ffast-math.

305voto

Damon Points 26437

-ffast-math fait beaucoup plus que briser la stricte conformité IEEE.

Tout d'abord, bien sûr, il se casse une stricte conformité IEEE, permettant par exemple de réordonner les instructions pour obtenir quelque chose qui soit mathématiquement identique (idéalement) mais pas exactement identique en virgule flottante.

Deuxièmement, il désactive le site paramètre errno après les fonctions mathématiques à instruction unique, ce qui signifie qu'il faut éviter d'écrire dans une variable locale au thread (cela peut faire une différence de 100 % pour ces fonctions sur certaines architectures).

Troisièmement, il fait l'hypothèse que toutes les mathématiques sont finies ce qui signifie qu'aucun contrôle de NaN (ou zéro) n'est effectué à un endroit où il aurait des effets préjudiciables. Il est simplement supposé que cela ne va pas se produire.

Quatrièmement, il permet approximations réciproques pour la division et la racine carrée réciproque.

En outre, il désactive le zéro signé (le code suppose que le zéro signé n'existe pas, même si la cible le prend en charge) et les calculs d'arrondi, ce qui permet, entre autres, de plier les constantes au moment de la compilation.

Enfin, il génère du code qui suppose qu'aucune interruption matérielle ne peut se produire en raison de la signalisation/du piégeage mathématique (c'est-à-dire si ces derniers ne peuvent pas être désactivés sur l'architecture cible et, par conséquent, si les interruptions matérielles ne peuvent pas se produire). se produire ils ne seront pas traités).

111voto

Mysticial Points 180300

Comme vous l'avez mentionné, il permet des optimisations qui ne préservent pas la stricte conformité IEEE.

En voici un exemple :

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

à

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

L'arithmétique à virgule flottante n'étant pas associative, l'ordre et la factorisation des opérations affecteront les résultats en raison des arrondis. Par conséquent, cette optimisation n'est pas effectuée dans le cadre d'un comportement FP strict.

Je n'ai pas encore vérifié si GCC fait réellement cette optimisation particulière. Mais l'idée est la même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X