1

私はDirectComputeを使用してGPUで一般的なコンピューティングを行っています。現在、解像度1920x1080のテクスチャを操作しようとしています。Dispatch(2、1080、1)とnumthreads(960、1、1)があり、計算によれば、ピクセルごとに1つのスレッドで画像を正確にカバーしています。

さて、私が理解しているように、すべてのスレッドは同時に実行する必要がありますよね?ただし、私のコードでは、ピクセルが黒の場合は計算を行いません。そのため、ほとんどの画像が黒の場合、パフォーマンスが確実に向上することに気づきました。ただし、1つのオブジェクトが画面をブロックすると、パフォーマンスが大幅に低下します。

私の質問は、すべてのスレッドが並行して実行されている場合、フレームの処理速度は最もパフォーマンスの低いスレッドによって決定されます。基本的に、黒いピクセルで実行されているスレッドはアイドリング状態になります。では、なぜ、より多くのピクセルが処理されるときに速度が低下するのでしょうか。彼らは同時にそうするべきです。それとも私はこれをすべて間違っていますか?

どんな助けでもいただければ幸いです。

4

2 に答える 2

2

すべてのスレッドが同時に実行されるわけではありません。正確な数はおそらく少し変わっていますが、数年前、ハイエンドCPUは一度に16kスレッドを実行し続けることができましたが、実際に同時に実行されたのは「ほんの数百」でした。(これはさらに小さなサブグループに分割され、そのようなサブグループ内のすべてのスレッドは、正確なロックステップ、命令ごと、分岐ごとに実行されます)残りは中断され、I / Oを待機するか、その他の方法でブロックされました。

したがって、200万回の実行を必要とするアルゴリズムがある場合、いつでもスレッドとして存在するのはごく一部であり、実際に1つのバッチで実行されているのはごく一部です。また、現在実行中のスレッドの中には、正確なロックステップで実行するように強制されるものもあります(したがって、スレッドの1つが早期に終了するようなことはなく、グループ全体が同じパスをたどる必要があります)が、異なるグループは異なる時間に終了する可能性があります。

はい、GPUでのスレッド化は複雑です。

于 2012-10-25T09:28:52.133 に答える
0

非常に重いアルゴリズムを使用していて、バックバッファレンダリングに画像を使用している場合、ストールが発生する可能性があります。バックバッファに画像を待機させる。次のフレームでレンダリングしてみてください。つまり、あなたは「フレームビハインド」です。

そして、あなたのアルゴリズムはどのように見えますか?

于 2012-10-25T09:20:55.440 に答える