cuda调试常见问题
·
本文记录自己在cuda调试中遇到的各种奇怪问题,作者自用,持续更新。
- kernel failed: invalid argument
可能原因一:前一步出错
代码:
bool* x_flag;
cudaMalloc(&x_flag,sizeof(bool)*n);
cudaMemset(&x_flag,0,sizeof(bool)*n);
for (int phase = 0; phase < num_phases; ++phase) {
ParallelSkeletonPipeline_1 << <gridSize, blockSize >> > (three_domain,rhs,n,phase);
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
std::cerr << "Phase " << phase << " kernel failed: "
<< cudaGetErrorString(err) << std::endl;
}
}
出问题的原因在于cudaMemset(&x_flag,0,sizeof(bool)*n);,应该修改为cudaMemset(x_flag,0,sizeof(bool)*n);
可能原因二:越界访问
此处有关于移位运算的相关问题
int stride = 1 << (phase+1);
int idx = (blockIdx.x * blockDim.x + threadIdx.x+1)*stride-1;
和
int idx = (blockIdx.x * blockDim.x + threadIdx.x+1)*(1<<(phase+1))-1;
并不等价。可以尝试把位移运算改成*2这样去解决。
更多推荐
所有评论(0)