cudaGetErrorString与cudaGetLastError组合运用

cudaGetErrorString与cudaGetLastError组合运用

前言

在利用集成开发环境(如:visual studio)编写CUDA代码时,编译时是分开编译的,CUDA部分用的是nvcc编译器,这样VS就无法反馈我们CUDA代码的错误,有时候造成了不可避免的内存泄露或者程序出错,自己都不知道,只能一个断点一个断点调试。因此,CUDA也提供了一些函数可以捕捉到error,让我们Debug的时候更方便一点。

cudaGetLastError

通过翻阅CUDA手册,我们可知宿主线程维护着一个初始化为cudaSuccess的cudaError_t类型变量,但出现错误时,该变量都会被错误代码替换。在调用cudaGetLastError()时,就会返回此变量,并将其置为cudaSucess。即返回的是cudaGetLastError()上面代码的错误。
也就是cudaGetLastError可以返回一个变量,该变量存储的是错误代码的信息

cudaGetErrorString

__host__​__device__​const char* 	cudaGetErrorString ( cudaError_t error )

该函数的参数为一个存储错误代码的cudaError_t变量,返回的是该变量对应的错误信息,以字符串的形式接收。

使用方法

1、用于有不需要同步的runtime Api
cudaMalloc(...)
printf("cudaMalloc function : %s\n",cudaGetErrorString(cudaGetLastError()));

这样就可查看cudaMalloc函数是否运行成功。
其实每个runtime API函数都有一个cudaError_t的返回值,我们可以直接将其与cudaSuccess比较即可,可以自己实现一个简单的检查错误。有一些runtime API会自己报错,无需我们检查。

2、用于查找核函数是否有错误(主要功能,CUDA手册介绍的)

核函数不会也不能返回任何错误代码,所以我们必须在核函数启动之后调用cudaGetLastError来检索核函数是否启动成功。同时,我们也还需在核函数启动之前也调用cudaGetLastError来确保启动前的错误变量为cudaSuccess,排除核函数以外的错误信息。
** 由于核函数的启动是异步的,所以需要在启动之后和调用cudaGetLastError之间进行同步 **,否则将无法得到正确的信息。
例如:

printf("befor kernel function : %s\n",cudaGetErrorString(cudaGetLastError()));
kernelfunction<< <...,...> >>();
cudaDeviceSynchronize();//这个同步不能省略
printf("after kernel function : %s\n",cudaGetErrorString(cudaGetLastError()));

这样我们就可以判断核函数启动是否成功了。

3、用于查找其它库的函数是否有错误

当运用到其它库时,也可以使用此方法知道该函数是否运行成功,使用方法和runtime API一样。但是无法准确知道到底时什么错误原因。最好还是用该库对应的错误变量,然后比对该类型的枚举代表的是什么意思。
例如:cublas库的函数返回的变量为cublasStatus_t类型,是个枚举类型。

typedef enum{
    CUBLAS_STATUS_SUCCESS         =0,
    CUBLAS_STATUS_NOT_INITIALIZED =1,
    CUBLAS_STATUS_ALLOC_FAILED    =3,
    CUBLAS_STATUS_INVALID_VALUE   =7,
    CUBLAS_STATUS_ARCH_MISMATCH   =8,
    CUBLAS_STATUS_MAPPING_ERROR   =11,
    CUBLAS_STATUS_EXECUTION_FAILED=13,
    CUBLAS_STATUS_INTERNAL_ERROR  =14,
    CUBLAS_STATUS_NOT_SUPPORTED   =15,
    CUBLAS_STATUS_LICENSE_ERROR   =16
} cublasStatus_t;

通过这个来比对,具体的错误是什么。然后想知道字面上是代表是什么含义的话,可以翻阅CUDA手册。

最后(优化)

如果在大项目里面使用该方法Debug,无疑是很冗长的,所以需要我们对其进行优化。我们可以将其写成宏定义,抽象出其中重复的部分,写成一个宏,然后再封装成一个比较简洁的宏,这样代码就清晰许多。
我们知道这些调试代码会对程序的运行速度大打折扣,所以当发布release版本时,可以将其去掉。这个操作可以用到预编译去完成,我们只需要在Debug模式下调试即可。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是由于TensorFlow无法找到与CUDA相关的符号引起的。可能的原因是CUDA版本与TensorFlow版本不兼容,或者CUDA相关的库文件没有正确安装或配置。 解决此问题的步骤包括: 1. 检查CUDA版本是否与TensorFlow版本兼容。可以在TensorFlow官方网站上查看TensorFlow版本的要求。 2. 检查CUDA相关的库文件是否正确安装或配置。可以参考CUDA的官方文档进行配置。 3. 如果上述步骤没有解决问题,可以尝试重新安装TensorFlow和相关的CUDA库文件。 ### 回答2: TensorFlow是一个非常流行的机器学习框架,它在深度学习领域非常受欢迎。然而,在使用TensorFlow进行编程的过程中,可能会遇到一些错误。其中一个常见的错误是:tensorflow.python.framework.errors_impl.internalerror: cudagetdevice() failed. status: cudageterrorstring symbol not found. 这个错误通常是由于CUDA驱动程序没有正确安装而导致的。CUDA是一个并行计算平台和编程模型,它允许TensorFlow使用GPU来加速运算。因此,在运行TensorFlow时,需要先安装正确的CUDA驱动程序。 如果你使用的是Nvidia GPU,那么可以前往Nvidia官方网站下载并安装最新的CUDA驱动程序。同时,也需要安装相应版本的cuDNN库。 如果你已经安装了正确的CUDA驱动程序和cuDNN库,但仍然遇到了这个错误,那么可能是由于CUDA的环境变量没有正确设置。在Linux或者Mac系统中,可以在.bashrc或者.bash_profile文件中添加如下环境变量: export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH} export CUDA_HOME=/usr/local/cuda 这将设置CUDA的库路径和安装路径。 如果你使用的是Windows系统,可以在系统属性中设置环境变量: 系统属性 -> 高级系统设置 -> 环境变量 -> 新建 在新建环境变量界面中设置如下环境变量: 变量名: LD_LIBRARY_PATH 变量值: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 变量名: CUDA_HOME 变量值: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 以上是解决此错误的几种方法,希望对你有帮助。总之,要正确使用TensorFlow,需要正确安装相应的CUDA驱动程序和cuDNN库,并设置相应的环境变量。 ### 回答3: TensorFlow是一个开源的机器学习框架,可用于创建深度学习模型。然而,用户在使用TensorFlow过程中,可能遇到这样的错误信息:tensorflow.python.framework.errors_impl.internalerror: cudagetdevice() failed. status: cudageterrorstring symbol not found.。 这个错误通常是由于CUDA库未正确配置引起的。CUDA是用于在GPU上运行计算的并行计算平台和编程模型。TensorFlow使用CUDA来优化深度学习模型的训练和预测过程。因此,必须正确配置CUDA才能使用TensorFlow。 下面是一些可能导致该问题的原因和解决方法: 1.缺少或不正确安装CUDA库。请确认已正确安装CUDA,以及将路径添加到系统环境变量中。可以尝试重新安装CUDA或查看CUDA版本是否与TensorFlow版本相兼容。 2.CUDA版本不兼容。TensorFlow可能不支持您所使用的CUDA版本。请确保您使用的CUDA版本与TensorFlow版本兼容。 3.显卡驱动未安装或不正确安装。请尝试重新安装并更新显卡驱动。 4.其他软件或驱动的冲突。某些软件或驱动可能会与CUDA发生冲突。可以尝试禁用或卸载可能会影响CUDA的软件或驱动。 总之,要解决这个错误,必须正确配置CUDA以及与之相关的软件和驱动。如果无法解决问题,请参考TensorFlow官方文档或从社区论坛寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值