Précision en virgule flottante simple ou double

13

Les nombres à virgule flottante simple précision occupent la moitié de la mémoire et sur les machines modernes (même sur les GPU, il semble) les opérations peuvent être effectuées avec eux à presque deux fois la vitesse par rapport à la double précision. De nombreux codes FDTD que j'ai trouvés utilisent exclusivement l'arithmétique et le stockage à simple précision. Existe-t-il une règle d'or quand il est acceptable d'utiliser la précision simple pour résoudre des systèmes d'équations clairsemés à grande échelle? Je suppose que cela doit dépendre fortement du numéro de condition de la matrice.

En outre, existe-t-il une technique efficace qui utilise la double précision lorsque cela est nécessaire et unique où la précision du double n'est pas requise. Par exemple, je penserais que pour une multiplication vectorielle matricielle ou un produit vectoriel vectoriel, ce pourrait être une bonne idée d'accumuler les résultats dans une variable à double précision (pour éviter les erreurs d'annulation), mais que les entrées individuelles soient multipliées entre elles peut être multiplié en utilisant une seule précision.

Les FPU modernes permettent-ils la conversion de la simple précision (flottant) à la double précision (double) et vice versa? Ou ces opérations sont-elles coûteuses?

Costis
la source

Réponses:

7

Pour tous les problèmes non triviaux (c'est-à-dire pour ceux où les performances sont importantes), presque toute la mémoire dont vous disposez sera dans la matrice et relativement peu dans les vecteurs. Par exemple, pour les éléments 3D de Taylor-Hood pour l'équation de Stokes, vous avez quelques centaines d'éléments par ligne dans la matrice, ce qui dépasse largement la quantité de mémoire nécessaire pour les vecteurs. Nous avons donc joué avec l'idée de stocker la matrice sous forme de flottants et les vecteurs sous forme de doubles. Je ne me souviens pas de nos résultats de chronométrage mais je sais avec certitude que nous n'avons vu aucun problème d'arrondi, etc. Donc, cette approche fonctionne vraiment.

Wolfgang Bangerth
la source
Merci, professeur Bangerth. Qu'en est-il des solveurs matriciels itératifs? Augmentez-vous jusqu'à la double précision pour les produits matriciels-vectoriels ou redimensionnez-vous les éléments vectoriels au simple pour les multiplications et sauvegardez-vous au double pour l'accumulation?
Costis
Je parlais bien sûr de solveurs itératifs. Nous faisons tous les vecteurs en double précision (car cela n'a pas d'importance), donc l'opération dst = matrix src se produit comme double = float double. L'accumulation se produit alors en double précision, mais je serais en fait très surpris si cela importait du tout.
Wolfgang Bangerth
Il y a un document quelque part (datant peut-être de deux décennies) indiquant que les produits scalaires doivent être effectués avec une précision supérieure à la double. Je n'ai pas la référence à portée de main, mais je vais voir si je peux la retrouver plus tard.
Bill Barth
Oui, cela ne me surprendrait pas. Cela correspond également à ce que nous faisons.
Wolfgang Bangerth
Vous utilisez la précision quad pour les produits scalaires? Si oui, cool! Je n'avais pas entendu dire que quelqu'un faisait ça dans une bibliothèque.
Bill Barth
3

Mon conseil serait de se concentrer principalement sur la consommation de mémoire pour décider quand utiliser la simple précision (float). Ainsi, les données en vrac pour un calcul FDTD devraient utiliser float, mais je garderais la description du problème elle-même (comme la géométrie, les paramètres des matériaux, les conditions d'excitation) et toutes les métadonnées associées en double.

Je garderais toutes les performances non critiques et les calculs non analysés en profondeur en double. Surtout, je garderais les données polygonales et autres descriptions de la géométrie en double (peut-être même un entier si possible), car l'expérience dit que vous n'obtiendrez jamais les parties géométriques de calcul de votre code entièrement robustes, même si cela serait possible en théorie.

Une troisième partie que je garderais en double sont les calculs analytiques, y compris les raccourcis utilisant des décompositions de valeurs propres non symétriques. Par exemple, j'ai une fonction 2D symétrique rotationnelle définie par morceaux, et j'ai besoin de sa transformée de Fourier. Il y aurait différentes manières numériques d'impliquer des FFT et des «filtres passe-bas analytiques» appropriés pour obtenir «efficacement». Parce que ses performances ne sont pas critiques, j'ai plutôt utilisé une expression analytique "exacte" impliquant des fonctions de Bessel. Comme c'était un raccourci pour commencer et que je ne passerai pas de temps à analyser la propagation des erreurs de ma formule compliquée, je ferais mieux d'utiliser la double précision pour ce calcul. (Il s'est avéré que seules certaines des expressions équivalentes analytiques pour la formule étaient utilisables,

Thomas Klimpel
la source