固定小数点計算と浮動小数点計算の相対的なメリットは?


9

倍精度浮動小数点数を使用して高速x86マシンで動作するデジタル信号処理システムがあります。私は、浮動小数点表現の巨大なダイナミックレンジを実際に使用していないことに気付きました。すべての量が簡単に±32768の範囲に収まります。

私の質問:固定小数点計算に切り替えると、数値の精度(優先度が高い)または計算時間(優先度が低い)でメリットが得られる可能性はありますか?

もちろん、答えは固定小数点計算に使用できるビット数によって異なります。一般的な固定小数点システムは何ビットの精度を利用しますか?たとえば、x86-64 で64ビット(16ビット整数部、48ビット小数部)を使用して、固定小数点計算を効率的に行うことは可能ですか?

固定小数点計算はCPUパワーが制限されている状況でのみ使用されるといつも思っていました。CPUパワーが問題にならないときに固定小数点計算を使用することは理にかなっていますか?


本当に、倍精度浮動小数点値が与える15桁以上の有効数字が必要ですか?広い一般化は悪いですが、すべての固定小数点DSPシステムの集合体を見ると、16ビット整数が最も一般的な形式であると思われます。
Jason R

回答:


7

整数の精度が優れている場合、整数の数値精度は浮動小数点の数値精度よりも優れています。doubleの小数ビットは52であるため、倍精度のfloatは、約整数よりも解像度が低く、32768()よりはるかに大きくなります。ですから、いいえ、整数にすると数値の精度は良くなりません。 2 15252215

2番目の問題は速度です。答えは、ハードウェアに依存します。複数の固定小数点乗算/累算コアを備えたデジタルシグナルプロセッサでプログラムを実行している場合、はい、固定小数点の方がはるかに高速です。一方、x86チップでは、固定小数点の速度遅くなる可能性があります。私はあなたが一度話していることを正確に行い、私の実行時間が増加するのを見ました。

インターネットで検索したところ、それが一般的であることがわかりました。その理由は、固定小数点ハードウェアは通常の固定小数点アクション(ポインター演算など)と共有されているのに対して、固定小数点への移行時に何も実行しない専用の浮動小数点プロセッサがあるためです。

処理を高速化したい場合は、倍精度浮動小数点から単精度浮動小数点に変更する方法があります。これにより、速度が大幅に向上します。もちろん、数値の精度は低下します。


私が書いたとき、私はこの答えが言うことを意味していました。これは良いです。私が間違っていない場合も、一部のコンピューター(64ビットの可能性がありますか?)とにかく、これは考慮に入れるべきことです。
heltonbiker、

シングル精度浮動小数点数を23ビットmantissaeを有する、ダブルスは 52ビットを有します。
Paul R

倍精度浮動小数点の代わりに、16ビット整数+ 48ビット小数をお勧めします。私の値がこの範囲に簡単に収まることを示すために32768について言及しました。これらの値に対する制限を考えると、Q16.48は倍精度浮動小数点よりも数値精度が高いと思います。
nibot 2012年

1
@nibotわかりました。doubleは-16から+16までの精度が高く、小数整数は-32769と+32768までの精度が高くなります。もちろん、それ以上のものを表すことはできません。彼らはまた、ダブルスよりも遅いでしょう。私にとって、限られた範囲と遅い速度は取引ブレーカーですが、YMMV。
ジム・クレイ

6

固定小数点のメリットは、ほとんどの場合、電力に関するものです(プロセッサハードウェアを選択できる場合や、プロセッサが未使用の機能ユニットをシャットダウンする場合など)。これは、固定小数点ユニットは一般に、特定の技術と操作の問題発生率に対して、浮動小数点よりも小さい(トランジスタが少なく、ワイヤが短い、MACごとに克服する容量が少ない)ためです。

ただし、非常に多くの一般的な現代のプロセッサー(サーバー、PC、さらにはモバイル)は、整数乗算器よりも高速なFPU(特に単精度FPユニット)を備えており、システム能力のほとんどはFPUを使用していないため、固定-pointは、これらの製品の一般的なDSP計算にはほとんどまたはまったく利点がなく、純粋なパフォーマンスの点で不利になる可能性があります。現在のテクノロジーを使用すると、固定小数点の利点はほとんど、ボタンサイズのデバイスなどの小さな組み込み製品でほとんど発生します。

ただし、メモリとプロセッサのキャッシュフットプリントも考慮してください。小さなデータ型(short intおよびfloat)を巧みに使用して、大規模な計算をデータキャッシュに完全に適合させると、純粋なFPU帯域幅の利点が相殺される可能性があります。


2
+1は、パフォーマンスに関するキャッシュの問題の重要性について言及しています。最新のx86プロセッサでは、キャッシュを考慮してアルゴリズムを設計すると、パフォーマンスに大きな影響を与える可能性があります。
Jason R

5

倍精度よりも単精度浮動小数点を優先します。これにより、メモリ帯域幅が半分になり、フットプリントとストレージ要件がキャッシュされ、いくつかの数学演算が高速になります。さらに最適化が必要な場合は、4ウェイSIMDの可能性も開きます。

固定小数点は、FPUがない場合にのみ価値があります-ほとんどの最新のx86 CPUには2つのFPUがあるため、固定小数点を使用しても何も得られず、固定小数点を使用するとパフォーマンスが大幅に低下することもあります。(固定小数点は、乗算などの演算のために浮動小数点と比較して追加の命令を必要とすることにも注意してください。)


数値の精度を下げるのではなく、上げることに興味があります。
nibot 2012年

52ビットの精度と巨大なダイナミックレンジをすでに持っているdoubleと比較して、固定小数点が数値の精度をどのように向上させると思いますか?
Paul R

ええと、52ビットを超える固定小数点形式を使用できます。
nibot 2012年

固定小数点表現の整数部分に少なくとも16ビットが必要なため、64ビットをはるかに超えるので、CPUにネイティブ整数命令さえないフォーマットを検討していると思われます。その場合は、既存のビッグ整数ライブラリなどを使用することもできます。しかし、答える最も重要な質問は、どれくらいの精度が本当に必要かということです。
Paul R

3

ここで提供される非常に良い答えに加えて、追加する価値のあるいくつかの事項:

  • 処理するデータのダイナミックレンジに非常に基本的な要件がある場合でも、そのデータに対して実行される操作の一部に非常に優れた精度が必要になる場合があります。たとえば、次のようなIIRフィルターを適用したい場合があります。比較的小さな係数が必要です。それらを切り捨てると不安定になります。システムがフィードバックを受け取るとすぐに、固定小数点を使用すると、量子化/切り捨ての問題が発生する可能性が高くなります。フィルタートポロジーや切り捨て/小数保存スキームなどについては、さらに注意する必要があります。
  • 多くのDSP / DSCアーキテクチャとは異なり、x86には飽和整数演算がありません(まあ、SSEにあり、標準のスカラーコードにはありません)。これは、オーバーフローが発生した場合に、悪い値が発生する可能性があることを意味します-値が符号を変えて「折り返し」ます。オーバーフローとダイナミックレンジ、またはオペランドレンジのスプリンクルテストに特に注意する必要があります。コード全体。これはパフォーマンスに深刻な影響を与える可能性があります。比較すると、浮動小数点はこれらの問題に対してより回復力があります。これは、ダイナミックレンジが大きいため、「ヘッドルーム」が大きくなり、オーバーフローによって致命的な障害が発生することがないためです。デスクトップコンピューターで実行されているほとんどのオーディオ信号処理コードは、-1.0 .. 1.0の範囲、単精度または倍精度を使用しています。これにより、数百dB以上のヘッドルームが得られます。私は両方のアプローチでオーディオ信号処理コードを記述しましたが、浮動小数点を使用する場合、信号を明示的にクリップ/飽和する必要があるのはごくわずかです-通常、信号処理チェーンの最後またはフィードバックが発生する場所だけです。

1

考慮すべきいくつかのポイント:

  • 最近のほとんどのプロセッサは、長年にわたって浮動小数点数の処理を最適化しており、GPUもそのために非常にうまく使用されています。
  • 固定小数点計算はデータを傷つけ、算術演算が十分に条件付けされていない場合に深刻な問題を引き起こす可能性があります(そのため、固定小数点数が浮動小数点数に置き換えられました)。
  • 符号付きのshortを使用してデータを保持する場合でも(ロットデータロガーは16ビット精度を使用)、計算は浮動小数点で実行してから整数に変換する必要があります。そうしないと、量子化やエイリアスなどのアーティファクトが発生する可能性があります。

最後の言葉として、私たちの現実のデータは貴重であり、コンピュータのブラインドナンバークランチングは控えめな手間です。コンピュータは、データとあなたのために非常に骨の折れる作業を行うために配置する必要があり、それがショーの本当のスターであるかのように扱われるべきではありません。


16ビットのshortを使用して数量を含めるという意味ではなく、16ビットの整数部と48ビットの小数部を持つ64ビットの固定小数点形式のようなものです。動機は、とにかく浮動小数点形式の指数ビットのほとんどを使用していない場合、代わりにそれらのビットを使用して追加の有効数字を提供すると、数値精度が向上するということです。
nibot 2012年

元の質問に16ビット整数+ 48ビット小数を追加する必要があります。が混乱を引き起こしているようです。215
クリストファーフェルトン2012年

もう1つ:(ここではDSP.SEの代わりに)StackOverflowが、一方の形式のもう一方の形式の賛否両論についてより深い理由を得るための理想的な場所であるように思えます。
heltonbiker、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.