__syncthreads()死锁

3
__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个回答

3

在分歧代码中,您不应使用__syncthreads()。在这种情况下,它的行为是未定义的。

__syncthreads()只能出现在条件分支中,如果您确定该分支将被块中所有线程统一地评估(即块中所有线程都采取或不采取该分支)。


0

从技术上讲,内核无法死锁;它们只能超时。但是,是的,您所描述的情况是真实存在并可能发生的。实际上,这个问题之前已经讨论过,例如:CUDA/OpenCL中现实死锁示例


1
它们可以死锁,并且非显示CUDA设备没有看门狗定时器,因此如果在这种情况下它们死锁,它们将不会超时。 - harrism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接