come impedire ai denormali di incasinare un processo in tempo reale (come un'app audio o una presa)

5

Quindi esiste una pagina Intel su cosa fare su denorms. (A proposito, so esattamente cosa sono i denormali e sono abbastanza familiare con lo standard in virgola mobile IEEE-754.)

Ho due domande:

  1. Quali sono i nomi delle chiamate di sistema (in Visual Studio) per attivare questi FTZ e DAZ bit in modo che le denorms non causino eccezioni?

  2. Qual è la differenza tra i bit FTZ (Flush to zero) e DAZ (Denorms zero)? il DAZ bit è solo uno di interpretazione?

Le denorm sono considerate così rare che non è ritenuto necessario disporre di beni immobili sul silicio per gestirli numericamente correttamente? Perché c'è anche un'eccezione per questi? (Immagino sia una terza domanda.)

    
posta robert bristow-johnson 01.12.2016 - 02:14
fonte

1 risposta

7

Su Windows puoi fare quanto segue:

#include <mmintrin.h>
#define DISABLE_DENORMALS   \
        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 RESTORE_DENORMALS   \
        _mm_setcsr( oldMXCSR );

Su Mac (o qualsiasi sistema Posix) puoi fare

#include <fenv.h>
#define DISABLE_DENORMALS   \
    fenv_t fenv;                \
        fegetenv(&fenv);        \
        fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);

#define RESTORE_DENORMALS   \
        fesetenv(&fenv);

e puoi usarne uno come

processing_function(...)
{
DISABLE_DENORMALS

// signal processing code

RESTORE_DENORMALS
}

Le negazioni sono piuttosto rare per i calcoli che non hanno feedback; sono piuttosto degenerati. E devi ricordare che corrispondono valori estremamente piccoli. Per qualsiasi calcolo a cui tieni effettivamente a mente quei valori che non vengono svuotati a zero, probabilmente anche a te non importa quanto sia efficiente l'elaborazione.

Le negazioni scaricate a zero sono la cosa giusta da fare per l'audio; inoltre appaiono più spesso di quanto ci si aspetterebbe a causa delle strutture di feedback in decadimento che tendiamo ad avere negli algoritmi audio.

FTZ fa in modo che il risultato del calcolo sia impostato su Zero se il risultato è denormale; ti assicura di non generare denormali.

DAZ fa in modo che gli input per il calcolo siano considerati zero se sono denormali; assicura che i tuoi calcoli non rallentino se l'input passato a te contiene denormali.

    
risposta data 01.12.2016 - 03:26
fonte

Leggi altre domande sui tag