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