我参加了CUDA并行编程课程,我已经看到很多CUDA线程配置的例子,其中通常将所需的线程数量向上舍入为32的最接近的线程。我理解线程被分组为warp,并且如果你启动了1000个线程,那么GPU无论如何都会将它四舍五入到为什么,那么为什么要明确呢?
答案 0 :(得分:5)
建议通常在您可能会选择各种线程块大小来解决相同问题的情况下给出。
我们以矢量添加为例。假设我的向量长度为100000.我可以选择通过每个启动100个1000个线程的块来执行此操作。在这种情况下,每个块将具有1000个活动线程和24个非活动线程。我对线程资源的平均利用率是1000/1024 = 97.6%。
现在,如果我选择大小为1024的块,该怎么办?现在我只需要启动98个块。这些块中的前97个在线程利用率方面得到了充分利用 - 每个线程都在做一些有用的事情。第98个块只有672个(1024个)线程正在做一些有用的事情。由于内核代码中的线程检查(if (idx < N)
)或其他构造,其他显式处于非活动状态。所以我在那个块中有352个非活动线程。但我的总体平均利用率是100000/100352 = 99.6%
所以在上面的场景中,最好选择“完整”的线程块,可以被32整除。
如果你正在对长度为1000的向量进行向量添加,并且你打算在一个线程块中进行,(两者可能都是坏主意),那么你是否为线程块大小选择1000或1024并不重要