43

私は本当にメモリが不足していて、より小さな範囲が必要であると仮定します(shortvsに似ていintます)。シェーダー言語halfは、半分の精度の浮動小数点型を既にサポートしています (値が -1 と 1 の間になるように変換するだけではありません。つまり、次のような float を返しますshortComingIn / maxRangeOfShort)。2 バイトの float に対して既に存在する実装はありますか?

また、2 バイトの float がない理由について (歴史的な?) 理由を知りたいと思っています。

4

8 に答える 8

18

Re: 実装: 誰かがhalfC 用に書いたようです。これは (もちろん) C++ で動作します: https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/cellperformance-snippets /half.c

Re: なぜfloat4 バイトなのか: おそらくそれ以下では、精度が非常に限られているためです。IEEE-754 では、「半分」の有効桁数の精度は 11 ビットのみで、10 進数で約 3.311 桁の精度が得られます (一方、10 進数で 6 桁から 9 桁の精度で 24 ビット、倍精度53ビット)。15 桁と 17 桁の精度)。

于 2011-04-23T20:59:39.497 に答える
14

メモリが不足している場合は、フロートの概念を削除することを検討しましたか?フロートは、小数点がどこにあるかを保存するためだけに多くのビットを消費します。小数点が必要な場所がわかっている場合は、これを回避できます。たとえば、ドルの値を保存したい場合は、セントで保存できます。

uint16_t cash = 50000;
std::cout << "Cash: $" << (cash / 100) << "." << ((cash % 100) < 10 ? "0" : "") << (cash % 100) << std::endl;

もちろん、これは、小数点の位置を事前に決定できる場合の唯一のオプションです。ただし、可能であれば、常にそれを選択してください。これにより、すべての計算が高速化されます。

于 2011-04-24T07:49:26.690 に答える
6

16 ビット floatのIEEE 754 標準あります。

2002年にリリースされたGPUをベースに2008年に標準化された新しいフォーマットです。

于 2011-04-23T21:20:08.420 に答える
3

整数への切り替えで Kiralein よりも少し先に進むには、範囲を定義し、short の整数値がその範囲で等しい分割を表すことを許可し、ゼロにまたがる場合はある程度の対称性を持たせることができます。

short mappedval = (short)(val/range);

これらの整数バージョンと半精度浮動小数点の使用との違い:

  1. 整数は範囲内で等間隔ですが、浮動小数点数はゼロ近くにより密集しています。
  2. 整数を使用すると、CPU で浮動小数点ではなく整数演算が使用されます。整数演算の方が簡単なため、多くの場合は高速です。そうは言っても、値を非対称範囲にマッピングするには、最後に値を取得するために追加などが必要になります。
  3. 絶対精度の損失はより予測可能です。各値の誤差がわかっているので、範囲を考慮して、総損失を事前に計算できます。逆に、相対誤差は、浮動小数点を使用すると予測しやすくなります。
  4. 2 つの short を int にパックすることにより、値のペア、特にビット単位の操作を使用して実行できる操作の小さな選択がある場合があります。これにより、必要なサイクル数を半分にすることができ (短い操作で int へのキャストが必要な場合はそれ以上)、32 ビット幅を維持できます。これは、暗号で使用される 32 ビットが並行して処理されるビットスライスの希釈バージョンにすぎません。
于 2012-06-14T16:18:17.337 に答える