在CUDA中使用寄存器存储器

时间:2016-10-21 13:01:12

标签: cuda

我对cuda寄存器内存有一些疑问

1)有没有办法在cuda内核中释放寄存器?我在寄存器中有变量,1D和2D数组。 (最大数组大小为48)

2)如果我使用设备函数,那么在执行后我在设备函数中使用的寄存器会发生什么?它们是否可用于调用内核执行或其他设备功能?

3)nvcc如何优化寄存器使用?请分享内存密集型内核优化的重要内容

PS:我有一个复杂的算法移植到cuda,这需要大量的寄存器进行计算,我试图弄清楚是否将中间数据存储在寄存器中并编写一个内核或将其存储在全局内存中并中断算法在多个内核中。

1 个答案:

答案 0 :(得分:4)

只有本地变量才有资格驻留在寄存器中(另请参阅Declaring Variables in a CUDA kernel)。您无法直接控制哪些变量(标量或静态数组)将驻留在寄存器中。编译器将自己做出选择,努力争取注册备用的性能。

使用nvcc编译器的maxrregcount选项可以限制寄存器的使用。

您还可以将大多数小的1D,2D数组放在共享内存中,或者,如果访问常量数据,则将此内容放入常量内存(缓存非常接近注册为L1缓存内容)。

在CUDA中处理计算绑定内核时减少寄存器使用的另一种方法是分阶段处理数据,使用多个全局内核函数调用并将中间结果存储到全局内存中。每个内核将使用更少的寄存器,这样每个SM的更多活动线程将能够隐藏加载/存储数据移动。这种技术结合正确使用流和异步数据传输在大多数情况下非常成功。

关于设备功能的使用,我不确定,但我想调用函数的寄存器内容将被移动/存储到本地存储器(L1缓存等),就像使用寄存器溢出时一样太多局部变量(见CUDA Programming Guide -> Device Memory Accesses -> Local Memory)。此操作将释放一些被调用设备功能的寄存器。设备功能完成后,它们的局部变量不再存在,并且调用者函数现在可以再次使用寄存器并填充先前保存的内容。

请记住,出于性能原因,编译器可以内联在全局内核的相同源代码中定义的小型设备函数:当发生这种情况时,生成的内核通常需要更多的寄存器。

相关问题