写代码调试过程中遇到这样的错误:

invalid argument, code = cudaErrorInvalidValue [ 1 ] in file src/streampetr/normalization.cu:279

       而且这个错误比较怪异,normalization.cu:279行确实在调用CUDA的核函数,因为这个核函数会被循环调用,调用第一遍时没报错,调用第二遍时报这个错误导致程序崩溃,开始还以为真的是传入核函数的那个参数的值或者GPU内存分配不正确导致了这样的错误,费了大把劲确认了每个参数都没问题,但是就是每次执行第二遍时报这个错误,我就怀疑是其他地方有非法访问把CUDA的GPU内存搞坏了,导致这个核函数执行时访问CPU内存报错,既然是第二遍执行时报错,那大概率应该是这个核函数调用之后的其他访问CUDA内存的代码没写好把CUDA内存搞坏了,于是把后面的代码都注释掉,错误就消失了,这个出错的核函数可以循环调用了,说明出错的原因就是后面有代码把CUDA内存弄脏了

     于是一步步把后面代码逐步排除定位找到写得有bug的地方(出错的地方是定义一个nvinfer1::Dims变量ego_pose,在定义时赋值漏了给nbDims赋值

   nvinfer1::Dims ego_pose {1,4,4} 

应该写成:

   nvinfer1::Dims ego_pose {3,1,4,4} 

这里的错误导致分配CUDA内存的大小不对,导致后面给这块CUDA内存拷贝赋值时发生了越界访问从而把CUDA内存搞脏了,然后错误就发生在前面那个核函数调用的地方。CUDA内存弄脏后再访问CUDA内存会出错,但是报的错一般是让你根本无法看出准确原因的,出现莫名其妙的错误时,可能需要整个排查而不是只盯着出错处查,否则可能折腾很久浪费时间还是不知道原因在哪里。有时忘了这个经验浪费不少时间,记录一下备忘。

Logo

欢迎来到由智源人工智能研究院发起的Triton中文社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐