我在想如何退出線程,其線程索引很大。我看到兩種可能性: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