This question already has an answer here:
What kind of variables consume registers in CUDA?

(1 个回答)


5年前关闭。




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

最佳答案

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

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

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

关于cuda - CUDA编译中寄存器是如何分配的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14702089/

10-13 07:03