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