2012-08-27 136 views
1

我正在使用具有1.3计算能力的Tesla C1060和nvcc编译器驱动程序4.0。我正在尝试对线程块进行一些局部计算。每个线程块都有一个共享数组,它首先被初始化为零值。为了通过线程块的线程同步并发更新(添加)到共享数据,我使用CUDA atomicAdd原语。CUDA共享内存原子错误

一旦每个线程块准备就绪并将结果存入其共享数据数组中,共享数据数组中的每个条目都会迭代地(使用atomicAdd)合并到全局数据数组中的相应条目中。

下面的代码非常类似于我基本上想要做的。

#define DATA_SZ 16 
typedef unsigned long long int ULLInt; 

__global__ void kernel(ULLInt* data, ULLInt ThreadCount) 
{ 
    ULLInt thid = threadIdx.x + blockIdx.x * blockDim.x; 
    __shared__ ULLInt sharedData[DATA_SZ]; 

    // Initialize the shared data 
    if(threadIdx.x == 0) 
    { 
    for(int i = 0; i < DATA_SZ; i++) { sharedData[i] = 0; } 
    } 
    __syncthreads(); 

    //..some code here 

    if(thid < ThreadCount) 
    { 
    //..some code here 

    atomicAdd(&sharedData[getIndex(thid), thid); 

    //..some code here   

    for(..a loop...) 
    { 
     //..some code here 

     if(thid % 2 == 0) 
     {   
     // getIndex() returns a value in [0, DATA_SZ) 
     atomicAdd(&sharedData[getIndex(thid)], thid * thid); 
     } 
    } 
    } 
    __syncthreads(); 

    if(threadIdx.x == 0) 
    { 
    // ... 
    for(int i = 0; i < DATA_SZ; i++) { atomicAdd(&Data[i], sharedData[i]); } 
    //... 
    } 
} 

如果我用-arch = sm_20进行编译,我没有得到任何错误。然而,当我使用编译内核-arch = sm_13选项我得到了以下错误:

ptxas /tmp/tmpxft_00004dcf_00000000-2_mycode.ptx, line error : Global state space expected for instruction 'atom' 
ptxas /tmp/tmpxft_00004dcf_00000000-2_mycode.ptx, line error : Global state space expected for instruction 'atom' 
ptxas fatal : Ptx assembly aborted due to errors 

如果我评论如下两行,我不跟-arch = sm_13得到任何错误:

atomicAdd(&sharedData[getIndex(thid), thid); 
atomicAdd(&sharedData[getIndex(thid)], thid * thid); 

有人可以建议我可能做错了吗?

回答

1

在CUDA C编程指南中找到了解决方案:在共享内存上运行的原子函数和在64位字上运行的原子函数仅适用于计算能力为1.2或更高的设备。在共享内存中以64位字运行的原子功能仅适用于计算能力为2.x或更高的设备。

所以基本上我不能在这里使用ULLInt来回共享内存,不知何故我需要使用unsigned int