深度学习部署(十九): CUDA RunTime API_error
创始人
2025-05-31 03:54:00

知识点

  1. 若cuda核函数出错,由于他是异步的,立即执行cudaPeekAtLastError只会拿到对输入参数校验是否正确的状态,而不会拿到核函数是否执行正确的状态
  2. 因此需要等待核函数执行完毕后,才真的知道当前核函数是否出错,一般通过设备同步或者流同步进行等待
  3. 错误分为可恢复和不可恢复两种:
    • 可恢复:
      • 参数配置错误等,例如block越界(一般最大值是1024),shared memory大小超出范围(一般是48KB)
      • 通过cudaGetLastError可以获取错误代码,同时把当前状态恢复为success
      • 该错误在调用核函数后可以立即通过cudaGetLastError/cudaPeekAtLastError拿到
      • 该错误在下一个函数调用的时候会覆盖
    • 不可恢复:
      • 核函数执行错误,例如访问越界等等异常
      • 该错误则会传递到之后的所有cuda操作上
      • 错误状态通常需要等到核函数执行完毕才能够拿到,也就是有可能在后续的任何流程中突然异常(因为是异步的)

可恢复错误代码


#include 
#include 
#include 
using namespace std;__global__ void func(float* ptr){int pos = blockIdx.x * blockDim.x + threadIdx.x;if(pos == 999){ptr[999] = 5;}
}int main(){float* ptr = nullptr;cudaMalloc(&ptr, sizeof(float) * 1000);  // 为指针分配内存// 因为核函数是异步的,因此不会立即检查到他是否存在异常// func<<<100, 10>>>(ptr);func<<<100, 1050>>>(ptr);auto code1 = cudaPeekAtLastError();cout << cudaGetErrorString(code1) << endl;// 对当前设备的核函数进行同步,等待执行完毕,可以发现过程是否存在异常auto code2 = cudaDeviceSynchronize();cout << cudaGetErrorString(code2) << endl;// 异常会一直存在,以至于后续的函数都会失败float* new_ptr = nullptr;auto code3 = cudaMalloc(&new_ptr, 100);cout << cudaGetErrorString(code3) << endl;return 0;
}

输出:

invalid configuration argument
no error
no error

不可回复错误代码: 一般是指针, 除0这种错误

cudaDeviceSynchronize()函数会同步等待设备完成之前的所有任务并检查是否有错误发生,如果有错误会返回相应的错误码。所以使用cudaDeviceSynchronize()函数可以及时发现是否有错误发生,进而打印出错误信息。


#include 
#include 
#include 
using namespace std;__global__ void func(float* ptr){int pos = blockIdx.x * blockDim.x + threadIdx.x;if(pos == 999){ptr[999] = 5;}
}int main(){float* ptr = nullptr;// cudaMalloc(&ptr, sizeof(float) * 1000);  // 为指针分配内存// 因为核函数是异步的,因此不会立即检查到他是否存在异常func<<<100, 10>>>(ptr);// func<<<100, 1050>>>(ptr);auto code1 = cudaPeekAtLastError();cout << cudaGetErrorString(code1) << endl;// 对当前设备的核函数进行同步,等待执行完毕,可以发现过程是否存在异常auto code2 = cudaDeviceSynchronize();cout << cudaGetErrorString(code2) << endl;// 异常会一直存在,以至于后续的函数都会失败float* new_ptr = nullptr;auto code3 = cudaMalloc(&new_ptr, 100);cout << cudaGetErrorString(code3) << endl;return 0;
}

输出

no error
an illegal memory access was encountered
an illegal memory access was encountered

相关内容

热门资讯

注意!下周上班时间有变   2026年元旦假期  快要到了  大家有没有出游计划呢?  需要注意的是  下周上班时间有变! ...
西安一电梯井发生1人死亡事件,...   西安“今日雁塔”发布情况通报:12月27日10时50分许,长延堡街道紫郡长安小区一处电梯井发生一...
IPO周报:新增受理27单IP... 年末IPO掀起受理高潮,12月22日~12月28日当周(下同),沪深北交易所新增受理27单IPO申请...
小米集团:林斌计划每12个月出... 新京报贝壳财经讯 小米集团公告,公司联合创始人、执行董事、副董事长林斌计划自2026年12月开始,每...
一条“斩杀线”,击碎“美国梦” 近期,一个本属于游戏世界的词汇——“斩杀线”,正成为解读美国社会现状的关键词,引发网友广泛热议。 在...