2011-06-25 54 views
2

如果只有一些線程執行它,__syncthreads()會導致死鎖嗎?__syncthreads()死鎖

我有一個這樣的內核:

__global__ void Kernel(int N,int *a) 
{ 
    if(threadIdx.x<N) 
    { 
     for(int i=0;i<N;i++) 
     { 
     a[threadIdx.x]= //Some calculation using a and i 
     __syncthreads() 
     } 
    } 
} 

如果線程的塊的數量大於N越大,則一些線程將不會執行該代碼。這會導致僵局嗎?
如果是,那我該如何修改代碼?

回答

3

您應該而不是使用__syncthreads()在發散的代碼。它在這種情況下的行爲是不確定的。

__syncthreads()只有在您確定的情況下才會出現在條件分支中,此分支將以同樣的方式由塊中的所有線程(全部或線程中的所有線程都不佔用分支)統一計算。

1

從技術上講,內核不能死鎖;他們只能超時。但是,是的,你所描述的是真實的,可以發生的。例如:Realistic deadlock example in CUDA/OpenCL

+0

它們可能會死鎖,並且非顯示CUDA設備沒有看門狗定時器,因此如果它們在這種情況下發生死鎖,它們將不會超時。 – harrism