Question

J'écris une application qui lit de grands tableaux de flotteurs et effectue quelques opérations simples avec eux. J'utilise des flotteurs, parce que je pensais que ce serait plus rapide que les doubles, mais après quelques recherches, j'ai constaté une certaine confusion à propos de ce sujet. Quelqu'un peut-il élaborer à ce sujet?

Était-ce utile?

La solution

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 à virgule flottante le sont au moins dans le membre de l’expression dont la précision est la plus élevée. Donc, multiplier deux float est effectué avec au moins la précision de float , et multiplier un float et un double serait fait avec au moins la double précision. La norme indique 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."

Etant donné que JIT for .NET tente de laisser vos opérations en virgule flottante avec la précision demandée, nous pouvons consulter 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 avec une précision intermédiaire de 80 bits et converties à la précision demandée.

Dans le guide d'Intel sur les opérations en virgule flottante C ++ 1 (ils n'ont malheureusement que l'arbre mort), ils mentionnent:

  
      
  • Utilisez un type à simple précision (par exemple, float) sauf si la précision supplémentaire obtenue par double ou long double est requise. Les types de précision plus élevés augmentent la taille de la mémoire et les besoins en bande passante.   ...
  •   
  • Évitez les expressions arithmétiques de types de données mixtes
  •   

Ce dernier point est important car vous pouvez ralentir. vous-même avec des distributions inutiles vers / depuis float et double , ce qui entraîne un code JIT qui demande au x87 de dissocier son format intermédiaire 80 bits entre les opérations!

1. Oui, cela dit C ++, mais la norme C # plus la connaissance du CLR nous permettent de savoir que les informations pour C ++ devraient être applicables dans cet exemple.

Autres conseils

Je viens de lire le fichier "Microsoft .NET Framework Application Development Foundation 2nd" " pour l'examen des SCTM 70-536 et une note à la page 4 (chapitre 1):

  

REMARQUE 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 fréquemment utilisées. 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 est une autorité ou non, mais je m'attendrais à ce que le livre officiel de l'examen .NET ait un certain poids. Ce n'est bien sûr pas une garantie. Je pensais juste que je l'ajouterais à cette discussion.

J'ai présenté une question similaire il y a quelques semaines. En fin de compte, pour le matériel x86, il n'y a pas de différence significative entre les performances des flottants par rapport aux doubles, sauf si vous êtes lié à la mémoire ou si vous commencez à vous heurter à un problème de cache. Dans ce cas, les flotteurs auront généralement l'avantage parce qu'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 flottants et doubles.

Si load & amp; les opérations en magasin sont le goulot d'étranglement, alors les flottants seront plus rapides, car ils sont plus petits. Si vous effectuez un nombre important de calculs entre les charges et les magasins, il devrait être à peu près égal.

Quelqu'un d'autre a mentionné éviter les conversions entre float & amp; double, et les calculs qui utilisent des opérandes des deux types. C'est un bon conseil. Si vous utilisez des fonctions de bibliothèque mathématique qui renvoient des doublons (par exemple), le fait de tout conserver en double sera plus rapide.

J'écris un traceur de rayons et le remplacement des flottants par des doubles pour ma classe de couleurs me permet d'accélérer de 5%. Remplacer les flotteurs de vecteurs par des doubles est encore 5% plus rapide! Assez cool:)

C’est avec un Core i7 920

Avec l'arithmétique 387 FPU, float n'est que plus rapide que double pour certaines opérations itératives longues telles que pow, log, etc. (et uniquement si le compilateur définit le mot de contrôle FPU de manière appropriée).

Avec l'arithmétique SSE compacte, cela fait une grande différence.

Matthijs,

Vous avez tort. 32 bits est bien plus efficace que 16 bits - dans les processeurs modernes ... Peut-être pas du point de vue de la mémoire, mais en efficacité 32 bits est la voie à suivre.

Vous devriez vraiment mettre à jour votre professeur pour qu'il propose quelque chose de plus "actualisé". ;)

Quoi qu'il en soit, pour répondre à la question; float et double a exactement les mêmes performances, du moins sur mon Intel i7 870 (comme en théorie).

Voici mes mesures:

(J'ai créé un "algorithme" que j'ai répété 10 000 000 fois, puis répété cela 300 fois, et j'ai fait une moyenne.)

double
-----------------------------
1 core  = 990 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

float
-----------------------------
1 core  = 992 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

Cela indique que les flottants sont légèrement plus rapides que les doubles: http://www.herongyang.com /cs_b/performance.html

En général, chaque fois que vous effectuez une comparaison sur les performances, vous devez tenir compte de tous les cas particuliers, comme l'utilisation d'un type nécessite-t-elle des conversions supplémentaires ou un traitement en masse des données? Ceux-ci s'additionnent et peuvent démentir des repères génériques comme celui-ci.

Les flotteurs devraient être plus rapides sur un système 32 bits, mais profilez le code pour vous assurer que vous optimisez ce qui convient.

J’ai toujours pensé que les processeurs étaient optimisés ou identiques, qu’ils soient flottants ou doubles. En recherchant des optimisations sur mes calculs intensifs (beaucoup d’objects d’une matrice, comparaisons de deux valeurs), j’ai découvert que les flottants fonctionnaient environ 13% plus vite.

Cela m’a surpris, mais je suppose que cela est dû à la nature de mon problème. Je ne fais pas d'incantation entre float et double dans le cœur des opérations, et mes calculs consistent principalement à additionner, multiplier et soustraire.

Ceci est sur mon i7 920, fonctionnant sous un système d'exploitation 64 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top