Cuda错误超出范围

时间:2018-06-27 19:26:43

标签: c++ memory cuda shared-memory

我在内核中共享内存分配方面遇到问题,在该内核中,我一直越界错误。根据我的理解,每个线程可用于将数据部分加载到称为私有原子的第一个共享块中,并且在for循环内,在每次迭代中,im将下一个连续的块加载到不同的共享内存中,以便计算与我之间的空间距离。线程到下一个连续块中的所有线程,然后计算该线程与本地块中所有其他线程之间的距离。

由于我的错误是关于超出范围的问题,所以我怀疑我的问题是如何将内存复制到共享内存中。

pdh_priv(bucket * histogram,atom * list, double width, int size, int BlockSize)
{
 int t = threadIdx.x;
 int b = blockIdx.x;
 unsigned int reg = t + b * blockDim.x;

 extern __shared__ atom private_atom[];

if(t < BlockSize)   
    private_atom[t] = list[t];
__syncthreads();


for(int i = b + 1; i < size/BlockSize; ++i)
{
     extern __shared__ atom localBlock[];

    unsigned int tempIdx = t + i *blockDim.x;
        localBlock[tempIdx] = list[tempIdx];
    __syncthreads();
    for(int j = 0; j < BlockSize;++j)
    {
        double distance = p2p_distance(private_atom[t], localBlock[j]);
        int pos = (int) (distance/width);
        atomicAdd(&histogram[pos].d_cnt,1);
    }

}

for(int i = t+1;i < BlockSize;++i)
{
    double distance = p2p_distance(list,t,i);
    int pos = (int) (distance/width);
    atomicAdd( &histogram[pos].d_cnt,1);
} 

}

我正在通过此调用初始化内核

pdh_priv <<<ceil(PDH_acnt/BlockSize),BlockSize,BlockSize*sizeof(atom) >>>(dev_Histo, dev_atomL,PDH_res,PDH_acnt,BlockSize);

1 个答案:

答案 0 :(得分:0)

我发现了问题。

行:     localBlock [thempIdx] = list [tempIdx]

试图仅在写入线程位置时访问越界位置,如下所示:     localBLock [thhreadIdx.x] = list [tempIdx];