2

GTX480 で、スレッドごとに 25 個のレジスタとブロックごとに 3568 バイトの共有メモリを使用するカーネルをプロファイリングしています。カーネルは 16x16 スレッドを起動するように構成され、スレッド キャッシュ設定は共有に設定されています。

GTX480 の仕様によると、このデバイスには SM ごとに 32768 個のレジスタがあるため、複数の25 regs x 256 threads per block x 6 blocks per SMブロックが同時に実行される可能性があります。

ただし、Compute Visual Profiler と Cuda Occupancy Calculator は、SM ごとに 4 つのブロックのみがアクティブになると報告しています。予想通り、アクティブなブロックが 5 つではなく、なぜ 4 つだけなのか疑問に思っていました。

私が見つけた理由は、CUDA が使用されるレジスタの数を 26 に切り上げるためです。この場合、アクティブなブロックの数は 4 です。

CUDA がレジスタ数を切り上げるのはなぜですか? スレッドごとに 25 のレジスターとブロックごとに 256 のスレッドがあるため、SM ごとに最大 5 つのブロックを持つことが可能であり、これは明らかに利点です。

環境設定:

Device 0: "GeForce GTX 480"
CUDA Driver Version / Runtime Version          5.0 / 4.0
ptxas info: Compiling entry function '_Z13kernellS_PiS0_iiS0_' for 'sm_20'
ptxas info: Used 25 registers, 3568+0 bytes smem, 80 bytes cmem[0], 16 bytes cmem[2]
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
kernel config: 16x16 threads per block
kernel config: cudaFuncCachePreferShared
4

1 に答える 1

6

何が起こっているのかを正しく解釈していません。ここでは、スレッドごとのレジスタ数の丸めは行われず、warp ごとのレジスタ数の丸めが行われます。

GPU はワープごとにレジスタを割り当て、レジスタの「ページ サイズ」は 64 レジスタです (この用語を大まかに使用していることに注意してください。正確なレジスタ ファイルの設計には関与していません)。あなたの場合、ワープには 25*32 = 800 のレジスタが必要です。これは最も近い「ページ サイズ」の 64 に切り上げて、ワープごとに 832 のレジスタを与える必要があります。各ブロックには 8 つのワープ (256 スレッド) が含まれているため、各ブロックには 6656 のレジスタが必要です。このカーネルの SM あたりの最大ブロック数は、最も近い整数に切り捨てられた 32768 / 6656 です。予想される 5 ではなく、SM ごとに 4 ブロック。

したがって、非常に短い答えは、レジスタ ファイルの割り当ての粒度であり、ページ サイズは、この場合、SM ごとに実行できるブロックの数を決定します。

于 2012-10-24T11:46:54.560 に答える