__syncthreads无法在CUDA中工作

use*_*567 2 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();  
}
Run Code Online (Sandbox Code Playgroud)

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

har*_*ism 5

__syncthreads() 是同步屏障原语,仅同步同一块中的线程.

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

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

  • 由于我所描述的原因,缺乏全局同步不是一个"严重问题",它是设计的一部分. (2认同)