6

私は最近、計算シェーダーで遊んでいて、[numthreads(x,y,z)] をセットアップして呼び出しをディスパッチするための最適な方法を決定しようとしています。私のデモ ウィンドウは 800x600 で、ピクセルごとに 1 つのスレッドを起動しています。2D テクスチャの修正を行っています - 重すぎることはありません。

私の最初の試みは指定することでした

[numthreads(32,32,1)]

私の Dispatch() 呼び出しは常に

Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)

したがって、最初のインスタンスは

Dispatch(25,19,1)

これは 25 ~ 26 fps で実行されました。次に、16 fps で実行される [numthreads(4,4,1)] に減らしました。それを [numthreads(16,16,1)] に増やすと、約 30 fps の優れた結果が得られ始めました。Y スレッド グループ番号 [numthreads(16,8,1)] をいじって、なんとか 32 fps に押し上げました。

私の質問は、GPU を最も効果的に利用できるようにスレッド数を決定する最適な方法はありますか、それとも古き良き試行錯誤ですか?

4

2 に答える 2

4

これは GPU 固有のものですが、NVIDIA ハードウェアを使用している場合は、CUDA Occupancy Calculatorを使用してみてください。

DirectCompute を使用していることは知っていますが、それらは同じ基盤となるハードウェアにマップされます。FXC の出力を見ると、アセンブリ内のスレッドごとの共有メモリ サイズとレジスタを確認できます。また、使用しているカードから計算能力を推測することもできます。コンピューティング機能は、cs_4_0、cs_4_1、cs_5_0 などのプロファイルに相当する CUDA です。

目標は、「占有率」、つまり占有率 == 100% - %idle-due-to-HW-overhead を増やすことです。

于 2013-10-24T09:07:26.810 に答える