CUDA中的分歧 - 退出内核中的线程

时间:2013-02-14 07:09:07

标签: performance cuda gpgpu nvidia

我想知道如何退出线程索引较大的线程。我看到两种可能性:

int i = threadIdx.x;
if(i >= count)
    return;
// do logic

int i = threadIdx.x;
if(i < count) {
    // do logic
}

我知道,两者都是正确的,但哪一个会影响性能呢?

1 个答案:

答案 0 :(得分:4)

虽然两者在性能方面都相同,但您应该考虑到不建议使用第一个。

在内核中返回一个线程可能会在其余代码中导致意外行为。

出乎意料的行为,我指的是与经线中分组的最小线程单位相关的任何问题。例如,如果你的内核中有一个if / else块,这种情况称为线程分歧,在正常情况下会导致线程保持空闲状态,而其他线程会执行一些指令。

示例书中的CUDA,第5章,线程合作:

  

但是在__syncthreads()的情况下,结果有些悲惨。 CUDA架构保证没有线程进入__syncthreads()之外的指令,直到块中的每个线程都执行__syncthreads()

因此,它主要与内核中的线程同步有关。您可以在此处找到关于此主题的非常好的问题/答案:Can I use __syncthreads() after having dropped threads?

正如我最后指出的那样,我也使用了不良做法并且没有出现任何问题,但无法保证将来可能出现问题。这是我不推荐的东西