Maison >développement back-end >C++ >Pourquoi le remplacement de 0.1f par 0 entraîne-t-il une augmentation de 10 fois des performances de mon code ?

Pourquoi le remplacement de 0.1f par 0 entraîne-t-il une augmentation de 10 fois des performances de mon code ?

DDD
DDDoriginal
2024-12-19 18:13:15241parcourir

Why Does Replacing 0.1f with 0 Result in a 10x Performance Increase in My Code?

Influence des chiffres à virgule flottante anormaux sur les performances

Dans l'extrait de code fourni, une modification mineure qui semblait insignifiante a eu un impact significatif sur les performances : changer 0,1f à 0 a entraîné un ralentissement de 10x. Cette différence de performances résulte de la gestion des nombres à virgule flottante sous-normaux (dénormalisés).

Les nombres sous-normaux sont une approximation de zéro, étant plus petits que le plus petit nombre à virgule flottante normal pouvant être représenté. Ils résultent souvent d’opérations produisant de très petites valeurs. Les opérations sur les nombres anormaux sont notoirement lentes par rapport aux opérations sur les nombres à virgule flottante normalisés. En effet, de nombreux processeurs n'ont pas la capacité de gérer directement les nombres anormaux et doivent plutôt recourir à des routines de microcode plus lentes.

Examen numérique

Les deux extraits de code, l'un utilisant 0,1. f et l'autre utilisant 0, produisent des sorties différentes après des itérations répétées. Lors de l'utilisation de 0,1f, les valeurs convergent vers des valeurs non nulles proches de zéro. Cependant, lorsque vous utilisez 0, les valeurs convergent vers zéro lui-même. Cette différence de comportement numérique explique l'écart de performance.

Denormal Flushing

Pour vérifier que les nombres inférieurs à la normale sont responsables de la disparité de performances, nous pouvons les ramener à zéro en ajoutant la ligne suivante au début du code :

_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

Cela demande au processeur de traiter tous les nombres anormaux comme zéro. Avec cette modification, la différence de performances entre l'utilisation de 0,1f et 0 devient négligeable. Cela confirme que les nombres anormaux sont bien à l'origine du ralentissement.

Conclusion

Dans ce scénario, éviter la création de nombres anormaux en remplaçant 0,1f par 0 améliore considérablement performances en empêchant le processeur de s'engager dans des routines lentes et anormales de gestion des nombres. Cette optimisation rappelle l'impact parfois néfaste des nombres à virgule flottante dénormalisés sur les performances et l'importance de considérer leur présence potentielle dans les calculs numériques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn