[cuda 技术总结2] cuda错误返回值

cuda错误返回值

  • 1.checkCudaErrors
  • 2.自定义头文件
  • 3.bug及解决方法汇总
    • 3.1 `Error text: invalid argument`
  • 参考文献

错误返回值对快速确认出错代码,很有帮助。

这里总结下笔者使用过的方法。

1.checkCudaErrors

可以调用helper_cuda.h中的checkCudaErrors函数,这个库文件可以从官方github NVIDIA/cuda-samples下载。

使用方法非常简单:

  • 调用头文件
  #include 
  • 使用函数
//cuda自带函数, 如检查cudaMalloc过程有无错误:
checkCudaErrors(cudaMalloc((void**)&var_d, mem));

//对于自定义的kernel核函数,可以通过如下方式来获得返回值:
checkCudaErrors(cudaGetLastError(););

2.自定义头文件

将返回值错误检测封装成库文件error.cuh

//用error.cuh 进行文件封装
#pragma once
#include 
 
#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)

以上代码来自【CUDA线上训练营】。

除了需要创建头文件之外,其使用和几乎一致:

//cuda自带函数
CHECK(cudaMalloc((void**)&var_d, mem));

//对于自定义的cuda核函数,可在其后语句中添加上:
CHECK(cudaGetLastError());

3.bug及解决方法汇总

3.1 Error text: invalid argument

使用CHECK(cudaGetLastError())显示bug如下:

Error code: 1
Error text: invalid argument

出问题代码如下:

float* result = (float*)malloc(mem);
....
....
cudaFreeHost(result);

即开辟空间的时候没有使用cuda api,而释放的时候却使用了。

修改为:

float* result = (float*)malloc(mem);
....
....
free(result);

参考文献

[1] github NVIDIA/cuda-samples
[2] 1.5.CUDA函数返回值检查
[3] GPU编程 CUDA C++ 运行时错误检测Debug专用 宏函数 CHECK
[4] CUDA-Programming/src/04-error-check/error.cuh

你可能感兴趣的:(cuda开发,cuda)