用户
 找回密码
 立即注册
jaredlu_CUDA 该用户已被删除
发表于 2013-9-9 15:51:54
86116
关于CUDA寄存器的一个问题:

下图是通过CUDA Sample里面的deviceQuery程序查询得到信息,中间部分有一行【红色框标记】为
Total number of registers available per block:65536




下表是CUDA_Occupancy_Calculator中的一个表格,红色标记的部分表明,每个SM中的register数为65536。
这与上图的中结果不是有些矛盾么?应该以那个为准呢?
Physical Limits for GPU Compute Capability:
3.0
Threads per Warp
32
Warps per Multiprocessor
64
Threads per Multiprocessor
2048
Thread Blocks per Multiprocessor
16
Total # of 32-bit registers per Multiprocessor
65536
Register allocation unit size
256
Register allocation granularity
warp
Registers per Thread
63
Shared Memory per Multiprocessor (bytes)
49152
Shared Memory Allocation unit size
256
Warp allocation granularity
4
Maximum Thread Block Size
1024


另外,如何计算每个thread可用的最大register个数?是用每个SM的register个数除以每个SM中开启的thread总数吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用道具 举报 回复
发表于 2013-9-9 15:54:55
楼主您好,

(1)
这2个数据无矛盾,
64K个4B寄存器(256KB)是您的一个SMX上的最大寄存器数量,也是您的一个block所能使用的最大寄存器数量(一个block无法跨在2个SMX上的)。

(2)贵卡是计算能力3.0, 每个线程最多可以使用63个寄存器。这个是理论上的上限。
那怕只有1个线程,也只能使用63个,而不是65536个。

感谢您的莅临。
使用道具 举报 回复 支持 反对
发表于 2013-9-9 16:06:59
横扫千军 发表于 2013-9-9 15:54
楼主您好,

(1)

谢谢版主!这样解释,恍然大悟!
还有,有些情况下,随着每个block中的thread数的增加,可以使用的最大寄存器个数可能没有63个,那么,应该怎么计算这个最大值呢?
使用道具 举报 回复 支持 反对
发表于 2013-9-9 16:10:35
jaredlu_CUDA 发表于 2013-9-9 16:06
谢谢版主!这样解释,恍然大悟!
还有,有些情况下,随着每个block中的thread数的增加,可以使用的最大寄 ...

如果因为随着线程数目的增多而无法导致使用63个,
那么将会最多使用寄存器总数/SMX上的驻留线程数个寄存器。

以及甚至可能比这个值更低,因为,例如寄存器分配粒度之类的因素也会影响。
建议您使用occupancy calculator.xls进行估算(请在你的C盘搜索此文件)。
以及,您也可以以实际的编译效果为准(您可以通过profiler看到这个值)。

使用道具 举报 回复 支持 反对
发表于 2013-9-9 16:16:04
横扫千军 发表于 2013-9-9 16:10
如果因为随着线程数目的增多而无法导致使用63个,
那么将会最多使用寄存器总数/SMX上的驻留线程数个寄 ...

嗯,明白了,版主非常感谢!
使用道具 举报 回复 支持 反对
发表于 2013-9-9 16:17:01
jaredlu_CUDA 发表于 2013-9-9 16:16
嗯,明白了,版主非常感谢!

您客气了,服务您是我们的荣幸。
以及,期待您的下次莅临。
使用道具 举报 回复 支持 反对
发表于 2013-9-9 16:23:15
横扫千军 发表于 2013-9-9 16:17
您客气了,服务您是我们的荣幸。
以及,期待您的下次莅临。

使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册