我编写了简单的内核来测试CUDA __syncthreads
的功能。在内核中,我设法从每个线程打印,如果更新的值对其他线程不可见。理想情况下,没有线程应该打印Not visible to me
错误消息,但有些线程最终会打印此消息。
这是内核。
__device__ int a=0;
__global__ void kernel()
{
isItOK=false;
if(threadIdx.x==0 && blockIdx.x==0)
{
atomicAdd(&a,1);
__threadfence();
}
__syncthreads();
if(atomicAdd(&a,0)==0)
{
cuPrintf("Not Visible to me\n");
}
}
int main()
{
int *a;
cudaPrintfInit();
kernel<<<16,16>>>();
cudaPrintfDisplay(stdout,true);
cudaPrintfEnd();
}
请帮我解决这个非常简单的测试程序,但仍然无法正常工作。我们需要一些编译器标志来设置吗?
答案 0 :(得分:5)
__syncthreads()
是一个同步屏障原语,只同步同一个块中的线程。
CUDA没有跨线程块安全同步的机制。
不建议在线程块之间进行通信和同步,因为它会破坏具有不同数量的多处理器的GPU的执行可伸缩性,这就是首先拥有线程块的原因。