register

关于CUDA寄存器的一个问题:

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

[attach]3373[/attach]

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

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

楼主您好,

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

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

感谢您的莅临。

谢谢版主!这样解释,恍然大悟!
还有,有些情况下,随着每个block中的thread数的增加,可以使用的最大寄存器个数可能没有63个,那么,应该怎么计算这个最大值呢?

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

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

嗯,明白了,版主:handshake非常感谢!

您客气了,服务您是我们的荣幸。
以及,期待您的下次莅临。

:lol:handshake