2012-07-26 4 views
7

Ich habe das Internet vergebens durchforstet.Spülung derormalisierte Zahlen auf Null

Gibt es eine Möglichkeit für Xcode und Visual C++, denormalisierte Zahlen als 0 zu behandeln? Ich hätte gedacht, dass es eine Option in den IDE-Einstellungen gibt, um diese Option zu aktivieren, aber sie scheint nicht gefunden zu werden.

Ich mache einige Cross-Plattform-Audio-Zeug und muss bestimmte Prozessoren stoppen Ressourcen hemmen.

Prost

Antwort

9

Sie sind für eine Plattform definierte Art und Weise suchen FTZ und/oder DAZ im MXCSR Register (auf x86 mit SSE oder x86-64) einzustellen; siehe https://stackoverflow.com/a/2487733/567292

Normalerweise wird dies so etwas wie _controlfp; Microsoft Dokumentation ist unter http://msdn.microsoft.com/en-us/library/e9b52ceh.aspx

Sie können auch die _MM_SET_FLUSH_ZERO_MODE Makro verwenden: http://msdn.microsoft.com/en-us/library/a8b5ts9s(v=vs.71).aspx - dies ist wahrscheinlich die meisten Cross-Plattform-portable Methode.

+0

Erstaunlich - Danke, dass du mich in die richtige Richtung für den Hinweis! – Adam

+0

Sie müssen auch Visual Studio-Compilerflags setzen, um sse: "/ arch: sse2" zu verwenden – yairchu

4

Für denormals global ich diese 2 Makros zu deaktivieren:

//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__); 

Ich nenne die erste am Anfang des Prozesses und die zweite am Ende. Leider scheint dies unter Windows nicht gut zu funktionieren.

Zum Spülen denormals lokal benutze ich diese

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