cudaMemcpy函数调用中的“cudaErrorUnknown”

时间:2013-10-04 02:52:09

标签: c++ cuda gpu gpgpu gpu-programming

我使用函数来计算三个向量的向量点,并使用reduce来使其更快。 但是,我总是遇到这样的错误:

CUDA error at kernel.cu:120 code=30(cudaErrorUnknown) "cudaMemcpy(partia
l_c, dev_partial_c,sizeofblock,cudaMemcpyDeviceToHost )"

我无法弄清楚为什么因为代码似乎正常。而分配函数没有返回错误。是否有任何可能的解决方案? 非常感谢你。

double vector_dot(double* d_A,double* d_B,double *d_C,int numElements)
{
    int size = sizeof(double) * numElements;
    int c_size = sizeof(char) * numElements;
    double *d_D=NULL;
    checkCudaErrors(cudaMalloc((void**)&d_D,size)); 
    // Launch the Vector Add CUDA Kernel
    int threadsPerBlock = 256;
    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
    vectorMPL<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_D, numElements);
    double *partial_c;
    double*dev_partial_c;
    int sizeofblock=blocksPerGrid*sizeof(double);
    partial_c = (double*)malloc(sizeofblock);
    checkCudaErrors( cudaMalloc( (void**)&dev_partial_c,sizeofblock )) ;
    vector_dot_h<<<blocksPerGrid, threadsPerBlock>>>(d_D, d_C, dev_partial_c, numElements);

    double sum = 0;
    checkCudaErrors(cudaMemcpy(partial_c,dev_partial_c,sizeofblock,cudaMemcpyDeviceToHost));

    for (int i=0; i<blocksPerGrid; i++) {
        sum += partial_c[i];
    }

    checkCudaErrors(cudaFree(d_D));
    checkCudaErrors(cudaFree(dev_partial_c));  
    free(partial_c);
    // Reset the device and exit
    checkCudaErrors(cudaDeviceReset());
    return sum;
}

如果我删除了这个,我将在cudafree call中收到未知错误。似乎所有的cuda API调用都无法完成。我想知道为什么? 什么是未知的cuda错误?原因是什么?

1 个答案:

答案 0 :(得分:2)

cudaMemcpycudaFree的{​​{3}}包含以下注释:

  

请注意,此函数也可能返回之前的错误代码,   异步启动。

即。错误不会发生在cudaMemcpycudaFree中,而是发生在上一次内核启动或执行期间。如果您按照documentation并将代码修改为以下内容:

vectorMPL<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_D, numElements);
checkCudaErrors(cudaPeekAtLastError());
checkCudaErrors(cudaDeviceSynchronize());

您应该发现cudaDeviceSynchronize()调用报告错误,表明内核执行时发生了错误。错误的根本原因很可能是vector_dot_h内的超出内存访问范围,但由于您没有为相关内核调用提供代码或执行参数,因此无法为您提供更多内容准确的诊断。 CUDA工具包附带了一个名为cuda-memcheck的实用程序,您可以使用该实用程序获取有关正在运行的内核中的非法内存访问模式的更多信息。我建议您尝试在此代码上使用它。