在 CUDA 计算能力 3.5+ 中,所有线程(在 SM 上)真的每个线程都有 255 个寄存器吗?
In CUDA compute capability 3.5+, can all threads (on an SM) really have 255 registers each?
我正在查看不同 CUDA 计算能力的以下最大值:
- 每个线程注册
- 每个 SM 的注册数(对称多处理器)
- 每个 SM 的线程数
出现 here。好吧,看起来至少对于 CUDA 3.5 和更高版本, 1 x 3 > 2 。这意味着虽然单个线程最多可以使用 255 个寄存器,但如果太多线程尝试这样做,就会出现寄存器溢出。我的解释正确吗?或者说图 1。不是很正确,每个线程实际上有 64 个寄存器?
我们可以使用 NVIDIA 提供的文档来回答这些问题,而不是维基百科。
table 12 of the programming guide表示(对于cc3.5):
- 每个线程的最大 寄存器是 255
- 每个块的最大线程数为 1024
- 每个多处理器的最大寄存器为 64K(即 65536)
每个线程的寄存器数在编译时决定,是一个特定的数字,在运行时不会改变。同样,在此上下文中使用的 "spilling" 是在编译时做出的决定。
因此,我无法在启动 1024 个线程的线程块时同时为每个线程使用 255 个寄存器 (1024 * 255 = 255K > 64K)
但是如果我启动一个包含 64 个线程的线程块,我当然可以使用每个线程最多 255 个寄存器,合法地,正确启动线程块。
因此,与其他一些CUDA约束(例如线程块的个体维度和线程块中线程的总数量)一样,每个线程的寄存器的个体约束是一个限制,但每个寄存器的最大数量多处理器是另一个(聚合)限制,必须满足 both,at launch,内核才能启动。如果当前存在其他线程块,这可能会影响占用率。如果当前没有线程块驻留,并且无法满足限制,则这是在启动时可检测到的情况,并将报告为内核启动错误(启动请求的资源太多)。
我正在查看不同 CUDA 计算能力的以下最大值:
- 每个线程注册
- 每个 SM 的注册数(对称多处理器)
- 每个 SM 的线程数
出现 here。好吧,看起来至少对于 CUDA 3.5 和更高版本, 1 x 3 > 2 。这意味着虽然单个线程最多可以使用 255 个寄存器,但如果太多线程尝试这样做,就会出现寄存器溢出。我的解释正确吗?或者说图 1。不是很正确,每个线程实际上有 64 个寄存器?
我们可以使用 NVIDIA 提供的文档来回答这些问题,而不是维基百科。
table 12 of the programming guide表示(对于cc3.5):
- 每个线程的最大 寄存器是 255
- 每个块的最大线程数为 1024
- 每个多处理器的最大寄存器为 64K(即 65536)
每个线程的寄存器数在编译时决定,是一个特定的数字,在运行时不会改变。同样,在此上下文中使用的 "spilling" 是在编译时做出的决定。
因此,我无法在启动 1024 个线程的线程块时同时为每个线程使用 255 个寄存器 (1024 * 255 = 255K > 64K)
但是如果我启动一个包含 64 个线程的线程块,我当然可以使用每个线程最多 255 个寄存器,合法地,正确启动线程块。
因此,与其他一些CUDA约束(例如线程块的个体维度和线程块中线程的总数量)一样,每个线程的寄存器的个体约束是一个限制,但每个寄存器的最大数量多处理器是另一个(聚合)限制,必须满足 both,at launch,内核才能启动。如果当前存在其他线程块,这可能会影响占用率。如果当前没有线程块驻留,并且无法满足限制,则这是在启动时可检测到的情况,并将报告为内核启动错误(启动请求的资源太多)。