如何在CUDA编译中分配寄存器

时间:2013-02-05 07:19:02

标签: cuda gpu nvcc

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

1 个答案:

答案 0 :(得分:2)

每个线程有最大数量的寄存器,在具有Compute Capability 2.1的设备中,同时具有63个寄存器。每个Streaming Multiprocessor包含有限数量的寄存器,这些寄存器分布在threadblock中执行的线程中。如果每个块的线程数少,几乎可以肯定线程将获得最大数量的寄存器,但是如果有很多线程,它们将获得较少数量的寄存器(这一切都取决于所使用的内存总量)通过线程和需求来寻找每个应用程序。)

现在所有不能存储在寄存器中的变量因为缺少这些变量会进入本地存储器,而本地存储器是全局器件存储器的一部分,与寄存器相比提供高存储器延迟。这称为寄存器溢出,您可以在此处阅读更多相关信息http://www.ece.umn.edu/~wxiao/ee5940/lecture8-2.pdf

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