通常建议降低每线程寄存器压力以增加变形占用率,从而通过变形级别多线程(TLP)为隐藏延迟提供更大的机会。为了降低寄存器压力,每个线程会使用更多的本地内存或每个线程块共享内存。 CUDA nvcc编译器也可以被迫使用每个线程更少的寄存器。这种方法对于具有较好算术延迟的工作负载很有用,即ALU操作与内存访问请求的比率很高。然而,对于计算量非常少且内存访问频率更高的延迟关键应用程序而言,此方法实际上会降低性能。在CUDA中增加每线程寄存器使用量
在这种等待时间的关键应用中,在片上寄存器或共享内存中引入尽可能多的数据,然后尽可能多地使用它,然后再用下一块数据全球记忆。当然,通过增加寄存器压力,跳变占用率下降,但现在我们使用快速片上寄存器隐藏片外存储器延迟。提高每线程寄存器使用率的方法是通过展开循环或计算每个线程的更多输出数据来增加ILP(这也通过在更多输入上完成相同的工作来增加ILP)。沃尔科夫基本上提出了这种方法(在较低占用率下更好的性能)。
现在,nvcc编译器驱动程序有一个名为maxrregcount的命令行选项,它允许更改每个线程的寄存器使用情况。使用这个选项一次可以强制编译器减少每线程寄存器的使用,但不能强制增加它。我有一种情况,我想增加每个线程的寄存器使用率,但是我不能在我的内核中展开循环,因为循环边界是依赖于数据的和动态的。到目前为止,我已经尝试了一些技巧,但是我已经想出了如何增加每个线程注册使用率的想法。任何人都可以提出增加单个CUDA线程的注册使用的方法吗?
对不起,但这个问题对我来说似乎完全荒谬。 –
@罗格达尔:如果你刚才看过我提到过的论文,那么你就会明白我在这里想要说明的观点 – nurabha