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?
la source
Un bon article sur ce sujet est Accélérer les calculs scientifiques avec des algorithmes de précision mixtes .
la source
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,
la source