2013-11-28 35 views

回答

3

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

  1. cudaGetLastError()返回较早运行时API调用的状态,但不一定是最后一个是很重要的。异步调用在返回cudaSuccess之后可以在操作期间报告错误,在这种情况下,它的错误将由返回状态的下一个API函数返回。解析他的结果可能会对流中的并发操作变得特别复杂。
  2. 至少有一个操作(内核启动自己),它没有明确的运行时API调用,它可以与任何程序员可见源相关,即使它们在窗帘后面调用一系列文档化的私有API调用。

这是我不清楚怎么这两种情况下可能的方式,将给予有意义的附加信息处理干净,尤其是当设备运行时错误的一些类可以强行终止活动的背景下,这失去了很多国家的无论如何......

+0

好吧,第二种情况下既可以由一个空字符串,或对应于一个内核调用,或者内核连名字一些固定的字符串处理。可以处理第一种情况,以便导致错误的API调用将成为报告的API调用,或者至少可以在同一调用中同时获得错误代码和API函数名称。 – einpoklum

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); 
+0

我承认,宏在C++中不好,但它是获取调用者的文件名和行号的最简单方法。 – Domi

+0

文件名和行号不会告诉我我需要知道什么。我需要API函数名称。 – einpoklum

+0

这是不可能的。此外,不仅CUDA API函数调用可能会引发错误。许多CUDA错误是由于内核配置不正确或内核非法内存访问造成的。 – Domi

相关问题