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

时间:2015-03-21 18:18:30

标签: cuda gpu gpgpu

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

  1. 每个线程的注册
  2. 每SM寄存器(对称多处理器)
  3. 每个SM的主题
  4. 出现here。好吧,它看起来像CUDA 3.5及以上至少1 x 3> 1。 2。这意味着虽然单个线程最多可以使用255个寄存器,但如果有太多线程尝试这样做,则会发生寄存器溢出。我的解释是否正确?或者说图1.不是真的正确,每个线程真的有64个寄存器吗?

1 个答案:

答案 0 :(得分:5)

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

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

  1. 每个线程的最大寄存器为255
  2. 每个块的最大线程数为1024
  3. 每个多处理器的最大寄存器为64K(即65536)
  4. 每个线程的寄存器在编译时决定,是一个特定的数字,并且在运行时不会发生变化。同样,在此上下文中使用的“溢出”是在编译时做出的决定。

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

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

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