我可以获取上次调用的CUDA API函数的名称吗?

时间:2013-11-28 17:19:17

标签: c++ reflection error-handling cuda status

我可以使用cudaGetLastError()获取上次CUDA API调用的返回状态。得到它的名字怎么样?我没有看到cudaGetLastAPICallName(),但是有一些(未)记录的等价物吗?

2 个答案:

答案 0 :(得分:3)

据我所知,不,你不能。重要的是要记住

  1. cudaGetLastError()返回早期运行时API调用的状态,但不一定是最后一个。在异步调用已经返回cudaSuccess之后,异步调用可以在操作期间报告错误,在这种情况下,其错误将由返回状态的下一个API函数返回。解析他的结果会对流中的并发操作特别复杂。
  2. 至少有一个操作(内核自己启动)没有明确的运行时API调用,它可以与任何程序员可见源相关,即使它们在窗帘后面调用了一系列记录的私有API调用。
  3. 我不清楚如何以一种能提供有意义的附加信息的方式干净地处理这两种情况,特别是当某些类型的设备运行时错误可以杀死活动上下文时,无论如何都会失去很多状态。 ..

答案 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);