Relative Vorteile der Festkomma- gegenüber der Gleitkommaberechnung?


9

Ich habe ein digitales Signalverarbeitungssystem, das auf einem schnellen x86-Computer mit Gleitkommazahlen mit doppelter Genauigkeit arbeitet . Mir ist aufgefallen, dass ich den riesigen Dynamikbereich der Gleitkommadarstellung nicht wirklich nutze - alle Größen passen problemlos in den Bereich ± 32768.

Meine Frage: Ist es möglich, dass das Umschalten auf Festpunktberechnungen einen Vorteil in Bezug auf die numerische Genauigkeit (hohe Priorität) oder die Rechenzeit (niedrige Priorität) bietet?

Die Antwort hängt natürlich davon ab, wie viele Bits für eine Festpunktberechnung verfügbar sind. Wie viele Präzisionsbits verwenden typische Festkommasysteme? Ist es möglich, Festpunktberechnungen mit beispielsweise 64 Bit ( 16 Bit ganzzahliger Teil, 48 Bit Bruchteil ) auf x86-64 effizient durchzuführen?

Ich hatte immer gedacht, dass Festkommaberechnungen nur in Situationen verwendet werden, in denen die CPU-Leistung begrenzt ist. Ist es sinnvoll, Festkommaberechnungen zu verwenden, wenn die CPU-Leistung keine Rolle spielt?


Benötigen Sie wirklich mehr als die ~ 15 signifikanten Zahlen, die Ihnen ein Gleitkommawert mit doppelter Genauigkeit gibt? Obwohl allgemeine Verallgemeinerungen schlecht sind, würde ich sagen, dass 16-Bit-Ganzzahlen wahrscheinlich das häufigste Format sind, wenn Sie das Aggregat aller Festkomma-DSP-Systeme betrachten.
Jason R

Antworten:


7

Die numerische Genauigkeit von Ganzzahlen ist nur dann besser als die numerische Genauigkeit von Gleitkommazahlen, wenn die Ganzzahlauflösung besser ist. Doubles haben 52 Bruchbits, daher haben Floats mit doppelter Genauigkeit eine schlechtere Auflösung als ganze Zahlen bei etwa , was viel größer als 32768 ist ( 2 15 ). Nein, die numerische Genauigkeit ist nicht besser, wenn Sie zu ganzen Zahlen wechseln.2522fünfzehn

Das zweite Problem ist die Geschwindigkeit. Die Antwort lautet: Es kommt auf die Hardware an. Wenn Sie Ihr Programm auf einem digitalen Signalprozessor ausführen, der über mehrere Festkomma-Multiplikations- / Akkumulationskerne verfügt, ist dies im Festkomma-Prozess weitaus schneller. Auf einem x86-Chip hingegen ist der Fixpunkt wahrscheinlich langsamer . Ich habe genau das getan, wovon Sie sprechen, und gesehen, wie sich meine Ausführungszeiten erhöht haben.

Nachdem ich einige Suchanfragen im Internet durchgeführt hatte, stellte ich fest, dass dies häufig vorkommt. Der Grund dafür ist, dass es einen dedizierten Gleitkomma-Prozessor gibt, der beim Übergang zum Festkomma nichts tut, während die Festkomma-Hardware mit der regulären Festkomma-Aktion wie der Zeigerarithmetik gemeinsam genutzt wird.

Wenn Sie die Verarbeitung beschleunigen möchten, müssen Sie von Floats mit doppelter Genauigkeit zu Floats mit einfacher Genauigkeit wechseln. Das sollte zu einer deutlichen Geschwindigkeitssteigerung führen. Dies würde natürlich Ihre numerische Genauigkeit verringern.


Ich meinte, was diese Antwort sagt, als ich meine schrieb. Dieses hier ist besser. Wenn ich mich auch nicht irre, habe ich irgendwo gelesen, dass auf einigen Computern (64 Bit vielleicht?) Der native Hardware-Gleitkommatyp doppelt ist, sodass die Verwendung von Gleitkommazahlen mit einfacher Genauigkeit (vier Byte) tatsächlich langsamer sein kann. Dies ist jedenfalls zu berücksichtigen.
Heltonbiker

Floats mit einfacher Genauigkeit haben 23-Bit-Mantissen, Doppel- Floats haben 52-Bit.
Paul R

Ich schlage 16-Bit-Ganzzahl + 48-Bit-Bruch als Alternative zum Gleitkomma mit doppelter Genauigkeit vor. Ich habe 32768 erwähnt, um anzuzeigen, dass meine Werte leicht in diesen Bereich passen. Angesichts der Beschränkung auf diese Werte würde Q16.48 meiner Meinung nach eine größere numerische Genauigkeit bieten als Gleitkommazahlen mit doppelter Genauigkeit.
Nibot

1
@nibot Okay. Die Doppelwerte hätten eine bessere Genauigkeit von -16 bis +16, und die gebrochenen ganzen Zahlen hätten an anderer Stelle eine bessere Genauigkeit bis zu -32769 und +32768. Sie konnten natürlich nichts darüber hinaus darstellen. Sie wären auch langsamer als Doppel. Für mich wären die begrenzte Reichweite und die langsame Geschwindigkeit Deal Breaker, aber YMMV.
Jim Clay

6

Die Vorteile von Festkomma liegen hauptsächlich in der Leistung (z. B. wenn Sie eine Auswahl an Prozessorhardware haben oder der Prozessor nicht verwendete Funktionseinheiten gut herunterfahren kann). Dies liegt daran, dass Festkommaeinheiten für eine bestimmte Technologie- und Betriebsausgaberate üblicherweise kleiner sind (weniger Transistoren, kürzere Drähte, weniger Kapazität, die pro MAC überwunden werden muss) als Gleitkommaeinheiten.

Eine große Anzahl gängiger moderner Prozessoren (Server, PC und sogar Mobilgeräte) verfügt jedoch über mehr und schnellere FPUs (insbesondere FP-Einheiten mit einfacher Genauigkeit) als ganzzahlige Multiplikatoren, und der größte Teil der Systemleistung stammt nicht aus der Verwendung der FPU, daher wird die Festplatte verwendet -point hat für die typische DSP-Berechnung dieser Produkte nur geringe oder keine Vorteile und kann wahrscheinlich einen Nachteil in Bezug auf die reine Leistung darstellen. Mit der aktuellen Technologie wird jeder Vorteil für den Festkomma-Modus hauptsächlich bei winzigen eingebetteten Produkten wie Geräten mit Tastengröße erzielt.

Berücksichtigen Sie jedoch auch Speicher- und Prozessor-Cache-Footprints. Die clevere Verwendung kleinerer Datentypen (Short Int und Float), um eine große Berechnung vollständig in den Datencache zu integrieren, kann alle Vorteile der reinen FPU-Bandbreite ausgleichen.


2
+1 für die Erwähnung der Bedeutung von Cache-Problemen für die Leistung. Auf modernen x86-Prozessoren kann das Entwerfen Ihres Algorithmus unter Berücksichtigung des Cache einen enormen Einfluss auf die Leistung haben.
Jason R

5

Ziehen Sie Floats mit einfacher Genauigkeit dem Doppelten vor - dies halbiert Ihre Speicherbandbreite, den Cache-Platzbedarf und die Speicheranforderungen und beschleunigt einige mathematische Operationen. Es eröffnet auch die Möglichkeit einer 4-Wege-SIMD, wenn weitere Optimierungen erforderlich sind.

Ein Fixpunkt lohnt sich nur dann wirklich, wenn Sie keine FPU haben. Die meisten modernen x86-CPUs verfügen über zwei FPUs, sodass durch die Verwendung eines Fixpunkts nichts zu gewinnen ist und die Leistung mit einem Fixpunkt möglicherweise sogar erheblich schlechter ist. (Beachten Sie auch, dass für Fixpunkte zusätzliche Anweisungen im Vergleich zu Gleitkommawerten für Operationen wie Multiplikation erforderlich sind.)


Ich bin daran interessiert, die numerische Genauigkeit zu erhöhen , nicht zu verringern.
Nibot

Wie sehen Sie, dass der Fixpunkt die numerische Genauigkeit im Vergleich zu einem Double verbessert, das bereits eine Genauigkeit von 52 Bit und einen großen Dynamikbereich aufweist?
Paul R

Nun, ich könnte ein Festkommaformat mit mehr als 52 Bit verwenden.
Nibot

Da Sie anscheinend mindestens 16 Bit für den ganzzahligen Teil Ihrer Festkomma-Darstellung benötigen, benötigen Sie weit über 64 Bit. Sie suchen also wahrscheinlich nach einem Format, für das Ihre CPU nicht einmal native Integer-Anweisungen hat. In diesem Fall können Sie auch einfach eine vorhandene große Ganzzahlbibliothek oder ähnliches verwenden. Die wichtigste Frage aber zu beantworten ist: wie viel Präzision tun Sie wirklich brauchen ?
Paul R

3

Zusätzlich zu den hier sehr guten Antworten gibt es einige Dinge, die es wert sind, hinzugefügt zu werden:

  • Es gibt Situationen, in denen Sie, selbst wenn Sie sehr grundlegende Anforderungen an den Dynamikbereich der von Ihnen verarbeiteten Daten haben, für einige der daran ausgeführten Vorgänge eine sehr gute Präzision benötigen - zum Beispiel möchten Sie einen IIR-Filter anwenden, der erfordert relativ kleine Koeffizienten; und das Abschneiden würde Instabilitäten verursachen. Sobald Ihr System Feedback hat, besteht eine gute Chance, dass Quantisierungs- / Kürzungsprobleme Sie bei der Verwendung von Fixpunkten zurückbeißen. Sie müssen viel vorsichtiger sein, wenn es um Filtertopologie und Kürzungs- / Bruchsparungsschemata geht.
  • Im Gegensatz zu vielen DSP / DSC-Architekturen verfügt der x86 nicht über gesättigte Ganzzahloperationen (nun, er ist in SSE vorhanden, nicht in Standard-Skalarcode). Dies bedeutet, dass im Falle eines Überlaufs schlimme Dinge passieren können - Werte, die Vorzeichen ändern und "einwickeln". Sie müssen bei Überläufen und Dynamikbereichen besonders vorsichtig sein oder Tests auf Operandenbereiche streuenüberall in Ihrem Code. Dies kann die Leistung ernsthaft beeinträchtigen. Im Vergleich dazu ist Gleitkomma für diese Probleme widerstandsfähiger, da der große Dynamikbereich mehr "Headroom" bietet und Überläufe nicht zu katastrophalen Ausfällen führen. Der meiste Code für die Verarbeitung von Audiosignalen, der auf Desktop-Computern ausgeführt wird, verwendet den Bereich -1,0 .. 1,0 mit einfacher oder doppelter Genauigkeit. Dies ergibt also mehr als Hunderte dB Headroom. Ich habe Audiosignalverarbeitungscode mit beiden Ansätzen geschrieben, und bei Verwendung von Gleitkomma gibt es nur wenige Stellen, an denen ich das Signal explizit abschneiden / sättigen muss - normalerweise nur am Ende der Signalverarbeitungskette oder an Stellen, an denen Rückkopplungen auftreten.

1

Einige Punkte zu beachten:

  • Die meisten modernen Prozessoren optimieren seit vielen Jahren die Gleitkommazahlverarbeitung, und selbst GPUs werden dafür bereits sehr erfolgreich eingesetzt.
  • Festkommaberechnungen beeinträchtigen Ihre Daten und können schwerwiegende Probleme verursachen, wenn arithmetische Operationen nicht gut konditioniert sind (aus diesem Grund wurden Festkommazahlen durch Gleitkommazahlen ersetzt).
  • Selbst wenn Sie vorzeichenbehaftete Kurzschlüsse verwenden, um Ihre Daten zu enthalten (viele Datenlogger verwenden eine 16-Bit-Genauigkeit), sollten die BERECHNUNGEN in Gleitkommawerten ausgeführt und dann wieder in Ganzzahlen konvertiert werden, da sonst Artefakte wie Quantisierung und Aliasing auftreten können.

Als letztes Wort denke ich, dass unsere Daten aus der realen Welt wertvoll sind und das blinde Zahlen-Crunching des Computers eine bescheidene Kleinigkeit ist. Der Computer muss für Ihre Daten und für Sie die Schwerarbeit leisten und darf nicht so behandelt werden, als wäre er der wahre Star in der Show.


Ich wollte nicht implizieren, dass ich 16-Bit-Shorts verwenden würde, um meine Mengen zu enthalten, sondern so etwas wie ein 64-Bit-Festkommaformat mit einem 16-Bit-Integer-Teil und einem 48-Bit-Bruchteil. Die Motivation ist, dass sich meine numerische Genauigkeit verbessern würde, wenn ich die meisten Exponentenbits im Gleitkommaformat nicht verwenden würde, wenn ich diese Bits stattdessen verwenden würde, um zusätzliche signifikante Ziffern bereitzustellen?
Nibot

2fünfzehn

Noch etwas: Es scheint mir, dass StackOverflow (anstelle von DSP.SE hier) der ideale Ort ist, um tiefere Gründe für Vor- und Nachteile eines Formats gegenüber dem anderen zu ermitteln.
Heltonbiker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.