89 votes

Division en virgule flottante vs multiplication en virgule flottante

Est-il (non-microoptimization) gain de performance par le codage de

float f1 = 200f / 2

en comparaison à

float f2 = 200f * 0.5

Un professeur de la mienne m'a dit il y a quelques années à virgule flottante divisions ont été plus lent qu'en virgule flottante multiplications sans entrer dans les détails du pourquoi.

Cette déclaration tenir pour PC moderne de l'architecture?

Update1

En ce qui concerne à un commentaire, veuillez également tenir compte de cette affaire:

float f1;
float f2 = 2
float f3 = 3;
for( i =0 ; i < 1e8; i++)
{
  f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively
}

Mise à jour 2 Citant les commentaires:

[Je veux] pour savoir quels sont les algorithmique / exigences architecturales qui causent > division à être beaucoup plus compliqué dans le matériel de multiplication

94voto

Gabe Points 49718

Oui, un grand nombre de Processeurs peut effectuer la multiplication dans 1 ou 2 cycles d'horloge mais la division prend toujours plus de temps (bien que la FP de la division est parfois plus rapide que la division entière).

Si vous regardez cette réponse vous verrez que la division ne peut excéder 24 cycles.

Pourquoi la division de prendre beaucoup plus de temps que la multiplication? Si vous vous souvenez de l'école primaire, vous pouvez vous rappeler que la multiplication peuvent être essentiellement réalisée avec simultanément de nombreux ajouts. Division nécessite itératif de soustraction qui ne peut être exécutée simultanément, de sorte que cela prend plus de temps. En fait, certains FP unités de vitesse de division en effectuant un rapprochement réciproque et en multipliant par qui. Ce n'est pas tout à fait aussi précis, mais est un peu plus rapide.

21voto

Michael Borgwardt Points 181658

La Division est par nature beaucoup moins que l'opération de multiplication.

Et cela peut en fait être quelque chose que le compilateur ne peut pas (et vous ne voulez pas) optimiser dans de nombreux cas, en raison de virgule flottante inexactitudes. Ces deux énoncés:

double d1 = 7 / 10;
double d2 = 7 * 0.1;

sont pas sémantiquement identiques - 0.1 ne peut pas être représentée exactement comme un double, donc légèrement différente de la valeur qui sera utilisée - la substitution de la multiplication de la division dans ce cas, on obtiendra un résultat différent!

9voto

T.E.D. Points 26829

Oui. Chaque FPU je suis conscient de effectue les multiplications beaucoup plus rapide que les divisions.

Cependant, les Pc modernes sont très rapides. Ils contiennent également du pipelining archtectures qui peut faire la différence négligeable dans de nombreuses circonstances. Pour couronner le tout, tout décent, le compilateur va effectuer l'opération de division, vous avez démontré au moment de la compilation avec les optimisations activées. Pour la mise à jour de votre exemple, que tout bon compilateur d'effectuer cette transformation lui-même.

Donc, en général , vous devriez vous inquiéter au sujet de faire votre code lisible, et laisser le compilateur vous soucier de faire vite. Seulement si vous avez une vitesse mesurée problème avec cette ligne devrait vous vous inquiétez au sujet de pervertir votre code pour des raisons de rapidité. Les compilateurs sont bien conscients de ce qui est plus rapide que ce que leur CPU, et sont généralement beaucoup mieux optimiseurs que vous ne pourrez jamais espérer de l'être.

8voto

Nathan Whitehead Points 1095

Pensez à ce qui est nécessaire pour la multiplication de deux nombres de n bits. Avec la méthode la plus simple, vous prenez un nombre x et à plusieurs reprises maj, et à condition de l'ajouter à un accumulateur (basé sur un petit nombre d'autres y). Après la n des ajouts que vous avez terminé. Votre résultat s'inscrit dans 2n bits.

Pour la division, vous commencez avec x de 2n bits et y de n bits, vous voulez calculer x / y. La méthode la plus simple est la division longue, mais en binaire. À chaque étape vous faire une comparaison et une soustraction pour obtenir un peu plus du quotient. Cela vous prend n étapes.

Quelques différences: chaque étape de la multiplication suffit de regarder 1 bit; chaque étape de la division a besoin de regarder les n bits lors de la comparaison. Chaque étape de la multiplication est indépendante de toutes les autres étapes (n'a pas d'importance l'ordre que vous ajoutez les produits partiels); pour la division de chaque étape dépend de l'étape précédente. C'est une grosse affaire dans le matériel. Si les choses peuvent se faire de façon indépendante, puis ils peuvent se produire en même temps à l'intérieur d'un cycle d'horloge.

1voto

BЈовић Points 28674

La réponse dépend de la plate-forme pour laquelle vous programmez.

Par exemple, multiplier les multiplications sur un tableau sous x86 devrait être beaucoup plus rapide que de diviser, car le compilateur doit créer le code assembleur qui utilise les instructions SIMD. Comme il n'y a pas de division dans les instructions SIMD, vous constateriez de grandes améliorations en utilisant la multiplication, puis la division.

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