CUDA - 限制使用的 SM 数量

Kyl*_*ylo 5 c cuda

有什么办法可以明确限制程序运行时使用的 GPU 多处理器的数量?我想计算我的算法如何随着多处理器数量的增加而扩展。

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

Cyg*_*sX1 1

啊啊……我知道问题所在了。我自己写论文的时候也玩过这个。

没有明确的方法可以做到这一点,但是您可以尝试通过让某些块不执行任何操作来“破解”它。

  • 如果您从不启动更多的块,因为存在多处理器,那么您的工作很简单 - 只需启动更少的块即可。一些 SM 保证没有工作,因为一个块不能分裂成多个 SM。
  • 如果您启动更多块并且仅依靠驱动程序来调度它们,请使用不同的方法:只需启动 GPU 可以处理的尽可能多的块,并且如果其中一个块完成其工作,而不是终止它,而是循环回到开始并获取另一条数据进行处理。最有可能的是,你的程序的性能不会下降;如果你仔细安排你的工作,它甚至可能会变得更好:)
  • 最大的问题是,当所有块同时在 GPU 上运行时,但每个 SM 有多个块。然后,您需要正常启动,但手动“禁用”某些块并命令其他块为它们完成工作。问题是 - 禁用哪些块以保证一个 SM 正在工作而另一个则不工作。

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

但请注意,这是我两年前进行的私人实验观察。它绝不是由 NVIDIA 确认、支持、维护的,并且可能会随着新的 GPU 和/或驱动程序而改变(或已经改变)。

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