__syncthreads无法在CUDA中工作

时间:2012-08-23 18:52:26

标签: cuda

我编写了简单的内核来测试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();  
}

请帮我解决这个非常简单的测试程序,但仍然无法正常工作。我们需要一些编译器标志来设置吗?

1 个答案:

答案 0 :(得分:5)

__syncthreads()是一个同步屏障原语,只同步同一个块中的线程。

CUDA没有跨线程块安全同步的机制。

不建议在线程块之间进行通信和同步,因为它会破坏具有不同数量的多处理器的GPU的执行可伸缩性,这就是首先拥有线程块的原因。