2012-07-26 7 views
7

He rastreado la web en vano.Volcar números denormalizados a cero

¿Hay alguna manera de que Xcode y Visual C++ traten los números denormalizados como 0? Hubiera pensado que hay una opción en las preferencias de IDE para activar esta opción pero parece que no puede encontrarla.

Estoy haciendo algunas cosas de audio multiplataforma y necesito detener ciertos procesadores que acaparan recursos.

Saludos

Respuesta

9

usted está buscando una manera definida por la plataforma para establecer FTZ y/o DAZ en el Registro MXCSR (en x86 con SSE o x86-64); ver https://stackoverflow.com/a/2487733/567292

Normalmente esto se llama algo así como _controlfp; documentación de Microsoft está en http://msdn.microsoft.com/en-us/library/e9b52ceh.aspx

También puede utilizar la macro _MM_SET_FLUSH_ZERO_MODE: http://msdn.microsoft.com/en-us/library/a8b5ts9s(v=vs.71).aspx - este es probablemente el método portátil de plataforma cruzada más.

+0

increíble - Gracias por señalarme en la dirección correcta! – Adam

+0

También necesita establecer indicadores de compilador de Visual Studio para usar sse: "/ arch: sse2" – yairchu

4

Para deshabilitar denormals a nivel mundial que utilizan estos 2 macros:

//warning these macros has to be used in the same scope 
#define MXCSR_SET_DAZ_AND_FTZ \ 
int oldMXCSR__ = _mm_getcsr(); /*read the old MXCSR setting */ \ 
int newMXCSR__ = oldMXCSR__ | 0x8040; /* set DAZ and FZ bits */ \ 
_mm_setcsr(newMXCSR__); /*write the new MXCSR setting to the MXCSR */ 

#define MXCSR_RESET_DAZ_AND_FTZ \ 
/*restore old MXCSR settings to turn denormals back on if they were on*/ \ 
_mm_setcsr(oldMXCSR__); 

que llamo el primero al inicio del proceso y el segundo al final. Desafortunadamente esto parece no funcionar bien en Windows.

para limpiar denormals localmente utilizo este

const Float32 k_DENORMAL_DC = 1e-25f; 
inline void FlushDenormalToZero(Float32& ioFloat) 
{ 
    ioFloat += k_DENORMAL_DC; 
    ioFloat -= k_DENORMAL_DC;  
}