¿Cómo evitar los números desnormalizados?

7

El mismo sistema de procesamiento de señal digital AMD X86-64 de punto flotante mencionado en mi pregunta anterior tiene un problema en el que a veces se ralentiza sustancialmente cuando las señales alcanzan valores muy cercanos (pero no exactamente) cero.

El problema es que los valores de punto flotante desnormalizados requieren un procesamiento especial por parte de la CPU, que es dramáticamente más lento que tratar con valores normales de punto flotante. Esto puede hacer que el sistema DSP funcione demasiado lento, ya que lleva más de calcular todo lo que debe calcularse en un ciclo.1/fs

Una solución alternativa es agregar un pequeño desplazamiento a todos los números para forzarlos al rango de números normales. ¿Hay alguna manera de instruir a la FPU para que simplemente no genere números denormales en primer lugar?

El sistema operativo es Linux y el compilador es gcc.

EDITAR: Además, ¿cuáles son las consecuencias numéricas de deshabilitar los números denormales?

nibot
fuente
¿Está utilizando instrucciones x87 FPU, MMX, SSE, AVX, todo lo anterior, etc.?
Jason R
Solo FPU, creo. Precisión doble. En su mayor parte, las matemáticas se implementan directamente en C y el compilador de C (gcc) hace lo que hace. En lugar de la biblioteca matemática que utilizamos algunas pequeñas funciones de montaje en línea para obtener sincos, etc
nibot

Respuestas:

10

Puede forzar los números denormales a cero estableciendo los bits "flush a zero" y "denormals are zero" (15,6) en el registro MXCSR .

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