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

Tom*_*ski 6 performance cuda gpgpu nvidia

我想知道如何退出一个线程,其线程索引很大.我看到两种可能性:

int i = threadIdx.x;
if(i >= count)
    return;
// do logic
Run Code Online (Sandbox Code Playgroud)

要么

int i = threadIdx.x;
if(i < count) {
    // do logic
}
Run Code Online (Sandbox Code Playgroud)

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

pQB*_*pQB 4

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

返回内核中的线程可能会导致其余代码出现意外行为。

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

CUDA 示例书,第 5 章,线程协作:

但对于__syncthreads()来说,结果就有些悲惨了。CUDA 架构保证没有线程会前进到 __syncthreads() 之外的指令,直到块中的每个线程都执行了 __syncthreads()

所以,它主要与内核内的线程同步有关。您可以在这里找到关于此主题的一个非常好的问题/答案:Can I use __syncthreads() after had Dropedthreads?

正如我最后指出的那样,我也使用了这种不好的做法,并且没有出现问题,但不能保证将来会出现问题。这是我不推荐的事情

  • 意外行为是什么意思,问题是什么?我在教程中看到过它,也使用过它,到目前为止我还没有出现任何问题。 (2认同)