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__))

 

posted @ 2023-03-07 17:38  Wangtn  阅读(236)  评论(0编辑  收藏  举报