据说每个内核的寄存器数量对于CUDA优化很重要,这个数量的上界可以通过nvcc中的“-maxrregcount=N”来设置。我无法理解这一点,因为我认为寄存器的数量可以简单地通过计算内核中的局部变量(可能还有传递的参数)来确定。我知道我错了,因为来自“nvcc --ptxas-options=-v”的报告远远超出了我的想法。有人可以考虑一下吗?
问问题
866 次
1 回答
2
每个线程的最大寄存器数,在具有 Compute Capability 2.1 的设备中的当代 GPU 中是 63 个寄存器。每个流式多处理器包含有限数量的寄存器,这些寄存器分布在线程块中执行的线程之间。如果每个块的线程数很少您几乎可以肯定线程将获得最大数量的寄存器,但如果有很多线程,它们将获得较少数量的寄存器(这完全取决于使用的内存总量由线程和需要为每个应用程序定制)。
现在,由于缺少它们而无法存储在寄存器中的所有变量都进入本地内存,该内存是全局设备内存的一部分,并且与寄存器相比提供了高内存延迟。这称为寄存器溢出,您可以在此处阅读更多信息http://www.ece.umn.edu/~wxiao/ee5940/lecture8-2.pdf
尝试将所有变量保存在寄存器中非常重要。新的 Cuda 开发人员经常低估寄存器溢出的影响。我进行了一些测试,其中我人为地将线程使用的内存量增加了一倍,并导致寄存器溢出而没有任何其他计算成本,并且计算时间增加了 5 倍!在小型 CUDA 应用程序中,寄存器的数量就足够了。您可以按照上面 pdf 中的说明了解有多少变量进入本地内存。
于 2013-05-07T08:48:32.937 回答