Gleitkommazahlen mit einfacher Genauigkeit belegen die Hälfte des Arbeitsspeichers und können auf modernen Maschinen (auch auf GPUs) fast doppelt so schnell ausgeführt werden wie mit doppelter Genauigkeit. Viele FDTD-Codes, die ich gefunden habe, verwenden ausschließlich Arithmetik und Speicherung mit einfacher Genauigkeit. Gibt es eine Faustregel, wann es akzeptabel ist, einfache Genauigkeit zum Lösen von spärlichen Gleichungssystemen im großen Maßstab zu verwenden? Ich gehe davon aus, dass es stark von der Matrixbedingungsnummer abhängen muss.
Darüber hinaus gibt es eine wirksame Technik, bei der bei Bedarf doppelte Genauigkeit und bei der keine doppelte Genauigkeit erforderlich ist. Zum Beispiel würde ich denken, dass es für eine Matrixvektormultiplikation oder ein Vektorpunktprodukt eine gute Idee sein könnte, die Ergebnisse in einer Variablen mit doppelter Genauigkeit zu akkumulieren (um Löschfehler zu vermeiden), aber dass einzelne Einträge miteinander multipliziert werden kann mit einfacher Genauigkeit multipliziert werden.
Ermöglichen moderne FPUs nahtlos die Umstellung von einfacher Präzision (Float) auf doppelte Präzision (Double) und umgekehrt? Oder sind diese kostspieligen Operationen?
quelle
Eine gute Arbeit zu diesem Thema ist die Beschleunigung wissenschaftlicher Berechnungen mit Algorithmen mit gemischter Präzision .
quelle
Mein Rat wäre, sich hauptsächlich auf den Speicherverbrauch zu konzentrieren, um zu entscheiden, wann die einfache Genauigkeit (Float) verwendet wird. Die Massendaten für eine FDTD-Berechnung sollten also float verwenden, aber ich würde die Problembeschreibung selbst (wie Geometrie, Materialparameter, Anregungsbedingungen) und alle zugehörigen Metadaten doppelt verwenden.
Ich würde alle Performance unkritisch halten und nicht tief analysierte Berechnungen doppelt durchführen. Insbesondere würde ich polygonale Daten und andere Beschreibungen der Geometrie doppelt halten (wenn möglich sogar ganzzahlig), da die Erfahrung zeigt, dass Sie die rechnerischen geometrischen Teile Ihres Codes niemals vollständig robust machen werden, selbst wenn dies theoretisch möglich wäre.
Ein dritter Teil, den ich im Doppelten behalten möchte, sind analytische Berechnungen, einschließlich Verknüpfungen mit nicht symmetrischen Eigenwertzerlegungen. Als Beispiel habe ich eine stückweise definierte rotationssymmetrische 2D-Funktion und ich brauche ihre Fourier-Transformation. Es gäbe verschiedene numerische Möglichkeiten, die FFTs und geeignete "analytische Tiefpassfilter" umfassen, um sie "effizient" zu erhalten. Da die Leistung unkritisch ist, habe ich stattdessen einen "exakten" analytischen Ausdruck mit Bessel-Funktionen verwendet. Da dies zunächst eine Abkürzung war und ich keine Zeit darauf verwenden werde, die Fehlerausbreitung meiner komplizierten Formel zu analysieren, verwende ich für diese Berechnung besser die doppelte Genauigkeit. (Es stellte sich immer noch heraus, dass nur einige der analytisch äquivalenten Ausdrücke für die Formel verwendbar waren.)
quelle