CUDA - 限制使用的SM数量

5

我是否能在程序运行期间明确限制使用的GPU多处理器数量?我想计算我的算法随着多处理器数量的增加而扩展的情况。

如果有帮助的话:我正在使用CUDA 4.0和计算能力为2.0的设备。


我有所怀疑。唯一可能提供这种控制的是设备API,但我在那里没有看到任何有前途的东西。 - Kerrek SB
你能详细解释一下吗?这是一个架构问题还是只是没有人愿意让他们的程序变慢呢? - Kylo
@kylo:API抽象了GPU上的工作调度细节。程序员无法控制硬件的使用或调度方式。虽然有些人使用微基准测试来推断不同时间的工作方式,但它已经随着主要CUDA版本和硬件架构的演变而发生了相当大的变化。过去学到的任何东西(比如CygnusX1的建议)都不能保证仍然有效或将来仍然有效。 - talonmies
1个回答

1

啊...我知道问题所在。当我写论文时也曾遇到过这个问题。

没有明确的方法可以解决这个问题,但是你可以尝试“破解”它,让一些块不做任何事情。

  • 如果你从未启动超过多处理器数量的块,则你的工作很容易 - 只需启动更少的块即可。因为一个块无法分裂成多个SM,所以某些SM保证没有工作要做。
  • 如果你启动了更多的块,并且只依赖驱动程序来调度它们,请使用另一种方法:只启动GPU可以处理的块数,如果其中一个块完成了工作,而不是终止它,就回到开头并获取另一段需要处理的数据。最可能的情况是,您的计算机程序的性能不会下降; 如果您仔细安排工作计划,性能甚至可能会变得更好 :)
  • 最大的问题是当所有的块都在GPU上同时运行,但每个SM有多个块的时候。然后你需要正常启动,但手动“禁用”一些块并命令其他块代表它们去完成工作。问题是-禁用哪些块以确保一个SM正在工作而另一个SM没有工作。

根据我的实验结果,1.3设备(我使用的是GTX 285)按顺序调度块。因此,如果我将60个块启动到30个SM上,块1-30会被调度到SM1-30,然后再次将31-60块调度到SM1-30。因此,通过禁用第5和第35块,第5号SM实际上没有做任何事情。

但请注意,这是我私人的、实验性的观察,两年前做出的。NVIDIA不予确认、支持、维护或其他任何形式的保证,而且可能会随着新的GPU和/或驱动程序发生变化(或已经发生变化)。

我建议——尝试一些简单的内核,这些内核需要完成大量愚蠢的工作,并查看在各种“启用”/“禁用”配置上计算需要多长时间。如果你幸运的话,你会发现性能下降,表明有2个块实际上是由单个SM执行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接