J'écris une application qui lit de grands tableaux de flottants et effectue quelques opérations simples avec eux. J'utilise des flottants parce que je pensais qu'ils seraient plus rapides que les doubles, mais après avoir fait quelques recherches, j'ai découvert qu'il y avait une certaine confusion à ce sujet. Quelqu'un peut-il m'éclairer à ce sujet ?
Réponses
Trop de publicités?La réponse courte est "utilisez la précision requise pour obtenir des résultats acceptables".
Votre seule garantie est que les opérations effectuées sur des données en virgule flottante sont effectuées au moins dans le membre de plus haute précision de l'expression. Ainsi, la multiplication de deux float est fait avec au moins la précision de float et en multipliant a float et un double se ferait avec au moins une double précision. La norme stipule que " les opérations [à virgule flottante] peuvent être effectuées avec une précision supérieure à celle du type de résultat de l'opération. "
Étant donné que le JIT pour .Net tente de laisser vos opérations en virgule flottante dans la précision demandée, nous pouvons jeter un coup d'œil à la documentation d'Intel pour accélérer nos opérations. Sur la plate-forme Intel, vos opérations en virgule flottante peuvent être effectuées dans une précision intermédiaire de 80 bits, puis converties dans la précision demandée.
Extrait du guide d'Intel sur les opérations à virgule flottante en C++. 1 (désolé, je n'ai qu'un arbre mort), ils mentionnent :
- Utilisez un type à précision unique (par exemple, float), à moins que la précision supplémentaire obtenue par double ou long double ne soit nécessaire. Les types à plus grande précision augmentent la taille de la mémoire et les besoins en bande passante. ...
- Évitez les expressions arithmétiques de type de données mixtes
Ce dernier point est important car vous pouvez vous ralentir avec des transferts inutiles vers/depuis des flottes et des doubles. Le résultat est un code JIT qui demande au x87 de quitter son format intermédiaire de 80 bits entre les opérations !
1. Oui, il est écrit C++, mais la norme C# et la connaissance du CLR nous permettent de savoir que les informations pour C++ devraient être applicables dans ce cas.
Je viens de lire le manuel "Microsoft .NET Framework-Application Development Foundation 2nd" pour l'examen MCTS 70-536 et il y a une note à la page 4 (chapitre 1) :
NOTE Optimisation des performances avec les types intégrés
Le moteur d'exécution optimise les performances des types entiers 32 bits (Int32 et UInt32). Utilisez donc ces types pour les compteurs et autres variables intégrales à accès fréquent. Pour les opérations en virgule flottante, Double est le type le plus efficace car ces opérations sont optimisées par le matériel.
C'est écrit par Tony Northrup. Je ne sais pas s'il fait autorité ou non, mais je m'attendrais à ce que le livre officiel de l'examen .NET ait un certain poids. Il ne s'agit bien sûr pas d'une garantie. J'ai simplement pensé l'ajouter à cette discussion.
J'ai présenté une question similaire il y a quelques semaines. L'essentiel est que pour le matériel x86, il n'y a pas de différence significative entre les performances des flottants et celles des doubles, à moins que la mémoire ne soit saturée ou que vous commenciez à rencontrer des problèmes de cache. Dans ce cas, les flottants auront généralement l'avantage car ils sont plus petits.
Les processeurs Intel actuels effectuent toutes les opérations en virgule flottante dans des registres de 80 bits de large, de sorte que la vitesse réelle du calcul ne devrait pas varier entre les flottants et les doubles.
Si les opérations de chargement et de stockage constituent le goulot d'étranglement, les flottants seront plus rapides, car ils sont plus petits. Si vous effectuez un nombre important de calculs entre les chargements et les stockages, le rapport devrait être à peu près égal.
Quelqu'un d'autre a mentionné qu'il fallait éviter les conversions entre float et double, et les calculs qui utilisent des opérandes des deux types. C'est un bon conseil, et si vous utilisez des fonctions de la bibliothèque mathématique qui renvoient des doubles (par exemple), garder tout en double sera plus rapide.
- Réponses précédentes
- Plus de réponses