2011-06-25 7 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()を使用しないでください。このような状況でのその動作は定義されていません。

あなたが確信している場合のみ、条件分岐にこのブランチが表示されることがあります。このブランチは、ブロック内のすべてのスレッドによって均等に評価されます。

1

技術的には、カーネルはデッドロックできません。彼らはタイムアウトすることができます。しかし、はい、あなたが記述しているものは本当のものであり、起こることがあります。問題は、実際には例えば、以前に議論されている:Realistic deadlock example in CUDA/OpenCL

+0

これらはデッドロック可能で、非表示のCUDAデバイスにはウォッチドッグタイマがないため、その場合デッドロックしてもタイムアウトしません。 – harrism

関連する問題