J'ai un système de traitement du signal numérique qui fonctionne sur une machine rapide x86 utilisant des nombres à virgule flottante double précision . Il m'est venu à l'esprit que je n'utilise pas vraiment l'énorme plage dynamique de la représentation en virgule flottante - toutes les quantités s'intègrent facilement dans la plage ± 32768.
Ma question: est-il possible que le passage aux calculs à virgule fixe apporte un avantage en termes de précision numérique (haute priorité) ou de temps de calcul (basse priorité)?
Bien sûr, la réponse dépend du nombre de bits disponibles pour un calcul à virgule fixe. Combien de bits de précision les systèmes à virgule fixe typiques utilisent-ils? Est-il possible de faire efficacement des calculs à virgule fixe, avec, disons, 64 bits ( partie entière 16 bits, partie fractionnaire 48 bits ) sur x86-64?
J'avais toujours pensé que les calculs à virgule fixe n'étaient utilisés que dans des situations où la puissance du processeur est limitée - est-il judicieux d'utiliser des calculs à virgule fixe lorsque la puissance du processeur n'est pas un problème?
la source
Réponses:
La précision numérique des entiers ne sera meilleure que la précision numérique des flottants que si la résolution entière est meilleure. Les doubles ont 52 bits fractionnaires, donc les flotteurs à double précision ont une résolution pire que les entiers autour de , ce qui est beaucoup plus grand que 32 768 ( 2 15 ). Donc, non, la précision numérique ne sera pas meilleure si vous passez à des entiers.252 215
Le deuxième problème est la vitesse. La réponse est: cela dépend du matériel. Si vous exécutez votre programme sur un processeur de signal numérique qui a plusieurs cœurs de multiplication / accumulation de points fixes, alors oui, ce sera beaucoup plus rapide en point fixe. Sur une puce x86, en revanche, elle sera probablement plus lente en virgule fixe. J'ai fait exactement ce dont vous parlez une fois et j'ai vu mes délais d'exécution augmenter.
Après avoir fait quelques recherches sur Internet, j'ai découvert que c'était courant. La raison en est qu'il dispose d'un processeur à virgule flottante dédié qui ne fait rien lorsque vous passez au point fixe, tandis que le matériel à virgule fixe est partagé avec l'action à virgule fixe régulière, telle que l'arithmétique des pointeurs.
Si vous souhaitez accélérer le traitement, la méthode consiste à passer de flotteurs double précision à flotteurs simple précision. Cela devrait produire une augmentation significative de la vitesse. Cela réduirait bien sûr votre précision numérique.
la source
Les avantages du virgule fixe sont principalement en termes de puissance (par exemple lorsque vous avez le choix du matériel de processeur, ou que le processeur est bon pour arrêter les unités fonctionnelles inutilisées). En effet, les unités à virgule fixe sont généralement plus petites (moins de transistors, fils plus courts, moins de capacité à surmonter par MAC) pour une technologie et un taux de problème de fonctionnement donnés, que la virgule flottante.
Cependant, une grande quantité de processeurs contemporains courants (serveur, PC et même mobile), ont des FPU plus nombreux et plus rapides (en particulier des unités FP simple précision) que des multiplicateurs entiers, et la majeure partie de la puissance du système ne provient pas de l'utilisation du FPU, donc en utilisant fixe -point aura peu ou pas d'avantages pour le calcul DSP typique sur ces produits, et peut probablement être un inconvénient en termes de performances pures. En utilisant la technologie actuelle, tout avantage du virgule fixe s'accumulera principalement dans de minuscules produits intégrés, tels que des appareils de la taille d'un bouton.
Cependant, considérez également les empreintes de mémoire et de cache du processeur. L'utilisation intelligente de types de données plus petits (short int et float) pour adapter complètement un grand calcul dans le cache de données peut compenser tous les avantages de la bande passante FPU.
la source
Préférez les flotteurs simple précision aux doubles - cela réduira de moitié la bande passante de votre mémoire, l'encombrement du cache et les exigences de stockage, et accélérera certaines opérations mathématiques. Il ouvre également la possibilité de SIMD 4 voies si une optimisation supplémentaire est nécessaire.
Le point fixe ne vaut vraiment la peine que si vous n'avez pas de FPU - la plupart des processeurs x86 modernes ont deux FPU, il n'y a donc rien à gagner à utiliser un point fixe, et les performances peuvent même être nettement moins bonnes avec un point fixe. (Notez également que le point fixe nécessite des instructions supplémentaires par rapport au point flottant pour des opérations telles que la multiplication.)
la source
En plus des très bonnes réponses fournies ici, quelques points méritent d'être ajoutés:
la source
Quelques points à considérer:
En dernier mot, je pense que nos données du monde réel sont précieuses et que le calcul numérique aveugle de l'ordinateur est un humble travail subalterne. L'ordinateur doit être mis à contribution pour vos données et pour vous, et ne pas être traité comme si c'était la vraie star de l'émission.
la source