12

GPUにディスパッチできるスレッド/スレッドグループの「グリッド」について疑問に思っています。私はDirectComputeを使用しているので、そのAPIを使用した具体的な例を示します。たとえば、Dispatch(2,2,2)を呼び出すと、合計2x2x2=8のスレッドグループがディスパッチされることがわかります。ただし、Dispatch(8,1,1)を呼び出すと、8x1x1 = 8スレッドグループもディスパッチする場合の違いは何ですか?パフォーマンスに違いはありますか?

GPU上のスレッドに関するPSの同じ質問。計算(.hlsl)ファイルで宣言されたnumthreads(2,2,2)とnumthreads(8,1,1)の違いは何ですか?

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

4

2 に答える 2

14

純粋なパフォーマンスの観点からは、スレッドグループまたはブロックのグリッドのディメンションを定義する機能は、パフォーマンスではなく、問題自体の抽象化にワークロードを正しく適用するためのものであるため、実際には違いはありません。 。言い換えると、問題が3Dボリュームグリッドにうまく抽象化されている場合、3D問題を1D線形表現に変換するマッピングを使用して同じ数のスレッドグループ/ブロックを作成できますが、そのマッピングの抽象化対処するのが少し面倒な場合があります。さらに、マッピングが複雑すぎると、パフォーマンスがわずかに低下する可能性があります。

ただし、作成するスレッドグループ/ブロックの数、およびそれらのブロック内のスレッドの数は重要です。Nvidia GPUの場合、各スレッドグループはGPU上のSMXプロセッサに割り当てられ、メモリアクセスなどによる遅延を隠すために、複数のスレッドブロックとそれに関連するスレッドをSMXにマッピングする必要があります。 GPUのSIMT(同じ命令/複数スレッド)機能を利用できるように、スレッドグループ/ブロックに十分なスレッドが必要です。これは、Nvidia GPUのSMX内の各クロックサイクル(または一連のクロックサイクル)に対して、ロックステップで同時にX個のスレッドを実行できることを意味します。この数は「スレッドワープ」サイズと呼ばれます。このワープカウントを満たすのに十分なスレッドをブロックに含める必要があります。そうしないと、GPUのリソースが不足します。ブロックがGPUの個々のSMXプロセッサで実行されている場合、コアストリーミングプロセッサは使い果たされていません。この数は、NvidiaFermiGPUでは32スレッドです。CUDAでは、使用しているGPUに基づいてこの情報を照会できますが、DirectComputeではこれが抽象化されると想定しています。ATIカードには、ストリーミングプロセッサに対する「スレッド幅」もあります。これは「波面」あたり64スレッドです。

理想的には、GPUの波面またはワープサイズのスレッド数を埋めるのに十分なスレッドをブロックに入れ、次に、GPU上の各ストリーミングプロセッサにマップできるブロックをたくさん入れて、高レイテンシの操作が発生した場合はいつでも、実行中の状態を維持し、ストリーミングプロセッサでスワップアウトできます。これにより、GPUの計算帯域幅が最大化されます。

于 2012-09-22T00:40:27.693 に答える
2

ブロックは、3次元の方法でスレッドを配置できます。

例を見てみましょう。32個のスレッドをディスパッチするとします。これらの32本の糸は3次元的に配置することができます。X、Y、Z軸の軸システムを想像してみてください。X軸のみに沿って32個のスレッドすべてを配置できます。つまり(32,1,1)。または、X軸とY軸を一緒に配置することもできます(2Dマトリックスのように)(8,4,1)、つまり8列、4行。または、3次元の方法、つまり(8,2,2)、つまり8列、2行、幅2(高さ8、幅2、長さ2の立方体を想像してください)に配置することもできます。あなたの心。

于 2012-10-18T09:34:01.610 に答える