18

除算の整数レイテンシが非常に高く、数百サイクルのGPUデバイスに取り組んでいます。部門を最適化することを目指しています。

セット{1,3,6,10}にある分母によるすべての除算。ただし、分子は実行時の正の値であり、およそ32000以下です。メモリの制約により、ルックアップテーブルは適切なオプションではない場合があります。

あなたは代替案を考えることができますか?浮動小数点の逆数を計算し、それらを使用して分子を乗算することを考えました。

ありがとう

PS。人々に感謝します。ビットシフトハックは本当にクールです。丸めから回復するには、次のCセグメントを使用します。

// q = m/n
q += (n*(j +1)-1) < m;
4

3 に答える 3

12
a/b=a*(1/b)
x=(1<<16)/b
a/b=(a*x)>>16

分母のルックアップテーブルを作成できますか?15ビットの分子を言ったので、すべてが符号なし32ビットの場合、シフトに17を使用できます。

a/b=a*((1<<17)/b)>>17

シフトが大きいほど、丸め誤差は小さくなります。ブルートフォースチェックを実行して、これが実際に間違っている回数を確認できます。

于 2010-04-11T04:54:33.390 に答える
8

ヘンリー・ウォーレンの著書「ハッカーのたのしみ」には、整数除算を乗算/シフト/加算の一連の演算に変換する手法を含む、定数による整数除算に関する章全体があります。

このページでは、乗算/シフト/加算操作の魔法数を計算します。

于 2010-04-11T06:16:43.927 に答える
7

このための標準的な組み込みシステムのハックは、Nによる整数除算を1/Nによる固定小数点乗算に変換することです。

16ビットを想定すると、0.33333は21845(10進数)として表すことができます。乗算して32ビットの整数積を求め、16ビットシフトダウンします。

ほぼ確実に、丸め(切り捨て)エラーが発生します。これはあなたが一緒に暮らせるものかもしれないし、そうでないかもしれません。

GPUをよく調べて、分子の制限された範囲に関する知識を活用して、より高速な整数除算ルーチンを手動でコーディングできるかどうかを確認することは価値があるかもしれません。

于 2010-04-11T04:52:28.760 に答える