为什么要在CUDA中启动32个线程的倍数



我参加了CUDA并行编程的课程,我见过许多CUDA线程配置的例子,其中通常将所需的线程数四舍五入到32的最接近倍数。我知道线程被分组为扭曲,如果你启动1000个线程,GPU无论如何都会将其四舍五入到1024个,那么为什么要明确地这样做呢?

建议通常是在您可能会选择不同的线程块大小来解决相同问题的情况下给出的。

让我们以向量加法为例。假设我的向量长度为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作为线程块大小并不重要。

最新更新