2

たとえば、GPU を使用してフィボナッチ数列の最初の 100 万項を計算したいとします。(これは 32 ビット データ型の精度制限を超えることを認識しています - 例として使用しただけです)

40 個のシェーダー/ストリーム プロセッサを備えた GPU と、参考書を使用してごまかすと、100 万個の項を 250,000 ストリップの 40 ブロックに分割し、各シェーダーに 2 つの開始値をシードすることができます。

単位 0: 1,1 (2,3,5,8、何とか何とかを計算)

1号機:25万期

2号機:50万期

...

可能であれば、ピクセルが順番に処理されるようにするにはどうすればよいですか? 入力テクスチャの最初の数ピクセルに値がある場合 (簡単にするために RGBA を使用)

0,0,0,1 // initial condition
0,0,0,1 // initial condition
0,0,0,2
0,0,0,3
0,0,0,5
...

最初の 4 項の準備が整う前に 5 項を計算しないようにするにはどうすればよいですか?

これは複数のパスで実行できることを認識していますが、値が計算されるたびに「準備完了」ビットを設定しますが、それは非常に非効率的であり、GPU でこのタイプの計算を実行する利点が失われます。

OpenCL/CUDA/etc はおそらくこれを行うための優れた方法を提供しますが、私は (私自身の教育のために) これを XNA/HLSL で動作させようとしています。

リンクや例は大歓迎です。

更新/簡素化

あるピクセルの値を使用して隣接するピクセルの値に影響を与えるシェーダーを作成することはできますか?

4

1 に答える 1

2

ピクセルが処理される順序を決定することはできません。可能であれば、シェーダー パイプラインの大量のピクセル スループットが中断されます。できることは、非再帰式を使用してフィボナッチ数列を計算することです。

あなたの質問では、実際にシェーダーユニットをシリアル化して次々と実行しようとしています。すぐに CPU を使用でき、はるかに高速になります。

ところで、複数のパスは思ったほど遅くはありませんが、あなたの場合には役に立ちません。前の値を知らずに次の値を実際に計算することはできないため、並列化が無効になります。

于 2010-12-01T16:22:58.523 に答える