Como evitar números desnormalizados?

7

O mesmo sistema de processamento de sinal digital AMD X86-64 de ponto flutuante mencionado na pergunta anterior tem um problema em que às vezes diminui substancialmente quando os sinais atingem valores muito próximos (mas não exatamente) a zero.

O problema é que os valores de ponto flutuante desnormalizados requerem processamento especial pela CPU, que é muito mais lento do que lidar com valores normais de ponto flutuante. Isso pode fazer com que o sistema DSP seja executado muito lentamente - levando mais de para calcular tudo o que precisa ser calculado em um ciclo.1 1/fs

Uma solução alternativa é adicionar um pequeno deslocamento a todos os números para forçá-los ao intervalo de números normais. Existe uma maneira de instruir a FPU a simplesmente não gerar números desnormais em primeiro lugar?

O sistema operacional é Linux e o compilador é gcc.

EDIT: Além disso, quais são as consequências numéricas da desativação de números desnormais?

nibot
fonte
Você está usando as instruções x87 da FPU, MMX, SSE, AVX, todas as opções acima, etc.?
Jason R
Apenas FPU, eu acho. Dupla precisão. Na maioria das vezes, a matemática é implementada diretamente em C e o compilador C (gcc) faz o que faz. Em vez da biblioteca de matemática que usamos algumas funções pequenas de montagem em linha para chegar sincos, etc.
nibot

Respostas:

10

Você pode forçar números desnormais a zero definindo os bits "flush to zero" e "denormals are zero" (15,6) no registro MXCSR .

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