__syncthreads()死锁

时间:2011-06-25 07:58:21

标签: c++ cuda

如果只有一些线程执行它,__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,则某些线程将不执行该代码。这会导致僵局吗? 如果是,那么我该如何修改代码?

2 个答案:

答案 0 :(得分:3)

您应该在不同的代码中使用__syncthreads()。在这种情况下它的行为是不明确的。

只有在您确定的情况下,

__syncthreads()才会出现在条件分支中,这个分支将以相同的方式由块中的所有线程统一评估(所有线程中的所有线程或者没有来自块的线程都采用分支)。

答案 1 :(得分:1)

从技术上讲,内核不能死锁;他们只能超时。但是,是的,你所描述的是真实的,可能发生的。之前已经讨论过这个问题,例如:Realistic deadlock example in CUDA/OpenCL