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

Parallel processing 为什么要在CUDA中启动32个线程的倍数?,parallel-processing,cuda,Parallel Processing,Cuda,我参加了一门CUDA并行编程的课程,我看到了许多CUDA线程配置的例子,在这些例子中,将所需的线程数取整到最接近32的倍数是很常见的。我知道线程被分为多个线程,如果你启动1000个线程,GPU将把它四舍五入到1024个,那么为什么要显式地这样做呢?这个建议通常是在你可能会选择不同的线程块大小来解决同一个问题的情况下给出的 让我们以向量加法为例。假设向量的长度为100000。我可能会选择启动100个块,每个块包含1000个线程。在这种情况下,每个块将有1000个活动线程和24个非活动线程。我的线程

我参加了一门CUDA并行编程的课程,我看到了许多CUDA线程配置的例子,在这些例子中,将所需的线程数取整到最接近32的倍数是很常见的。我知道线程被分为多个线程,如果你启动1000个线程,GPU将把它四舍五入到1024个,那么为什么要显式地这样做呢?

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

让我们以向量加法为例。假设向量的长度为100000。我可能会选择启动100个块,每个块包含1000个线程。在这种情况下,每个块将有1000个活动线程和24个非活动线程。我的线程资源平均利用率为1000/1024=97.6%

现在,如果我选择大小为1024的块呢?现在我只需要发射98个积木。就线程利用率而言,这些块中的前97块得到了充分利用——每个线程都在做一些有用的事情。第98个块只有672个(1024个)线程正在执行有用的操作。由于线程检查(
if(idx
)或内核代码中的其他构造,其他线程显式处于非活动状态。因此,在这个块中有352个非活动线程。但我的总体平均利用率为100000/100352=99.6%

因此,在上述场景中,最好选择“完整”线程块,它可以被32整除

如果要在长度为1000的向量上执行向量添加,并且打算在单个threadblock中执行此操作(这两种方法都可能是不好的主意),那么选择1000还是1024作为threadblock大小并不重要