关于错误使用cudaDeviceReset()函数,导致多线程下cuda错误、进程崩溃的问题

1、问题描述

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

2、问题分析

因为每次报错,报错线程随机(即对应是哪个场景算法随机)、且每次报错具体内容不一样,所以不能通过gdb直接定位出代码问题行,所以正面刚无果。
下面迂回定位问题:
由于之前的版本没问题,那就从当前版本里找做了哪些改动、且是cuda相关的改动(因为每次都是cuda错误)。经过对相关改动代码进行不断注释、运行;再注释、再运行,最后找到问题。

3、最终问题定位与解决

cudaDeviceReset()函数错误调用。
该问题版本里,为了释放cuda资源,在卸载函数里加入了cudaDeviceReset()函数;但是经过细查发现,该函数使用时,会销毁当前进程中当前设备上的所有分配并重置所有状态
即我的程序进入到卸载接口时,调用cudaDeviceReset函数,销毁了本进程中所有线程在对应GPU设备上的资源分配与状态,所以下一时刻,本不该结束的线程,无论是哪个在使用该GPU设备,统统报错、且是cuda的任一错误!
注释该函数后,问题解决。

4、cuda知识学习

吃了cuda不熟悉的亏,下面摘抄cuda官

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值