我在想如何退出线程,其线程索引很大。我看到两种可能性:CUDA中的背离 - 从内核中的线程退出
int i = threadIdx.x;
if(i >= count)
return;
// do logic
或
int i = threadIdx.x;
if(i < count) {
// do logic
}
我知道,那都是正确的,但哪一个影响更多的表现?
我在想如何退出线程,其线程索引很大。我看到两种可能性:CUDA中的背离 - 从内核中的线程退出
int i = threadIdx.x;
if(i >= count)
return;
// do logic
或
int i = threadIdx.x;
if(i < count) {
// do logic
}
我知道,那都是正确的,但哪一个影响更多的表现?
尽管两者在性能方面相同,但您应该考虑到不建议使用第一个。
在内核中返回一个线程可能会导致其他代码中的意外行为。
意想不到的行为我的意思是任何问题都与分组在一个warp中的线程的最小单元有关。例如,如果内核中有if/else
块,则此情况称为线程分歧,在正常情况下,它会导致线程保持空闲状态,而其他线程则执行某些指令。
CUDA通过实施例书,第5章,线程合作:
但在__syncthreads的情况下(),其结果是有些悲惨。 CUDA架构保证没有线程将提前超越__syncthreads()的指令,直到每块线程执行的__syncthreads()
因此,它主要涉及到内核中的线程同步。你可以找到关于这个话题在这里很好的提问/回答:Can I use __syncthreads() after having dropped threads?
正如我最后一点,我也用的是不好的做法并没有什么问题出现,但没有可能在未来出现问题的保证。这是我不会推荐的东西
两者都会给你同样的表现。 – sgarizvi 2013-02-14 07:10:59