gpt4 book ai didi

c++ - cudaMemcpy 函数调用中的“cudaErrorUnknown”

转载 作者:行者123 更新时间:2023-11-30 04:13:54 24 4
gpt4 key购买 nike

我使用函数计算三个 vector 的 vector 点,并使用 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 调用中收到未知错误。似乎所有的 cuda API 调用都无法完成。我想知道为什么?什么是cuda error unknown?是什么原因?

最佳答案

documentation cudaMemcpycudaFree 都包含以下注释:

Note that this function may also return error codes from previous, asynchronous launches.

即。该错误未发生在 cudaMemcpycudaFree 中,而是发生在之前的内核启动或执行期间。如果关注this advice并将您的代码修改为如下内容:

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

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

关于c++ - cudaMemcpy 函数调用中的“cudaErrorUnknown”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19172408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com