我正在分析一个内核,它在 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 个块处于活动状态。我想知道为什么只有 4 个块是活动的,而不是 5 个,正如我预期的那样。
我发现的原因是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