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?


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));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.