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__))
无情的摸鱼机器