一个block 256个线程,一个线程17个register,怎么profile中计算结果是每个block 15360个register,差了一个量级,
是我理解有误,还是其他问题?
那个应该是所有6个block占用的总寄存器。15360/6/128=20。
LS正解,这个是你的SM总共使用了多少个寄存器而不是你一个thread总共多少个,一个thread超不过63个寄存器
结果明确显示每个线程用掉17个寄存器,我的设备检测显示的是每个block可用的寄存器是16384
二楼算出来的那个20代表声明意思,17和15360又是什么关系,3楼的63又是怎么算出来的。有木有这方面的资料可以提供一些?
63个寄存器是每个thread最大能分配到的寄存器数量,超过63会把内核定义的变量向local memory移动,这个是计算能力决定的,也就是设备决定的,不能修改。
你的内核每个thread实际使用了17个寄存器,但是CUDA在分配的时候好像有一个机制,分配寄存器的数量是某些特定数值,所以实际你的内核每个thread分配了20个寄存器,至于为什么,我也不太清楚这个分配机制,求NV人员解答
楼主您好!看到您的帖子了。
为了能方便您尽快解决自己的疑惑,
我想对您简单介绍一下目前市面上的卡,在寄存器资源方面上的硬件和软件限制:
(1)1.0和1.1计算能力的卡,硬件上每个SM有8K个寄存器。
(2)1.2和1.3计算能力的卡,硬件上每个SM有16K个寄存器。
(3)2.0和2.1计算能力的卡,硬件上每个SM有32K个寄存器。
(4)3.0和3.5计算能力的卡,硬件上每个SM(X)有64K个寄存器。
(a)1.0 - 1.3计算能力的卡,软件上每个线程可以最多使用128个寄存器。
(b)2.0 - 3.0计算能力的卡,软件上每个线程可以最多使用63个寄存器。
(c)3.5计算能力的卡,软件上每个线程最多可以使用255个寄存器。
当您阅读完以上段落后,您可能已经明白:
“16384这个数字(16K)是我的卡上1个SM里的总寄存器数”
“16384也是我的一个block能最多用的寄存器数目"
关于您的其他问题,欢迎tianyuan08继续回帖。
嗯,明白了。原来16384对应的是SM不是单个block。Thanks.