通常建议降低每个线程的寄存器压力以增加warp 占用率,从而通过warp 级多线程(TLP)提供更多隐藏延迟的机会。为了减少寄存器压力,可以使用更多的每个线程本地内存或每个线程块共享内存。CUDA nvcc 编译器也可以强制每个线程使用更少的寄存器。这种方法对于具有良好算术延迟的工作负载很有用,即 ALU 操作与内存读写访问请求的比率很高。然而,对于计算量很少且内存访问更频繁的延迟关键型应用程序,这种方法实际上往往会降低性能。
在此类延迟关键应用程序的情况下,将尽可能多的数据带入片上寄存器或共享内存中更有意义,然后在用全局内存中的下一个数据块替换之前尽可能多地使用它。当然,通过增加寄存器压力,warp 占用率会降低,但现在我们正在使用快速片上寄存器隐藏片外内存延迟。增加每个线程寄存器使用的方法是通过展开循环或计算每个线程的更多输出数据来增加 ILP(这也基本上通过对更多输入执行相同的工作来增加 ILP)。这种方法基本上是由 Volkov (Better Performance at Lower Occupancy) 提出的。
现在 nvcc 编译器驱动程序有一个名为 maxrregcount 的命令行选项,它允许更改每个线程的寄存器使用情况。使用此选项一次可以强制编译器减少每个线程寄存器的使用,但不能强制它增加它。我有一个案例,我想增加每个线程寄存器的使用,但我不能在内核中展开循环,因为循环边界是数据相关的和动态的。到目前为止,我已经尝试了一些技巧,但是我已经没有关于如何增加每个线程寄存器使用率的想法。谁能建议增加单个 CUDA 线程的寄存器使用率的方法?