首页 文章

为什么CUDA会舍入线程使用的寄存器数量?

提问于
浏览
1

我正在分析一个内核,它在GTX480中每个线程使用25个寄存器,每个块使用3568个字节的共享内存 . 内核配置为启动16x16线程,并且线程缓存首选项设置为shared .

根据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

1 回答

  • 4

    你还没有正确解释发生了什么 . 这里每个线程的寄存器数量没有舍入,每个warp的寄存器数量都会变为四舍五入 .

    你的GPU在每个warp的基础上分配寄存器,寄存器“页面大小”为64个寄存器(注意我松散地使用该术语,我不熟悉精确的寄存器文件设计) . 在您的情况下,warp需要25 * 32 = 800个寄存器,必须向上舍入到最接近的“页面大小”64,每个warp给出832个寄存器 . 每个块包含8个warp(256个线程),因此每个块需要6656个寄存器 . 然后,该内核的每个SM的最大块数为32768/6656,向下舍入到最接近的整数,即 . 每个SM 4块而不是你期望的5块 .

    因此,非常简短的答案是寄存器文件分配粒度,页面大小决定了在这种情况下每个SM可以运行多少个块 .

相关问题