有什么方法可以明确限制程序运行期间使用的GPU多处理器的数量?我想计算出我的算法如何随着越来越多的多处理器而扩展。

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

最佳答案

Aaahhh ...我知道问题所在。我写论文时自己玩。

没有明确的方法可以执行此操作,但是您可以通过使某些块不执行任何操作来尝试对其进行“破解”。

  • 如果因为有多处理器而从不启动更多的块,那么您的工作就很容易-只需启动更少的块即可。保证某些SM无法工作,因为一个块无法拆分为多个SM。
  • 如果您启动了更多的块,而只是依靠驱动程序来调度它们,请使用另一种方法:只要启动GPU可以处理的尽可能多的块,并且如果其中一个块完成了工作,而不是终止它,则循环返回从头开始并获取另一条要处理的数据。您的程序的性能极有可能不会下降。如果您认真安排工作时间,它甚至可能会变得更好:)
  • 最大的问题是,所有块一次都在GPU上运行,但是每个SM上有多个块。然后,您需要正常启动,但要手动“禁用”某些块,并命令其他块为它们完成工作。问题是-禁用哪些块以确保一个SM在工作而其他SM在不工作。

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

    但是请注意,这是我2年前所做的私有(private)实验性观察。 NVIDIA并未对此进行任何确认,支持,维护,它可能会随着新的GPU和/或驱动程序而改变(或已经改变)。

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

    关于CUDA-限制使用的SM数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8278435/

    10-12 16:01