【发布时间】:2012-08-25 19:27:06
【问题描述】:
通常建议降低每个线程的寄存器压力以增加 warp 占用率,从而提供更大的机会通过 warp 级多线程 (TLP) 隐藏延迟。为了减少寄存器压力,可以使用更多的每个线程本地内存或每个线程块共享内存。 CUDA nvcc 编译器也可以强制每个线程使用更少的寄存器。这种方法对于具有良好算术延迟的工作负载很有用,即 ALU 操作与内存 r/w 访问请求的比率很高。然而,对于计算量很少且内存访问更频繁的延迟关键型应用程序,这种方法实际上往往会降低性能。
在此类延迟关键应用程序的情况下,将尽可能多的数据带入片上寄存器或共享内存中更有意义,然后在将其替换为来自全局的下一个数据块之前尽可能多地使用它记忆。当然,通过增加寄存器压力,warp 占用率会降低,但现在我们正在使用快速片上寄存器隐藏片外内存延迟。增加每个线程寄存器使用的方法是通过展开循环或计算每个线程的更多输出数据来增加 ILP(这也基本上通过对更多输入执行相同的工作来增加 ILP)。这种方法基本上是由 Volkov 提出的(Better Performance at Lower Occupancy)。
现在 nvcc 编译器驱动程序有一个名为 maxrregcount 的命令行选项,它允许更改每个线程的寄存器使用情况。使用此选项一次可以强制编译器减少每个线程寄存器的使用,但不能强制它增加它。我有一个案例,我想增加每个线程寄存器的使用,但我不能在内核中展开循环,因为循环边界是数据相关的和动态的。到目前为止,我已经尝试了一些技巧,但我已经没有关于如何增加每个线程寄存器使用的想法。谁能建议增加单个 CUDA 线程的寄存器使用率的方法?
【问题讨论】:
-
对不起,这个问题对我来说似乎完全荒谬。
-
@Roger Dahl:如果你刚刚阅读了我提到的论文,你就会明白我在这里试图表达的观点
标签: memory cuda latency cpu-registers