CUDA编译中如何分配寄存器[重复]

Posted

技术标签:

【中文标题】CUDA编译中如何分配寄存器[重复]【英文标题】:How are registers assigned in CUDA compilation [duplicate] 【发布时间】:2013-02-05 07:19:02 【问题描述】:

据说每个内核的寄存器数量对于CUDA优化很重要,这个数量的上界可以通过nvcc中的“-maxrregcount=N”来设置。我无法理解这一点,因为我认为寄存器的数量可以简单地通过计算内核中的局部变量(可能还有传递的参数)来确定。我知道我错了,因为来自“nvcc --ptxas-options=-v”的报告远远超出了我的想法。有人可以考虑一下吗?

【问题讨论】:

【参考方案1】:

每个线程的最大寄存器数,在具有 Compute Capability 2.1 的设备中的当代 GPU 中是 63 个寄存器。每个流式多处理器包含有限数量的寄存器,这些寄存器分布在线程块中执行的线程之间。如果每个块的线程数很少您几乎可以肯定线程将获得最大数量的寄存器,但如果有很多线程,它们将获得较少数量的寄存器(这完全取决于使用的内存总量由线程和需要为每个应用程序定制)。

现在,由于缺少它们而无法存储在寄存器中的所有变量都进入本地内存,该内存是全局设备内存的一部分,并且与寄存器相比提供了较高的内存延迟。这称为寄存器溢出,您可以在此处阅读更多信息http://www.ece.umn.edu/~wxiao/ee5940/lecture8-2.pdf

尝试将所有变量保存在寄存器中非常重要。新的 Cuda 开发人员经常低估寄存器溢出的影响。我进行了一些测试,其中我人为地将线程使用的内存量增加了一倍,并导致寄存器溢出而没有任何其他计算成本,并且计算时间增加了 5 倍! 在小型 CUDA 应用程序中,寄存器的数量就足够了。您可以按照上面 pdf 中的说明了解有多少变量进入本地内存。

【讨论】:

以上是关于CUDA编译中如何分配寄存器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将数据从寄存器复制到全局存储器

CUDA 全局内存,它在哪里?

如何确定哪些 CUDA 行使用的寄存器最多?

是否所有线程在 CUDA 中使用相同数量的寄存器?

为啥CUDA会四舍五入线程使用的寄存器数量?

[Java]程序运行时的内存分配