我很好奇为什么如果我在寄存器使用上设置一个上限(在我的例子中为51),它可以产生比我让限制无限制更高的寄存器内核。
此外,较高的寄存器似乎更快(10us超过700)。
优化阶段的哪些阶段会发生变化?
答案 0 :(得分:2)
我无法深入了解实际的CUDA编译器及其阶段,而是基于CUDA执行架构的一些常识推理。
当没有设置最大寄存器编号时,编译器不知道您的目标寄存器编号是什么,并且必须假设您需要使用尽可能少的寄存器或使用其他启发式编程。通常,最小化每线程的寄存器使用意味着有足够的寄存器用于单个内核上的更多线程,从而最大化利用率,因为更多的线程块可以驻留在单个内核上,这很好。
但是当你给出一个最大的寄存器使用时,编译器就会知道这是你的最大值,并假设它达到了最大值,它可以使用尽可能多的寄存器。这样做的原因是寄存器占用太高而另一个线程块没有足够的寄存器的点实际上是硬限制。当一个线程使用65个寄存器时,如果没有足够的寄存器用于另一个块,那么只要它使用63或64个寄存器就没关系,只要它不使用65.因此编译器会尝试使用as尽可能多的寄存器(当然是最大值),这是可取的,因为寄存器是您可以获得的最快的存储器类型。但是这种推理只能在编译器知道这个硬限制时应用(即你告诉他),否则它必须使用一些启发式算法,这可能并不总是最优的。
为什么具有48个寄存器的版本比具有47个寄存器的版本更快的原因可能是因为它使用了更多的寄存器。如果没有足够的寄存器,则必须将数据交换到本地存储器或重复复制到其他寄存器的临时寄存器中。
最后这一切都很有意义,因为你给编译器提供的信息越多(通过设置你的最佳寄存器最大值),它就能越好地优化,结果代码就越高效。 >应该。特别是对于GPU计算,通常需要尽可能地将内核调整到实际硬件及其资源。