昇腾学院 | 案例分享 VPC批量处理图片失败问题
问题现象描述
问题现象:在C30B890版本,人脸识别业务中批量处理图片,处理一定数量图片后出现异常现象,如下图所示,处理37486张图片后senddata时延过大:
Device端异常日志如下:
关键过程、根本原因分析
关键过程:
1、host端使用HIAI_DMalloc申请内存分别加载一个图片库的图片,进行批量处理。
2、使用高速序列化函数进行跨侧传输图片数据,解码和缩放功能的输入内存都是由框架自动申请,缩放功能的输出内存使用HIAI_DVPP_DMalloc申请内存。
3、批量处理一些图片后出现异常,图片无法正常进行解码,日志显示“Cannot allocate memory”。
4、通过检视代码,HIAI_DVPP_DMalloc申请的内存未进行正确释放,需要在析构函数里面添加HIAI_DVPP_DFree。
5、修改代码后,重新编译运行,发现VPC的缩放功能失效,日志显示“fail_count<(15)”。
6、通过日志信息定位原因,前期调试多次输入参数或地址异常,触发硬件保护机制,隔离了VPC功能,需要重启解决。
根本原因分析:
1、出现“Cannot allocate memory”异常日志,主要是HIAI_DVPP_DMalloc申请的内存没有正确释放。
2、出现“fail_count<(15)”异常日志,主要是在调试代码的时候,多次输入参数或地址异常,触发了硬件保护机制。
结论、解决方案及效果
结论:
1、HIAI_DVPP_MAlloc使用智能指针存放申请的内存地址,必须指定析构器为HIAI_DVPP_DFree或HIAIMemory::HIAI_DVPP_DFree。
2、调试多次输入参数或地址异常,触发硬件保护机制,这个需要重启就可以解决。
解决方案:
经验总结、预防措施和规范建议
如果调用HIAI_DVPP_MAlloc或HIAIMemory::HIAI_DVPP_DMalloc接口申请内存,用于Device到Host的数据传输时,由于HIAI_DVPP_MAlloc或HIAIMemory::HIAI_DVPP_DMalloc没有自动释放标签,所以一定需要调用HIAI_DVPP_DFree或HIAIMemory::HIAI_DVPP_DFree接口手动释放内存。如果使用智能指针存放申请的内存地址,必须指定析构器为HIAI_DVPP_DFree或者HIAIMemory::HIAI_DVPP_DFree。
- 点赞
- 收藏
- 关注作者
评论(0)