2013-02-14 65 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