问题描述
|
如果只有一些线程执行__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,则某些线程将不执行该代码。这会导致僵局吗?
如果是,那我该如何修改代码?
解决方法
您不应在不同的代码中使用ѭ1。在这种情况下其行为是不确定的。
仅当您确定条件分支中才会出现“ 1”时,该分支将以相同的方式由一个块中的所有线程统一评估(该分支中的所有线程或无线程都采用该分支)。
, 从技术上讲,内核不会死锁。他们只能超时。但是,是的,您所描述的是真实的并且可能发生。实际上,以前已经讨论过该问题,例如:CUDA / OpenCL中的实际死锁示例