【问题标题】:total number of registers寄存器总数
【发布时间】:2014-05-03 00:58:31
【问题描述】:

我想问一下。我们说使用 --ptxas-options=-v 并没有给出我们程序使用的寄存器的确切数量。

1) 那么,我将如何为 occupancu 计算器提供每个线程的寄存器和每个块的共享内存?

2) 在我的程序中,我还使用了生成 ptx 代码的推力调用。我有 2 个内核,但我也可以看到推力函数来生成 ptx。所以,我在计算时也会考虑这些数字我使用的寄存器总数? (我想是的!) (同样适用于共享内存)

【问题讨论】:

  • 你将不得不解释第一段。谁是“我们”,他们在哪里说 ptxas 详细输出不准确?
  • @talonmies:我的意思是,我看到一些帖子说ptx的输出不是内核使用的寄存器数量。例如stackoverflow.com/questions/11483321/…
  • 您可能已经看过它,但您显然没有阅读它。您链接到的那个问题是询问为什么 ptxas 输出与某人猜测根据查看 PTX 内核需要多少寄存器不一致。与您的问题完全无关.....
  • @talonmies:From stackoverflow.com/questions/16975727/… " 所以在 PTX 代码中看到的寄存器数量没有意义,因为这些是虚拟寄存器:.以及其他一些类似的帖子
  • 右:PTX 代码。这与 ptxas 发出的不同,ptxas 是一个 PTX 汇编器,即。它将 PTX 代码编译成最终的可执行文件。就像我说的:阅读。

标签: cuda thrust


【解决方案1】:

1) 那么,我将如何为占用计算器提供每个线程的寄存器和每个块的共享内存?

唯一需要的其他事情应该是将 ptxas 的输出四舍五入(如有必要)到寄存器分配的均匀粒度,这因设备而异(请参阅 Greg 的回答 here)我认为常见的寄存器分配粒度是 4 和8,但我没有按计算能力划分的寄存器分配粒度表。

我认为共享内存也有分配粒度。由于每个 SM 的最大线程块数无论如何都是有限的,因此只有在您的分配/使用量在超出限制的粒度范围内(无论您被限制在多少块)时,这才有意义(对于占用率)。

我认为在大多数情况下,通过使用 ptxas 中的数字而不进行四舍五入,您会获得很好的感觉。如果您觉得占用率计算器需要这种级别的准确度,那么问一个很好的直接问题,例如“各种 GPU 的寄存器和共享内存的分配粒度是多少”,可能会让像 Greg 这样的人给您一个清晰的答案。

2) 在我的程序中,我还使用了生成 ptx 代码的推力调用。我有 2 个内核,但我也可以看到推力函数来生成 ptx。所以,我在计算时也会考虑这些数字我使用的寄存器总数? (我认为是的!)(同样适用于共享内存)

从根本上说,我认为这种想法是不正确的。我唯一能看到它可能重要的地方是你是否正在运行并发内核,我怀疑情况是否如此,因为你提到了推力。唯一对占用率重要的数据是单个内核启动的指标。您无需添加线程、寄存器或跨不同内核的共享内存来计算资源使用情况。当内核完成执行时,它会释放其资源使用量,至少对于这些资源类型(寄存器、共享内存、线程)而言。

【讨论】:

  • :当你说四舍五入到一个均匀的粒度时,你在实践中是什么意思?你能提供一个假设粒度为 4 的例子吗?而且,在第二个问题中,好的,我明白你所说的,每个内核都有其资源使用情况,但是我如何衡量我的程序的性能,因为它使用不同的内核并且还插入内核本身的调用?谢谢!
  • 四舍五入:如果粒度为 4,并且我从 ptxas 获得的寄存器使用量为 9,我将四舍五入为 12(下一个 4 的偶数倍数)。如果我的寄存器使用量为 8,则无需四舍五入。 8 已经是 4 的偶数倍。“我如何衡量我的程序的性能”是一个复杂的问题,在我看来,它本身并不适合 SO。它太宽泛了。如果您对 CUDA 或 CUDA/推力程序的性能分析有特定的重点问题,请发布一个新的 SO 问题。这个 SO 问题确实与 测量 性能无关。
  • :好的,现在粒度很清楚了。所以,当我研究占用率、资源使用情况等时,我会为每个内核做这件事。好的,谢谢
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2017-05-09
  • 2016-06-15
  • 2021-03-25
相关资源
最近更新 更多