非正規化数を回避する方法は?


7

前の質問で述べたのと同じ浮動小数点AMD X86-64デジタル信号処理システムには、信号がゼロに非常に近い(正確ではない)値になると、速度が大幅に低下することがあるという問題があります。

問題は、非正規化された浮動小数点値が、通常の浮動小数点値を処理するよりも劇的に遅いCPUによる特別な処理を必要とすることです。これにより、DSPシステムの動作が非常に遅くなる可能性があります。1/fs 1サイクルで計算する必要があるすべてのものを計算します。

回避策は、すべての数値に小さなオフセットを追加して、それらを通常の数値の範囲に強制することです。そもそもFPUに非正規数を生成しないように指示する方法はありますか?

OSはLinux、コンパイラはgccです。

編集:また、非正規数を無効にすると、数値的にどのような影響がありますか?


x87 FPU命令、MMX、SSE、AVX、その他すべてを使用していますか?
Jason R

FPUだけだと思います。倍精度。ほとんどの場合、数学はCに直接実装されており、Cコンパイラ(gcc)は計算を行います。数学ライブラリの代わりに、いくつかの小さなインラインアセンブリ関数を使用してsincos、などを取得します
。– nibot

回答:


10

MXCSRレジスタの「flush to zero」ビットと「denormals are zero」ビット(15、6)を設定することで、非正規化数を強制的に0にできます。

_mm_setcsr( _mm_getcsr() | (1<<15) | (1<<6));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.