2012-10-29 24 views

回答

3

您可以使用宏来检查错误,因此几乎不需要额外的代码来编写。我已经包括了几个低于功能允许您编写CUDA调用如:

cudaCheck(cudaMalloc(&my_array, 10)); 

,并在调用内核后:

cudaCheckLastError("MyKernel failed"); 

这种方法的好处是,你得到的信息确切地说失败了,你的程序不会试图继续运行。我建议你使用这种方法,因为从长远来看它可以为你节省大量的工作。

关于学术笔记的更多内容,您可以使用异步CUDA调用,然后在最后检查错误。所以,举例来说:

cudaMemcpyAsync(...); 

然后,您可以运行cudaDeviceSynchronize();末,将返回所发生的最新错误(如果发生任何)。

虽然这并不推荐。有关更多信息,请参见CUDA C编程指南4.2中的第3.2.8节“错误检查”。

检查错误的宏。如果有错误,这些都将打印错误和退出程序:

.H:

void __cudaCheck(cudaError err, const char* file, const int line); 
#define cudaCheck(err) __cudaCheck (err, __FILE__, __LINE__) 

void __cudaCheckLastError(const char* errorMessage, const char* file, const int line); 
#define cudaCheckLastError(msg) __cudaCheckLastError (msg, __FILE__, __LINE__) 

的.cpp:

void __cudaCheck(cudaError err, const char *file, const int line) 
{ 
    if(cudaSuccess != err) { 
    fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n", 
     file, line, (int)err, cudaGetErrorString(err)); 
    exit(-1); 
    } 
} 

void __cudaCheckLastError(const char *errorMessage, const char *file, const int line) 
{ 
    cudaError_t err = cudaGetLastError(); 
    if(cudaSuccess != err) { 
    fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n", 
     file, line, errorMessage, (int)err, cudaGetErrorString(err)); 
    exit(-1); 
    } 
} 
相关问题