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