【发布时间】:2013-11-28 00:40:20
【问题描述】:
我正在实施的算法有许多需要并行完成的事情。我的问题是,如果我不打算使用共享内存,我应该更喜欢更多的块和更少的线程/块还是更多的线程/块和更少的块来提高性能,以便总线程加起来就是我需要的并行事物的数量做什么?
【问题讨论】:
标签: c++ c performance cuda
我正在实施的算法有许多需要并行完成的事情。我的问题是,如果我不打算使用共享内存,我应该更喜欢更多的块和更少的线程/块还是更多的线程/块和更少的块来提高性能,以便总线程加起来就是我需要的并行事物的数量做什么?
【问题讨论】:
标签: c++ c performance cuda
我假设“设定的事物数量”是一个小数字,否则您不会问这个问题。尝试展示更多的并行性可能是值得的。
CUDA GPU 将执行活动和由此产生的内存访问分组到 32 个线程的 warp 中。因此,您至少需要为每个线程块创建至少一个 warp。
然后,您需要创建至少与 GPU 中的 SM 一样多的线程块。如果您有 4 个 SM,那么您的下一个超过 32 的缩放增量将是创建 4 个线程块,每个线程块有 32 个线程。
如果在这个假设示例中“事物数量”超过 128 个,那么您可能希望增加每个线程块的扭曲以及线程块。您可能会从线程块开始,直到达到某个数字(可能大约 16 个左右),这将允许您的代码在比假设的 4-SM GPU 更大的 GPU 上扩展。但是单个 SM 上可以打开的线程块的数量是有限制的,所以在 16 个左右的线程块之后很快你还需要将每个线程块的扭曲数增加到超过 1(即超过 32 个线程)。
这些针对小问题的策略可让您在问题扩大时尽快利用 GPU 上的所有硬件,同时如果您的问题足够大(例如,不止一个warp 每个线程块,或每个 SM 驻留多个线程块)。
【讨论】: