本文记录自己在cuda调试中遇到的各种奇怪问题,作者自用,持续更新。

  1. 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这样去解决。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐