
Une unité à virgule flottante ( FPU , familièrement un coprocesseur mathématique ) est une partie d'un système informatique spécialement conçue pour effectuer des opérations sur des nombres à virgule flottante . Les opérations typiques sont l'addition , la soustraction , la multiplication , la division et la racine carrée . Certaines FPU peuvent également effectuer diverses fonctions transcendantes telles que des calculs exponentiels ou trigonométriques , mais la précision peut être faible, donc certains systèmes préfèrent calculer ces fonctions dans un logiciel.
Dans les architectures informatiques à usage général , une ou plusieurs FPU peuvent être intégrées comme unités d'exécution au sein de l' unité centrale de traitement ; cependant, de nombreux processeurs embarqués ne disposent pas de support matériel pour les opérations à virgule flottante (alors qu'ils les ont de plus en plus en standard).
Lorsqu'un processeur exécute un programme qui appelle une opération à virgule flottante, il existe trois manières de l'exécuter :
- Un émulateur d'unité à virgule flottante (une bibliothèque à virgule flottante dans un logiciel)
- Matériel FPU complémentaire
- FPU intégré (dans le matériel)
Histoire
En 1954, l' IBM 704 était doté de l'arithmétique à virgule flottante comme fonction standard, l'une de ses principales améliorations par rapport à son prédécesseur, l' IBM 701. Cette fonction a été reprise par ses successeurs, les 709, 7090 et 7094.
En 1963, Digital a annoncé le PDP-6 , qui avait la virgule flottante comme fonction standard.
En 1963, le GE-235 était doté d'une « unité arithmétique auxiliaire » pour les calculs à virgule flottante et à double précision.
Historiquement, certains systèmes implémentaient le calcul en virgule flottante avec un coprocesseur plutôt qu'en tant qu'unité intégrée (mais maintenant, en plus du processeur, par exemple, les GPU - qui sont des coprocesseurs pas toujours intégrés au processeur - ont en règle générale des FPU, alors que les premières générations de GPU n'en avaient pas). Il peut s'agir d'un seul circuit intégré , d'une carte de circuit imprimé entière ou d'une armoire. Lorsque le matériel de calcul en virgule flottante n'est pas fourni, les calculs en virgule flottante sont effectués par logiciel, ce qui prend plus de temps processeur, mais évite le coût du matériel supplémentaire. Pour une architecture informatique particulière, les instructions de l'unité en virgule flottante peuvent être émulées par une bibliothèque de fonctions logicielles ; cela peut permettre au même code objet de s'exécuter sur des systèmes avec ou sans matériel en virgule flottante. L'émulation peut être implémentée à plusieurs niveaux : dans le processeur sous forme de microcode , comme fonction du système d'exploitation ou dans le code de l'espace utilisateur . Lorsque seule la fonctionnalité entière est disponible, les méthodes CORDIC sont le plus souvent utilisées pour l'évaluation des fonctions transcendantes .
Dans la plupart des architectures informatiques modernes, il existe une certaine distinction entre les opérations à virgule flottante et les opérations sur nombres entiers . Cette distinction varie considérablement selon l'architecture ; certaines disposent de registres à virgule flottante dédiés, tandis que d'autres, comme Intel x86 , vont jusqu'à utiliser des schémas d'horloge indépendants .
Les routines CORDIC ont été implémentées dans les coprocesseurs Intel x87 ( 8087 , 80287, 80387 ) jusqu'à la série de microprocesseurs 80486 , ainsi que dans les Motorola 68881 et 68882 pour certains types d'instructions à virgule flottante, principalement comme moyen de réduire le nombre de portes (et la complexité) du sous-système FPU.
Les opérations à virgule flottante sont souvent traitées en pipeline . Dans les architectures superscalaires antérieures sans exécution générale dans le désordre , les opérations à virgule flottante étaient parfois traitées en pipeline séparément des opérations sur entiers.
L'architecture modulaire de la microarchitecture Bulldozer utilise un FPU spécial appelé FlexFPU, qui utilise le multithreading simultané . Chaque cœur physique entier, deux par module, est monothread, contrairement à l'Hyperthreading d'Intel , où deux threads virtuels simultanés partagent les ressources d'un seul cœur physique.