Cuda 错误越界
Cuda Error Out of Bounds
我在内核中的共享内存分配方面遇到问题,我不断遇到越界错误。据我了解,每个线程都可用于将数据部分加载到第一个称为私有原子的共享块中,并且在 for 循环中,在每次迭代中,我将下一个连续块加载到不同的共享内存中,以便计算与我的空间距离线程到下一个连续块中的所有线程,然后我计算线程与本地块内所有其他线程之间的距离。
由于我的错误是关于越界问题,我怀疑我的问题是我如何将内存复制到共享内存中。
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);
我发现了我的问题。
行:
localBlock[thempIdx] = list[tempIdx]
试图访问越界位置,而它应该只写入线程位置,如下所示:
localBLock[thhreadIdx.x] = list[tempIdx];
我在内核中的共享内存分配方面遇到问题,我不断遇到越界错误。据我了解,每个线程都可用于将数据部分加载到第一个称为私有原子的共享块中,并且在 for 循环中,在每次迭代中,我将下一个连续块加载到不同的共享内存中,以便计算与我的空间距离线程到下一个连续块中的所有线程,然后我计算线程与本地块内所有其他线程之间的距离。
由于我的错误是关于越界问题,我怀疑我的问题是我如何将内存复制到共享内存中。
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);
我发现了我的问题。
行: localBlock[thempIdx] = list[tempIdx]
试图访问越界位置,而它应该只写入线程位置,如下所示: localBLock[thhreadIdx.x] = list[tempIdx];