cuda错误检查函数
cuda大部分库函数的返回值都是cudaError_t,所以可以用一个函数来接收其他库函数的返回值,从而判断该库函数是否正常执行
这个函数可以用宏来实现
#define CHECK(call) \ do \ { \ const cudaError_t error_code = call; \ if (error_code != cudaSuccess) \ { \ printf("CUDA Error:\n"); \ printf(" File: %s\n", __FILE__); \ printf(" Line: %d\n", __LINE__); \ printf(" Error code: %d\n", error_code); \ printf(" Error text: %s\n", cudaGetErrorString(error_code)); \ exit(1); \ } \ } \ while(0); \
为什么要用do{} while(0);,这是一种宏的常用初始化方法,do的{}何以很好的限定宏里面变量的作用域
为什么要用宏呢,因为CHECK函数要报出错误所在的文件和行号,因此需要用到__FILE__和__LINE__两个宏,如果使用函数的话,就需要把这两个宏作为参数传进去,如下面程序
void check_function(cudaError_t call, const char* file_macro, const int line_macro) { const cudaError_t error_code = call; if (error_code != cudaSuccess) { printf("CUDA Error:\n"); printf(" File: %s\n", file_macro); printf(" Line: %d\n", line_macro); printf(" Error code: %d\n", error_code); printf(" Error text: %s\n", cudaGetErrorString(error_code)); exit(1); } } // call function check_function(cudaFree(d_x), __FILE__, __LINE__);
这样传参很不方便,所以还有另一种写法,把宏和普通函数结合起来,在上面check_function的外面再嵌套一层宏,可读性更好
#define CHECK(err) (check_function(err, __FILE__, __LINE__))
无情的摸鱼机器