虽然CUDA寄存器和共享内存在减少对全局内存的访问次数方面非常有效,但必须注意保持在这些内存的容量范围内。这些内存是线程执行所需的资源形式。每个CUDA设备提供有限的资源,从而限制了给定应用程序可以同时驻留在SM中的线程数量。通常,每个线程需要的资源越多,每个SM中可以驻留的线程就越少,同样,在整个设备中并行运行的线程也就越少。
为了说明内核的寄存器使用与设备可以支持的并行性水平之间的交互,假设在当前一代设备D中,每个SM可以容纳多达1536个线程和16,384个寄存器。虽然16,384是一个大数字,但考虑到每个SM中可以驻留的线程数量,每个线程只允许使用非常有限的寄存器。为了支持1536个线程,每个线程只能使用16,384/1536 = 10个寄存器。如果每个线程使用11个寄存器,则可以在每个SM中同时执行的线程数量将减少。这种减少发生在块粒度上;例如,如果每个块包含512个线程,则通过一次减少512个线程来实现线程的减少。因此,从1536开始,下一个较小的线程数量将是1024,这表明可以同时驻留在每个SM中的线程减少1/3。该程序可以大幅减少可用于调度的warp数量,从而降低处理器在存在长延迟操作的情况下找到有用工作的能力。
每个SM可用的寄存器数量因设备而异。应用程序可以动态确定所用设备的每个SM中可用的寄存器数量,并选择使用适合该设备的寄存器数量的内核版本。寄存器的数量可以通过调用cudaGetDeviceProperties函数来确定,该函数在第3.6节中进行了讨论。假设变量&dev_prop传递给设备属性的函数,字段dev_prop.regsPerBlock生成每个SM中可用的寄存器数量。对于设备D,此字段的返回值应为16,384。然后,应用程序可以将这个数字除以驻留在每