Pourquoi les nombres décimaux à virgule flottante ne sont-ils pas accélérés comme les nombres binaires à virgule flottante?

StackOverflow https://stackoverflow.com/questions/1447215

  •  22-07-2019
  •  | 
  •  

Question

Cela vaut-il la peine de l'implémenter dans le matériel? Si oui pourquoi? Si non, pourquoi pas?

Désolé, j'ai cru comprendre qu'il était clair que je parle de nombres décimaux rationnels! OK, quelque chose comme decNumber ++ pour C ++, décimal pour .NET ... J'espère que c'est clair maintenant: )

Était-ce utile?

La solution

La dernière révision de la norme IEEE 754: 2008 définit effectivement le flottement décimal du matériel. numéros de points, en utilisant les représentations montrées dans le logiciel référencé dans la question. La version précédente de la norme ( IEEE 754: 1985 ) ne fournissait pas de nombres décimaux en virgule flottante. . La plupart des matériels actuels implémentent la norme de 1985 et non la norme de 2008, mais les ordinateurs iSeries d’IBM utilisant Power6 Les puces ont un tel support, de même que les z10 mainframes.

Mike Cowlishaw d'IBM Royaume-Uni, dont le site Web est site Web , est à la tête de l'effort de normalisation relatif aux nombres décimaux à virgule flottante. plein d'informations utiles (y compris le logiciel dans la question). Il est probable qu’en temps voulu, d’autres fabricants de matériel introduiront également des unités décimales à virgule flottante sur leurs puces, mais je n’ai pas entendu de déclaration indiquant si Intel pourrait en ajouter une. Intel a optimisé ses bibliothèques de logiciels pour il.

Le comité sur les normes C cherche à ajouter un support pour la virgule flottante décimale. et ce travail est TR 24732.

Autres conseils

Certains processeurs IBM ont un matériel décimal dédié inclus (Décimale en virgule flottante | Unité DFP).

En contribution de répondu le 18 septembre à 23h43 Daniel Pryden

La raison principale est que les unités DFP ont besoin de davantage de transistors dans une puce que les unités BFP. La raison en est le code BCD pour calculer les nombres décimaux dans un environnement binaire. L'IEEE754-2008 dispose de plusieurs méthodes pour minimiser la surcharge. Il semble que la méthode DPD hxxp: //en.wikipedia.org/wiki/Densely_packed_decimal soit plus efficace que la méthode BID hxxp: //en.wikipedia.org/wiki/Binary_Integer_Decimal.

Normalement, vous avez besoin de 4 bits pour couvrir la plage décimale comprise entre 0 et 9. Les bits 10 à 15 ne sont pas valides mais restent possibles avec BCD. Par conséquent, la compression DPD compresse 3 * 4 = 12 bits en 10 bits pour couvrir la plage de 000 à 999 avec 1024 (10 ^ 2) possibilités.

En général, cela signifie que BFP est plus rapide que DFP. Et BFP nécessite moins d’espace sur une puce que DFP.

La question de savoir pourquoi IBM a implémenté une unité DFP est assez simple: Ils construisent des serveurs pour le marché financier. Si les données représentent de l'argent, elles devraient être fiables.

Avec l’arithmétique décimale à accélération matérielle, certaines erreurs ne s’accumulent pas comme en binaire. 1/5 = 0,2 = > 0.0110011001100110011001100110 ... en binaire pour éviter les fractions récurrentes.

Et la fonction de superposition round () dans Excel serait désormais inutile: D (- > function = 1 * (0,5-0,4-0,1) wtf!)

espérons que cela explique un peu votre question!

Il y a une infime accélération décimale des chaînes, mais ...

C'est une bonne question. Ma première réaction a été "les opérations macro ont toujours échoué", mais après y avoir réfléchi, ce dont vous parlez irait beaucoup plus vite s'il était implémenté dans une unité fonctionnelle. Je suppose que cela dépend de savoir si ces opérations sont suffisamment faites pour avoir de l'importance. Il existe une histoire plutôt désolante d’instructions spéciales pour des opérations spécifiques aux macros et aux applications, et en particulier les anciennes tentatives de formats financiers décimaux ne sont plus que des objets hérités. Par exemple, je doute qu’ils soient beaucoup utilisés, mais chaque PC possède les opcodes Intel BCD , qui consistent en

DAA, AAA, AAD, AAM, DAS, AAS

Il était une fois, les instructions de chaîne décimale étaient courantes sur le matériel haut de gamme. Il n'est pas clair qu'ils ont déjà fait une différence de référence. Les programmes passent beaucoup de temps à tester et à créer des branches, à déplacer et à calculer des adresses. Cela n’a normalement aucun sens de mettre des macro-opérations dans l’architecture du jeu d’instructions, car dans l’ensemble, les choses semblent aller plus vite si vous donnez au processeur le plus petit nombre de tâches fondamentales à effectuer, de sorte qu’il puisse mettre toutes ses ressources à les exécuter de la manière suivante: aussi vite que possible.

Ces jours-ci, même tous les ops binaires ne sont pas dans l'ISA real . Le processeur traduit l’ISA hérité en micro-ops à l'exécution. Cela fait partie de la rapidité avec la spécialisation dans les opérations principales. Pour l’instant, les transistors restants semblent attendre quelques travaux graphiques et 3D, c’est-à-dire MMX, SSE, 3DNow!

Je suppose qu’il est possible qu’une conception épurée produise un changement radical et unifie les formats de virgule flottante (HW) scientifique et (SW) actuels, mais ne retenez pas votre souffle.

Non, ils sont très inefficaces en mémoire. Et les calculs sont également sur du matériel pas facile à mettre en œuvre (bien sûr, cela peut être fait, mais cela peut aussi prendre beaucoup de temps). Un autre inconvénient du format décimal réside dans le fait qu’il n’est pas largement utilisé avant que les recherches montrent que les nombres au format binaire étaient plus précis que le format était populaire pendant un certain temps. Mais maintenant, les programmeurs savent mieux. Le format décimal n'est pas efficace et entraîne davantage de pertes. De plus, les représentations matérielles supplémentaires nécessitent des jeux d'instructions supplémentaires, ce qui peut rendre le code plus difficile.

Le matériel que vous souhaitez utiliser était assez commun.

Les anciens processeurs avaient une arithmétique matérielle en BCD (décimal codé Binaray). (Les petites puces Intel ont eu un peu de soutien, comme indiqué par les affiches précédentes)

Le BCD matériel était très efficace pour accélérer FORTRAN qui utilisait un BCD à 80 bits pour les nombres.

L’informatique scientifique représentait un pourcentage important du marché mondial.

Depuis que tout le monde (relativement parlant) est arrivé à la maison avec un PC tournant sous Windows, le marché est devenu minuscule. en pourcentage. Donc, plus personne ne le fait.

Étant donné que cela ne vous dérange pas d'avoir des doubles 64 bits (virgule flottante binaire) pour la plupart des choses, cela fonctionne généralement.

Si vous utilisez une virgule flottante binaire 128 bits sur des unités vectorielles matérielles modernes, ce n'est pas si grave. Encore moins précis que le BCD 80bit, mais vous l’obtenez.

À un poste précédent, un collègue de JPL, qui était auparavant, a été surpris de constater que nous utilisions encore le FORTRAN. "Nous nous sommes convertis en C et C ++, nous a-t-il dit." Je lui ai demandé comment ils réglaient le problème du manque de précision. Ils n'avaient pas remarqué. (Ils n’ont pas non plus la même précision d’atterrissage de sonde spatiale. Mais tout le monde peut rater une planète.)

Ainsi, les doubles de 128 bits de l'unité vectorielle sont plus acceptables et largement disponibles.

Mes vingt cents. Veuillez ne pas le représenter sous forme de nombre à virgule flottante:)

La norme de virgule flottante décimale (IEEE 754-2008) est déjà implémentée dans le matériel par deux sociétés; Les serveurs IBM basés sur POWER 6/7 et la SilMinds carte d'accélération SilAx PCIe.

SilMinds a publié une étude de cas sur la conversion de l’exécution arithmétique Decimal pour l’utiliser solutions matérielles . Un gain de temps considérable et une consommation d’énergie réduite sont présentés.

De plus, plusieurs publications de "Michael J. Schulte" et d’autres révèlent des résultats de référence très positifs et une certaine comparaison entre les formats DPD et BID (tous deux définis dans la norme IEEE 754-2008)

Vous pouvez trouver des fichiers PDF à:

  1. Analyse des performances des bibliothèques à virgule flottante décimale et son impact sur les solutions matérielles et logicielles décimales

  2. Enquête sur les conceptions matérielles pour l'arithmétique décimale

  3. Amélioration de l’énergie et des retards grâce aux unités à virgule flottante décimale

Ces 3 articles devraient suffire à vos questions!

Je suppose qu’il n’existe pas d’applications de nombres décimaux à forte intensité de calcul. Par ailleurs, les nombres en virgule flottante sont largement utilisés dans les applications d’ingénierie, qui doivent gérer d’énormes quantités de données et ne nécessitent pas de résultats exacts, mais doivent rester dans les limites de la précision souhaitée.

Les nombres décimaux (et plus généralement les fractions) sont relativement faciles à implémenter sous la forme d'une paire d'entiers. Les bibliothèques d'usage général sont omniprésentes et suffisamment rapides pour la plupart des applications.

Quiconque a besoin de la plus grande rapidité va peaufiner son implémentation (par exemple, en modifiant le diviseur en fonction d’un usage particulier, en combinant / réorganisant algébriquement les opérations, en utilisant intelligemment les mélangeurs SIMD, etc.). Simplement encoder les fonctions les plus courantes dans un ISA matériel ne les satisferait jamais - il est fort probable que cela n’aiderait pas du tout.

La réponse simple est que les ordinateurs sont des machines binaires. Ils n'ont pas dix doigts, ils en ont deux. Ainsi, la construction de matériel pour les nombres binaires est considérablement plus rapide, facile et efficace que la construction de matériel pour les nombres décimaux.

Soit dit en passant: les nombres décimaux et binaires sont des bases de nombres, alors que les points fixes et flottants sont des mécanismes d’approximation des nombres rationnels. Les deux sont complètement orthogonaux: vous pouvez avoir des nombres décimaux à virgule flottante (System.Decimal de .NET est implémenté de cette façon) et des nombres binaires à virgule fixe (les entiers normaux n'en sont qu'un cas particulier).

Le calcul en virgule flottante est essentiellement une tentative d'implémentation de nombres décimaux dans le matériel. C'est gênant, c'est pourquoi les types Decimal sont créés en partie dans le logiciel. C’est une bonne question, pourquoi les processeurs ne prennent pas en charge plus de types, mais je suppose que cela remonte à des processeurs CISC contre RISC - RISC a gagné la bataille des performances, alors ils essaient de garder les choses simples, je suppose.

Les ordinateurs modernes sont généralement destinés à un usage général. L'arithmétique en virgule flottante est un objectif très général, tandis que Decimal a un objectif beaucoup plus spécifique. Je pense que cela fait partie de la raison.

Voulez-vous dire les types entiers numériques typiques "int", "long", "court" (etc.)? Parce que les opérations sur ces types sont définitivement implémentées dans le matériel. Si vous parlez de grands nombres de précision arbitraire ("BigNums" et "Decimals", etc.), c'est probablement une combinaison de la rareté des opérations utilisant ces types de données et de la complexité de la construction de matériel pour traiter des formats de données arbitrairement volumineux. .

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