我可以使用cudaGetLastError()
获取上次CUDA API调用的返回状态。得到它的名字怎么样?我没有看到cudaGetLastAPICallName()
,但是有一些(未)记录的等价物吗?
答案 0 :(得分:3)
据我所知,不,你不能。重要的是要记住
cudaGetLastError()
返回早期运行时API调用的状态,但不一定是最后一个。在异步调用已经返回cudaSuccess
之后,异步调用可以在操作期间报告错误,在这种情况下,其错误将由返回状态的下一个API函数返回。解析他的结果会对流中的并发操作特别复杂。我不清楚如何以一种能提供有意义的附加信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,无论如何都会失去很多状态。 ..
答案 1 :(得分:0)
没有。您应该将所有CUDA调用包装在一个宏中,该宏为您提供文件名和行号。通过这种方式,您可以轻松找到罪魁祸首。
以下是一个例子:
template< typename T >
inline void __checkCudaErrors(T result, char const *const func, const char *const file, int const line)
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s:%i : checkCudaErrors() CUDA error (#%d): %s.\n",
file, line, (int)err, cudaGetErrorString(err));
exit(-1);
}
}
#define CCE(val) __checkCudaErrors( (val), #val, __FILE__, __LINE__ )
// ...
CCE(cudaMalloc(...));
CCE(cuda...);
myKernel...;
CCE(nextCudaCall);