2014-10-28 135 views
2

我参加了CUDA并行编程课程,并且我看到了很多CUDA线程配置的例子,在这些例子中,我们需要将线程的数量四舍五入到最接近的32的倍数。我知道线程被分组为warp,如果你启动1000个线程,那么GPU会将它舍入到1024,所以为什么要明确地表达呢?为什么要在CUDA中启动32个线程的倍数?

回答

3

建议通常在您可能会想到选择各种线程块大小以解决相同问题的情况下给出。

让我们以矢量添加为例。假设我的矢量长度为100000.我可以选择通过启动100个1000线程块来实现。在这种情况下,每个块将有1000个活动线程和24个不活动线程。我的线程资源平均利用率为1000/1024 = 97.6%。

现在,如果我选择大小为1024的块呢?现在我只需要启动98块。这些块的前97个在线程利用率方面得到充分利用 - 每个线程都在做一些有用的事情。第98块只有672个(1024个)线程正在做一些有用的事情。由于线程检查(if (idx < N))或其他内核代码中的构造,其他显式非活动。所以我在这个块中有352个不活动的线程。但我的整体平均利用率十万〇三百五十二分之十万= 99.6%

因此,在上述情况下,最好选择“全” threadblocks,由32

整除如果你正在做载体上添加的矢量长度为1000,并且您打算在单个线程块中执行此操作(两者可能都是错误的想法),那么无论您为线程块大小选择1000还是1024,都无关紧要。

相关问题