6

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

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

或者

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

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

4

1 回答 1

4

虽然两者在性能上是一样的,但是你应该考虑到第一个不推荐。

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

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

CUDA by Example Book,第 5 章,线程协作:

但在 __syncthreads() 的情况下,结果有些悲惨。CUDA 体系结构保证在块中的每个线程都执行完 __syncthreads() 之前,没有线程会前进到超出 __syncthreads() 的指令

因此,它主要与内核中的线程同步有关。你可以在这里找到关于这个主题的一个很好的问题/答案:Can I use __syncthreads() after has dropped threads?

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

于 2013-02-14T08:33:12.880 回答