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

ein*_*ica -1 cuda gpu gpgpu

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

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

如出现在这里.嗯,它看起来像CUDA 3.5及以上,至少1 x 3> 2.这意味着虽然单个线程最多可以使用255个寄存器,但如果有太多线程尝试这样做,则会发生寄存器溢出.我的解释是否正确?或者说图1.不是真的正确,每个线程真的有64个寄存器吗?

Rob*_*lla 5

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

编程指南表12表明(对于cc3.5):

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

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

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

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

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