2013-02-14 43 views
5

我在想如何退出线程,其线程索引很大。我看到两种可能性:CUDA中的背离 - 从内核中的线程退出

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

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

我知道,那都是正确的,但哪一个影响更多的表现?

+0

两者都会给你同样的表现。 – sgarizvi 2013-02-14 07:10:59

回答

3

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

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

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

CUDA通过实施例书,第5章,线程合作:

但在__syncthreads的情况下(),其结果是有些悲惨。 CUDA架构保证没有线程将提前超越__syncthreads()的指令,直到每块线程执行的__syncthreads()

因此,它主要涉及到内核中的线程同步。你可以找到关于这个话题在这里很好的提问/回答:Can I use __syncthreads() after having dropped threads?

正如我最后一点,我也用的是不好的做法并没有什么问题出现,但没有可能在未来出现问题的保证。这是我不会推荐的东西

+2

你的意思是什么意外的行为,是什么问题?我已经在教程中看到了它,并且我也使用了它,到目前为止我没有遇到任何问题。 – 2013-02-14 08:44:45

+0

请为您的索赔提供参考。 – RoBiK 2013-02-14 10:22:27

+0

@GeorgeAprilis该问题主要涉及_good的做法_和将来的同步。 – pQB 2013-02-15 11:27:42