0

cudaのスケジューリングシステムに関していくつか質問があります。

A.たとえばfoo<<<255、255 >>()関数を使用すると、カード内で実際に何が起こりますか?各SMが上位レベルからスケジュールするブロックを受け取り、各SMが着信ブロックをスケジュールする責任があることを知っていますが、それはどの部分で行われますか?たとえば、8つのSMがある場合、それぞれに8つの小さなCPUが含まれている場合、上位レベルは残りの255 * 255-(8 * 8)スレッドをスケジュールする責任がありますか?

B.定義できる最大スレッドの制限は何ですか?私はfoo<<<X, Y>>>();x、y =?

C.最後の例に関して、1つのブロック内にいくつのスレッドを含めることができますか?ブロック/スレッドが多いほど、実行が速くなると言えますか?

ご協力いただきありがとうございます

4

2 に答える 2

3

A.コンピューティング作業ディストリビューターは、グリッドからSMにブロックを配布します。SMは、ブロックをワープに変換します(すべてのNVIDIAGPUでWARP_SIZE=32)。Fermi 2.0 GPUには、各SMにデータパスのセットを共有する2つのワープスケジューラがあります。サイクルごとに、各ワープスケジューラーはワープを選択し、データパスの1つに命令を発行します(CUDAコアについては考えないでください)。Fermi 2.1 GPUでは、各ワープスケジューラに独立したデータパスと一連の共有データパスがあります。2.1のすべてのサイクルで、各ワープスケジューラーはワープを選択し、各ワープに対して命令を二重に発行しようとします。

ワープスケジューラは、データパスの使用を最適化しようとします。これは、単一のワープが連続したサイクルで複数の命令を実行する可能性があること、またはワープスケジューラがサイクルごとに異なるワープから発行することを選択できることを意味します。

各SMが処理できるワープ/スレッドの数は、CUDAプログラミングガイドv.4.2表F-1で指定されています。これは、768スレッドから2048スレッド(24〜64ワープ)まで拡張できます。

B.起動あたりの最大スレッド数は、最大GridDims*ブロックあたりの最大スレッド数によって定義されます。表F-1を参照するか、cudaGetDevicePropertiesのドキュメントを参照してください。

C.(B)と同じリソースを参照してください。スレッド/ブロックの最適な分散は、アルゴリズムの分割によって定義され、占有率の計算に影響されます。SMのワープの問題セットのサイズと、命令バリアでブロックされた時間(とりわけ)に基づいて、パフォーマンスへの影響が観察されます。手始めに、SMごとに少なくとも2ブロック、最大50%の占有率をお勧めします。

于 2012-05-01T02:09:51.333 に答える
0

B.デバイスによって異なります。cuda関数cudaGetDevicePropertiesを使用して、デバイスの仕様を確認できます。一般的な最大数は、ブロックあたりy = 1024スレッド、グリッド次元あたりx=65535ブロックです。

CAの一般的な方法は、2(128、256、512など)のスレッド/ブロックの累乗を使用することです。大きな配列を減らすことは、その方法で非常に効果的です(削減を参照)。ブロックとスレッドの最適な分散は、実際にはアプリケーションとハードウェアによって異なります。私のアプリケーションにとって最も効率的であるため、TeslaM2050での大規模なスパース線形代数の計算には個人的に512スレッド/ブロックを使用しています。

于 2012-04-30T20:33:01.203 に答える