2

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

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

4

1 回答 1

7

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

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

不建议在线程块之间进行通信和同步,因为它破坏了具有不同数量多处理器的 GPU 之间的执行可扩展性,这也是首先使用线程块的原因。

于 2012-08-24T02:34:52.377 回答