Wie vermeide ich denormalisierte Zahlen?

7

Das gleiche digitale Gleitkomma-AMD X86-64-Signalverarbeitungssystem, das in meiner vorherigen Frage erwähnt wurde, hat ein Problem, bei dem es manchmal erheblich langsamer wird, wenn Signale Werte erreichen, die sehr nahe (aber nicht genau) Null sind.

Das Problem ist, dass denormalisierte Gleitkommawerte eine spezielle Verarbeitung durch die CPU erfordern, die erheblich langsamer ist als der Umgang mit normalen Gleitkommawerten. Dies kann dazu führen, dass das DSP-System zu langsam läuft. Es dauert länger als , um alles zu berechnen, was in einem Zyklus berechnet werden muss.1/fs

Eine Problemumgehung besteht darin, allen Zahlen einen kleinen Versatz hinzuzufügen, um sie in den Bereich normaler Zahlen zu zwingen. Gibt es eine Möglichkeit, die FPU stattdessen anzuweisen, überhaupt keine denormalen Zahlen zu generieren?

Das Betriebssystem ist Linux und der Compiler ist gcc.

EDIT: Welche numerischen Konsequenzen hat die Deaktivierung von Denormalzahlen?

Nibot
quelle
Verwenden Sie x87-FPU-Anweisungen, MMX, SSE, AVX, alle oben genannten usw.?
Jason R
Nur FPU, denke ich. Doppelte Genauigkeit. Zum größten Teil wird die Mathematik direkt in C implementiert und der C-Compiler (gcc) macht alles, was er macht. Anstelle der Mathematikbibliothek verwenden wir einige kleine Inline-Assembly-Funktionen, um sincosusw. zu erhalten
Nibot

Antworten:

10

Sie können denormale Zahlen auf Null setzen, indem Sie die Bits "Flush to Zero" und "Denormals are Zero" (15,6) im MXCSR- Register setzen.

_mm_setcsr( _mm_getcsr() | (1<<15) | (1<<6));
Mark Borgerding
quelle