在 CUDA 计算能力 3.5+ 中,所有线程(在 SM 上)真的每个线程都有 255 个寄存器吗?

In CUDA compute capability 3.5+, can all threads (on an SM) really have 255 registers each?

我正在查看不同 CUDA 计算能力的以下最大值:

  1. 每个线程注册
  2. 每个 SM 的注册数(对称多处理器)
  3. 每个 SM 的线程数

出现 here。好吧,看起来至少对于 CUDA 3.5 和更高版本, 1 x 3 > 2 。这意味着虽然单个线程最多可以使用 255 个寄存器,但如果太多线程尝试这样做,就会出现寄存器溢出。我的解释正确吗?或者说图 1。不是很正确,每个线程实际上有 64 个寄存器?

我们可以使用 NVIDIA 提供的文档来回答这些问题,而不是维基百科。

table 12 of the programming guide表示(对于cc3.5):

  1. 每个线程的最大 寄存器是 255
  2. 每个块的最大线程数为 1024
  3. 每个多处理器的最大寄存器为 64K(即 65536)

每个线程的寄存器数在编译时决定,是一个特定的数字,在运行时不会改变。同样,在此上下文中使用的 "spilling" 是在编译时做出的决定。

因此,我无法在启动 1024 个线程的线程块时同时为每个线程使用 255 个寄存器 (1024 * 255 = 255K > 64K)

但是如果我启动一个包含 64 个线程的线程块,我当然可以使用每个线程最多 255 个寄存器,合法地,正确启动线程块。

因此,与其他一些CUDA约束(例如线程块的个体维度和线程块中线程的总数量)一样,每个线程的寄存器的个体约束是一个限制,但每个寄存器的最大数量多处理器是另一个(聚合)限制,必须满足 bothat launch,内核才能启动。如果当前存在其他线程块,这可能会影响占用率。如果当前没有线程块驻留,并且无法满足限制,则这是在启动时可检测到的情况,并将报告为内核启动错误(启动请求的资源太多)。