我正在实现的算法有许多需要并行完成的事情。我的问题是,如果我不打算使用共享内存,我应该更喜欢更多的块和更少的线程/块还是更多的线程/块和更少的块来提高性能,这样总线程加起来就是我需要的并行事物的数量去做?
问问题
150 次
1 回答
2
我假设“设定的事物数量”是一个小数字,否则您不会问这个问题。尝试公开更多的并行性可能是值得的。
CUDA GPU 将执行活动和由此产生的内存访问分组到 32 个线程的 warp 中。因此,至少,您需要首先为每个线程块创建至少一个 warp。
然后,您需要创建至少与 GPU 中的 SM 一样多的线程块。如果您有 4 个 SM,那么您的下一个超过 32 的缩放增量将是创建 4 个线程块,每个线程块有 32 个线程。
如果在这个假设的示例中您有超过 128 个“事物数量”,那么您可能希望增加每个线程块的扭曲以及线程块。您可能会从线程块开始,直到达到某个数字(可能约为 16 左右),这将允许您的代码在比假设的 4-SM GPU 更大的 GPU 上扩展。但是在单个 SM 上可以打开的线程块的数量是有限制的,所以在 16 个左右的线程块之后很快你还需要将每个线程块的扭曲数增加到超过 1(即超过 32 个线程)。
这些针对小问题的策略将允许您在问题扩大时尽快利用 GPU 上的所有硬件,同时如果您的问题足够大(例如,每个线程块超过一个扭曲),仍然允许隐藏延迟的机会,或每个 SM 驻留多个线程块)。
于 2013-11-14T20:22:08.970 回答