1、问题描述
在项目迭代优化的一个版本里,突然爆出以下问题:
某程序开辟了多个线程,每个线程分别执行模型加载、读离线视频及视频帧模型推理、模型卸载以上操作。
在程序执行了一段时间后,必现地随机报cuda的某个函数执行错误,如cudaMalloc函数执行错误、cudaStreamSynchronize函数执行错误等,并且每次报错的线程也随机,很难定位是具体哪个线程内的代码问题(备注:每个线程对应一个场景任务,其代码都不一样,如人脸检测、异常行为检测等)。

2、问题分析
因为每次报错,报错线程随机(即对应是哪个场景算法随机)、且每次报错具体内容不一样,所以不能通过gdb直接定位出代码问题行,所以正面刚无果。
下面迂回定位问题:
由于之前的版本没问题,那就从当前版本里找做了哪些改动、且是cuda相关的改动(因为每次都是cuda错误)。经过对相关改动代码进行不断注释、运行;再注释、再运行,最后找到问题。
3、最终问题定位与解决
cudaDeviceReset()函数错误调用。
该问题版本里,为了释放cuda资源,在卸载函数里加入了cudaDeviceReset()函数;但是经过细查发现,该函数使用时,会销毁当前进程中当前设备上的所有分配并重置所有状态。
即我的程序进入到卸载接口时,调用cudaDeviceReset函数,销毁了本进程中所有线程在对应GPU设备上的资源分配与状态,所以下一时刻,本不该结束的线程,无论是哪个在使用该GPU设备,统统报错、且是cuda的任一错误!
注释该函数后,问题解决。
4、cuda知识学习
吃了cuda不熟悉的亏,下面摘抄cuda官

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



