CUDA处理错误

CUDA处理错误

由于许多CUDA调用是异步的,所以有时可能很难确定某个错误是由哪一步程序引起的。定义一个错误处理宏封装所有的CUDA API调用,这简化了错误检查过程:

1
2
3
4
5
6
7
8
9
#define CHECK(call)
{
const cudaError_t error = call;
if(error != cudaSuccess)
{
printf("Error:%s:%d, ", __FILE__, __LINE__);
printf("code:%d, reason: %s\n", error, cudaGetErrorString(error));
}
}

例如,你可以在以下代码中使用宏:

1
CHECK(cudaMemcpy(d_C, gpuRef, nBytes, cudaMemcpyHostToDevice));

如果内存拷贝或之前的异步操作产生了错误,这个宏会报告错误代码,并输出一个可读信息,然后停止程序。也可以用下述方法,在核函数调用后检查核函数错误:

1
2
kernel_function<<<grid,block>>>(argument list);
CHECK(cudaDeviceSynchronize());

CHECK(cudaDeviceSynchronize())会阻塞主机端线程的运行直到设备端所有的请求任务都结束,并确保最后的核函数启动部分不会出错。以上仅是以调试为目的的,因为在核函数启动后添加这个检查点会阻塞主机端线程,使该检查点成为全局屏障。

参考资料

CUDA C编程权威指南 程润伟,Max Grossman(美),Ty Mckercher


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!