cuda错误检测方法
宿主线程维护着一个初始化为cudaSuccess的cudaError_t类型变量,但出现错误时,该变量都会被错误代码替换。在调用cudaGetLastError()时,就会返回此变量,并将其置为cudaSucess。
CUDA 提供了相应的错误信息函数,常用的有以下两个:
cudaGetErrorName()
: 返回错误代码
cudaGetErrorString()
: 返回错误说明
在 CUDA 运行时,每个线程都会维护一个初始值为 cudaSuccess 的错误变量,并在每次发生错误时被错误代码覆盖,使用如下两个函数可以检测出现错误时的错误代码:
同时提供了两个捕捉错误的函数:
cudaGetLastError()
返回维护的错误变量值,会重置错误码
cudaPeekAltError()
返回维护的错误变量值,不重置错误码
另外,__global__函数是异步执行的,如果需要与CPU同步,还需要使用cudaDeviceSynchronize()函数实现同步。所以如果调用完核函数后马上调用cudaGetLastError(),很可能返回cudaSuccess,但核函数运行到某一位置时仍然报错。而且,当函数执行与错误检测不在同一个文件中时,可恢复的错误可能不会被检测到。
注意:以下几种情况错误可能不会被捕捉或被发现
- 错误为可恢复错误类型,如 12,使用
cudaGetLastError()
之后,错误码会被清理重置,需要及时返回; - 错误捕捉位置在另一个工程。例如:将核函数封装成动态库后,在其他工程中调用此函数并进行错误检测,这时不会发现可恢复的错误;