80 votes

L'utilisation est-elle double plus vite que float?

Les valeurs doubles stockent une plus grande précision et sont deux fois plus grandes qu'un float, mais les processeurs Intel sont-ils optimisés pour les floats?

Autrement dit, les doubles opérations sont-elles aussi rapides ou plus rapides que les opérations flottantes pour +, -, * et /?

La réponse change-t-elle pour les architectures 64 bits?

85voto

Alex Martelli Points 330805

Il n'y a pas un seul "type de PROCESSEUR intel", en particulier en termes de ce que les opérations sont optimisés par rapport à d'autres!, mais la plupart d'entre eux, au niveau CPU (plus précisément au sein de la FPU), sont telles que la réponse à votre question:

sont le double des opérations tout aussi rapide ou plus vite que l'exploitation des hydravions pour +, -, * et /?

est "oui" -- au sein de la CPU. Cependant, à prendre deux fois plus de mémoire pour chaque numéro renvoie clairement à charge plus lourde sur le cache(s) et plus de bande passante de la mémoire pour le remplir et le déversement de ces lignes de cache à partir de/vers la mémoire RAM; le temps que vous vous souciez de la performance d'une opération en virgule flottante est lorsque vous faites beaucoup de ces opérations, de sorte que la mémoire et le cache considérations sont essentielles.

@Richard la réponse de points qu'il y a aussi d'autres façons de pratiquer la FP de l'exploitation (l' ESS instructions; les bonnes vieilles MMX a été nombres entiers uniquement), particulièrement adapté pour une simple ops sur beaucoup de données ("SIMD", single instruction multiple data) où chaque registre peut pack 4 en simple précision de flotteurs ou de seulement 2 double précision, de sorte que l'effet sera encore plus marqué.

En fin de compte, vous n'avez pas de référence, mais ma prédiction est que raisonnable (c'est à dire, les grands;-) indices de référence, vous trouverez d'avantage de coller avec précision unique (en supposant bien sûr que vous n'avez pas besoin de l'appoint de bits de précision!-).

27voto

Daniel Trebbien Points 18089

Si tous les calculs en virgule flottante sont effectuées au sein de la FPU, alors, non, il n'y a pas de différence entre un double calcul et un float calcul, car les opérations en virgule flottante sont effectivement réalisées avec 80 bits de précision dans la pile FPU. Les entrées de la pile FPU sont arrondis comme approprié pour convertir les 80 bits à virgule flottante au format à l' double ou float à virgule flottante au format. Déménagement sizeof(double) octets vers/à partir de la RAM contre sizeof(float) octets est la seule différence dans la vitesse.

Si, toutefois, vous avez un vectorizable calcul, vous pouvez utiliser l'ESS extensions pour quatre float calculs en même temps que deux double calculs. Par conséquent, l'utilisation intelligente de l'ESS instructions et les registres XMM peut permettre un débit plus élevé sur des calculs qui utilisent uniquement de l' floats.

12voto

Miley Points 260

Un autre point à considérer est que si vous êtes à l'aide de GPU(carte graphique). Je travaille avec un projet qui est numériquement intensive, mais nous n'avons pas besoin de la precision que la double offre. Nous utilisons des cartes GPU pour aider à en accélérer le traitement. CUDA GPU besoin d'un forfait spécial à l'appui de double, et le montant de la RAM sur un GPU est assez rapide, mais assez rares. En tant que résultat de l'utilisation de float double la quantité de données qu'on peut stocker sur le

Encore un autre point, c'est la mémoire. Flotteurs de prendre la moitié autant de RAM que doubles. Si vous travaillez avec des jeux de données TRÈS volumineux, cela peut être un véritable facteur important. Si en utilisant le double signifie que vous avez en mémoire cache sur le disque vs pure ram, la différence sera énorme.

Donc, pour l'application que je suis en train de travailler avec, la différence est très importante.

9voto

Akash Agrawal Points 840

Dans les expériences de l'ajout de 3.3 pour 2000000000 fois, les résultats sont les suivants:

Summation time in s: 2.82 summed value: 6.71089e+07 // float
Summation time in s: 2.78585 summed value: 6.6e+09 // double
Summation time in s: 2.76812 summed value: 6.6e+09 // long double

Donc double est plus rapide et par défaut en C et C++. Il est plus portable et la valeur par défaut dans toutes les C et C++ des fonctions de la bibliothèque. Alos double a beaucoup plus de précision que le flotteur.

Même Stroustrup recommande de doubler au cours float:

"Le sens exact de l'unique, double, et de l'étendue-la précision est de mise en œuvre définies. Choisir la bonne précision pour un problème où le choix des questions exige beaucoup de compréhension de calcul flottant. Si vous n'avez pas que la compréhension, obtenir des conseils, de prendre le temps d'apprendre, ou de l'utilisation double et espérer pour le mieux."

Peut-être le seul cas où vous devriez utiliser float au lieu de double sur 64 bits du matériel moderne de gcc. Parce que le flotteur est plus petit; double est de 8 octets et le flotteur est de 4 octets.

7voto

Richard Points 54016

La seule réponse vraiment utile est: vous seul pouvez le dire. Vous devez analyser vos scénarios. De petits changements dans les instructions et les modèles de mémoire pourraient avoir un impact significatif.

Cela aura certainement de l'importance si vous utilisez du matériel de type FPU ou SSE (le premier fait tout son travail avec une précision 80 mais étendue, donc double sera plus proche; plus tard, c'est nativement 32 bits, c'est-à-dire float).

Mise à jour: s / MMX / SSE / comme indiqué dans une autre réponse.

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