我想问一下。我们说使用--ptxas-options = -v不会给出我们程序使用的寄存器的确切数量。
1)然后,我如何为每个线程提供每个线程寄存器和共享内存的占用计算器?
2)在我的程序中,我也使用了生成ptx代码的推力调用。我有2个内核,但我也可以看到生成ptx的推力函数。所以,当我计算时,我也会考虑这些数字我使用的寄存器总数? (我想是的!) (同样适用于共享内存)
答案 0 :(得分:1)
1)然后,我将如何为每个线程的每个线程和共享内存寄存器提供占用计算器?
唯一需要的是将ptxas的输出(如果需要)四舍五入到均匀的寄存器分配粒度,这取决于设备(参见Greg的回答here)我认为这是常见的寄存器分配粒度为4和8,但我没有计算能力的寄存器分配粒度表。
我认为共享内存也有分配粒度。由于每个SM的最大线程块数量无论如何都受到限制,因此,如果您的分配/使用在超出限制的粒度数量范围内,那么这应该仅限于(占用),否则您将被限制为多个块。
我认为在大多数情况下,通过使用ptxas中的数字而不进行舍入,您将获得非常好的感觉。如果您觉得在占用计算器中需要这种精确度,请询问一个很好的定向问题,例如"各种GPU的寄存器和共享内存的分配粒度是多少?可能会让像格雷格这样的人给你一个清晰的答案。
2)在我的程序中,我也使用了生成ptx代码的推力调用。我有2个内核,但我也可以看到生成ptx的推力函数。所以,当我计算时,我也会考虑这些数字我使用的寄存器总数? (我想是的!)(同样适用于共享内存)
从根本上说,我认为这种想法是错误的。我唯一可以看到它可能重要的地方是你运行的是并发内核,我怀疑是因为你提到了推力。对于占用而言,唯一重要的数字是单个内核启动的指标。您不要在不同内核之间添加线程,寄存器或共享内存来计算资源使用情况。当内核完成执行时,它会释放其资源使用情况,至少对于这些资源类型(寄存器,共享内存,线程)。