我想知道如何退出线程索引较大的线程。我看到两种可能性:
int i = threadIdx.x;
if(i >= count)
return;
// do logic
或
int i = threadIdx.x;
if(i < count) {
// do logic
}
我知道,两者都是正确的,但哪一个会影响性能呢?
答案 0 :(得分:4)
虽然两者在性能方面都相同,但您应该考虑到不建议使用第一个。
在内核中返回一个线程可能会在其余代码中导致意外行为。
出乎意料的行为,我指的是与经线中分组的最小线程单位相关的任何问题。例如,如果你的内核中有一个if / else
块,这种情况称为线程分歧,在正常情况下会导致线程保持空闲状态,而其他线程会执行一些指令。
示例书中的CUDA,第5章,线程合作:
但是在__syncthreads()的情况下,结果有些悲惨。 CUDA架构保证没有线程进入__syncthreads()之外的指令,直到块中的每个线程都执行__syncthreads()
因此,它主要与内核中的线程同步有关。您可以在此处找到关于此主题的非常好的问题/答案:Can I use __syncthreads() after having dropped threads?
正如我最后指出的那样,我也使用了不良做法并且没有出现任何问题,但无法保证将来可能出现问题。这是我不推荐的东西