1
CUDA / cuda-gdb 显示的错误信息
« 最后发表 作者 2017012835 于 五月 15, 2023, 09:16:50 am »请问一下,用 cuda-gdb 调试程序输入了 r 命令,得到了图片上的报错内容,之前的报错都是定位到了程序中的某一行,但现在这个报错不知道说的是什么意思,请问出现这样的错误可能是哪里的问题呢?
int *d_flag;
checkCudaErrors(cudaMalloc((void**)&d_flag, 1*sizeof(int)));
cudaMemset(d_flag, 1, sizeof(int)*1); //初始化为1
block = 96;
isIter<<<(M+block-1)/block,block>>>(d_flag, d_check);
isIter核函数想实现的功能是 :flag[0]初始化是1,若check数组有一个数不为0,则将flag[0]置为0__global__ void isIter(int *flag, int *checkResult) {
int idx = threadIdx.x + blockDim.x * blockIdx.x;
if(idx < M){
if(checkResult[idx] != 0){
flag[0] = 0;
}
}
}
可这样老是会输出flag[0]=16843009(也有部分线程进入if语句里边,输出flag[0]=0),可将flag[0]复制到CPU读取的时候是16843009,请问这是为什么啊?您好,您第一个问题是不是数组索引越界了,for循环里的S_A[threadIdx.x * 12 + j],其中threadIdx.x最大是127,当它取最大值(或没有取到最大值时),threadIdx.x * 12 + j都超过了您设置的S_A[128]里面的128您好,我按照您说的索引越界问题进行了修改将S_A定义设置为__shared__ float S_A[1536],程序可以正确运行,但是将定义设置为__shared__ float S_A[1280]程序也能正确运行,所以对共享内存数组大小问题还是有疑问。
kernel2(float* A,float* M, float* Y,float* X)
{
const int n = blockDim.x * blockIdx.x + threadIdx.x;
E[n]=0;
__shared__ float S_E[sizeof(float) * 320];
__shared__ float S_A[sizeof(float) * 320];
S_E[threadIdx.x] = E[n];
__syncthreads();
for (int j = 0; j < 12; j++)
{
S_A[threadIdx.x * 12 + j] = A[n * 12 + j];
S_A[threadIdx.x * 12 + j]=M[Y[n]]+X[n * 12 + j];
atomicAdd(&S_E[threadIdx.x],S_A[threadIdx.x * 12 + j]/2);
}
__syncthreads();
}
请问如何才能最大程度减轻共享内存S_A和S_E共享内存的bank冲突问题?