2013-11-28 39 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

相關問題