Quelle est la différence entre hard et soft des nombres à virgule flottante?

quand je compile du code C avec ma chaîne cross, le linker imprime des pages d'Avertissements disant que mon exécutable utilise des flotteurs durs mais que ma libc utilise des flotteurs doux. Quelle est la différence?

83
demandé sur rrhartjr 2010-07-23 23:00:47

5 réponses

Les flotteurs durs

utilisent une unité flottante à puce. Doux flotteurs émuler un logiciel. La différence est la vitesse. Il est étrange de voir les deux utilisés sur la même architecture cible, puisque la puce a un FPU ou ne l'a pas. Vous pouvez activer la virgule flottante douce dans GCC avec-msoft-float. Vous pouvez recompiler votre libc pour utiliser le floating point matériel si vous l'utilisez.

86
répondu nmichaels 2010-07-23 19:21:40

il y a trois façons de faire l'arithmétique à virgule flottante:

  • utilisez des instructions float si votre CPU a un FPU. (rapide)
  • demandez à votre compilateur de traduire l'arithmétique à virgule flottante en arithmétique à nombre entier. (lent)
  • utilisez des instructions float et un CPU sans FPU. Votre CPU générera une exception (Instruction réservée, Instruction Non implémentée ou similaire), et si votre noyau OS inclut un émulateur à virgule flottante il imitera ces instructions (les plus lentes).
28
répondu ninjalj 2010-07-23 19:22:43

strictement parlant, toutes ces réponses me semblent fausses.

quand je compile du code C avec ma chaîne cross, le linker imprime des pages d'Avertissements disant que mon exécutable utilise des flotteurs durs mais que ma libc utilise des flotteurs doux. Quelle est la différence?

à La Debian VFP wiki a des informations sur les trois choix pour -mfloat-abi ,

  • soft - c'est du pur logiciel
  • softfp - cela prend en charge un FPU matériel, mais le ABI est compatible soft.
  • hard - L'ABI utilise float ou VFP registres.

l'erreur de linker (loader) est due au fait que vous avez une bibliothèque partagée qui va passer des valeurs en virgule flottante dans des registres entiers. Vous pouvez encore compiler votre code avec un -mfpu=vfp , etc mais vous devez utiliser -mfloat-abi=softfp de sorte que si le libc a besoin d'un flotteur, il est passé d'une manière que la bibliothèque comprend.

le noyau Linux peut supporter l'émulation des instructions VFP. De toute évidence, il est préférable de compiler avec -mfpu=none dans ce cas et de faire générer le code de compilation directement au lieu de s'appuyer sur une émulation du noyau Linux. Cependant, je ne crois pas que l'erreur de L'OP soit liée à cette question. Il est séparé et doit également être traitée avec la -mfloat-abi .

Armv5 bibliothèque partagée avec ArmV7 CPU est à l'opposé de celle-ci; les libc était difficile à flotteur, mais la demande a été seulement doux . Il a quelques façons de travailler autour de la question, mais recompiler avec les options correctes est toujours le plus facile.

un autre problème est que le noyau Linux doit prendre en charge VFP tâches (ou N'importe quel point flottant ARM présent) pour sauvegarder/restaurer les registres sur un commutateur de contexte.

15
répondu artless noise 2017-05-23 12:25:48

il semble que votre libc a été construit pour les opérations logicielles à virgule flottante alors que votre exe a été compilé en supposant un support matériel pour la virgule flottante. À court terme, vous pouvez forcer le doux flotte comme un compilateur drapeau. (si vous utilisez gcc, je pense que c'est-msoft-float)

à plus long terme, si le processeur de votre cible a un support matériel pour les opérations à virgule flottante, vous voudrez généralement construire ou trouver une chaîne d'outils croisée avec flotteur matériel activé pour la vitesse. Quelque les familles de processeurs ont des variantes de modèles, certaines avec et d'autres sans support matériel. Ainsi, par exemple, le simple fait de dire que votre processeur est un bras est insuffisant pour savoir si vous avez un support matériel à virgule flottante.

11
répondu Digikata 2010-07-23 19:21:32

le calcul peut être effectué soit par du matériel à virgule flottante, soit par un logiciel basé sur une arithmétique entière.

le faire en matériel est beaucoup plus rapide, mais beaucoup de microcontrôleurs n'ont pas de matériel à virgule flottante. Dans ce cas, vous pouvez soit éviter d'utiliser floating point (généralement la meilleure option) ou compter sur une implémentation dans le logiciel, qui fera partie de la bibliothèque C.

dans certaines familles de contrôleurs, par exemple ARM, Le le matériel à virgule flottante est présent dans certains modèles de la famille mais pas dans d'autres, donc gcc pour ces familles supporte les deux. Votre problème semble être que vous avez mélangé les deux options.

6
répondu starblue 2010-07-23 19:26:23