Cuda按线程注册

Ati*_*rag 8 profiler cuda local-storage

正如我对2.x计算能力设备的正确理解,每个线程有63个寄存器限制.您知道计算能力1.3的设备每个线程的寄存器限制是多少?

我有一个很大的内核,我正在GTX260上测试.我很确定我使用了很多寄存器,因为内核非常复杂,我需要很多局部变量.根据Cuda探查器我的注册用法是63(静态Smem是68虽然我不太确定这意味着什么,动态Smem是0),虽然我很确定我有超过63个局部变量,所以我认为编译器重用寄存器或将它们溢出到本地存储器中.

现在我认为计算能力1.3的设备每个线程的寄存器限制比2.x设备更高.我的猜测是编译器选择了63限制,因为我使用的是256个线程的块,在这种情况下256*63是16128而256*64是16384,这是该设备SM的寄存器限制数.所以我的猜测是,如果我减少每个块的线程数量,我可以增加使用的寄存器数量.所以我使用196个线程的块运行内核.但同样,分析器显示63个寄存器,即使63*192是12096而64*192是12288,这是在SM的16384限制范围内.

所以任何想法为什么编译器仍然限制自己63个寄存器?可能是因为寄存器重用还是仍在溢出寄存器?

Rob*_*lla 16

每个线程的最大寄存器记录在此处

cc 2.x和3.0为63,cc 1.x为128,cc 3.5为255

编译器可能已经确定63个寄存器就足够了,并且不能用于其他寄存器.寄存器可以重用,因为你有很多局部变量,并不一定意味着每个线程的寄存器必须很高.

我的建议是使用nvcc -maxrregcount 选项指定各种限制,然后使用该-Xptxas -v 选项让编译器告诉你在创建PTX时它使用了多少个寄存器.

  • 您还可以使用[launch bounds](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#launch-bounds)对每个线程限制的寄存器进行更精确的控制 - 核心基础. (4认同)