CUDA 错误检查:cudaGetLastError + cudaDeviceSynchronize
新手最容易踩的坑集中营一、为什么这一节格外重要,很多新手不当回事CUDA代码写错了,很多时候不会像CPU代码那样直接崩溃报错, 而是"看起来正常跑完了,但结果不对",或者干脆"什么都没发生, 数组里全是初始值"。 原因和前面已经学过的两个特性直接相关: kernel启动是异步的("Hello World级别"那节讲过) Host代码不会主动帮你检查Device那边发生了什么错误 如果不主动去检查,一个kernel内部访问越界了、 一个cudaMalloc失败了,程序表面上会继续往下跑, 错误被"吞掉"了,直到很久之后某个地方结果不对, 才会发现问题——但那时候已经很难定位到底是哪一步出的错。 养成"每一个CUDA调用都检查返回值"的习惯, 是CUDA编程里跟"写对kernel逻辑"同等重要的基本功。二、基础认知:几乎所有CUDA Runtime API调用都有返回值2.1cudaError_t前面几节笔记里出现过的cudaMalloc、cudaMemcpy、cudaFree等函数, 返回值类型都是 cudaError_t —— 这是一个枚举类型, 用来表示这次调用是否成功,以及如果失败具体是什么原因。 调用成功时,返回值是 cudaSuccess 调用失败时,返回值是其他各种具体的错误枚举值 (比如显存不足、非法内存访问、无效的启动配置等等, 具体错误类型很多,不需要背,遇到了通过下面的 cudaGetErrorString转成文字看就知道是什么问题)2.2cudaGetErrorStri