CANN开发实践:4个DVPP内存问题的典型案例解读
摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。
本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。
DVPP是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括图像编解码、视频编解码、图像抠图缩放等。
由于媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法:
- 使用错误的DVPP内存申请接口,导致应用程序报错并退出
- 内存大小不符合DVPP的要求,导致应用程序报错并退出
- DVPP内存被提前释放,导致视频流解码输出的图像异常
- DVPP读/写内存地址无效,导致应用程序异常中断
01 使用错误的DVPP内存申请接口,导致应用程序报错并退出
现象描述
从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,日志中的报错示例如下:
device:0 chn 0, input buffer is invalid, make sure it has been allocated with hi_mpi_dvpp_malloc or acldvppMalloc.
device:0 chn 0, output buffer is invalid, make sure it has been allocated with hi_mpi_dvpp_malloc or acldvppMalloc.
可能原因
根据日志提示,是因为没有使用指定的接口申请内存,导致内存地址校验出错。
由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,如下:
- 调用媒体数据处理V1版本的接口对图片进行抠图、缩放等操作时,调用acldvppMalloc接口申请内存。
- 调用媒体数据处理V2版本的接口对图片进行抠图、缩放等操作时,调用hi_mpi_dvpp_malloc接口申请内存。
处理步骤
检查代码,确认在DVPP媒体数据处理的各功能中,是否使用acldvppMalloc接口/ hi_mpi_dvpp_malloc接口申请存放输入或输出数据的Device内存。
但需注意:
- 可将DVPP媒体数据处理的输出作为模型推理的输入,从性能角度,减少拷贝,实现内存复用。
- 由于DVPP媒体数据处理访问的专用地址空间有限,为确保媒体数据处理时内存足够,除媒体数据处理功能外,其它使用Device内存的功能,建议调用aclrtMalloc接口申请内存。
02 内存大小不符合DVPP的要求,导致应用程序报错并退出
现象描述
从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,日志中的报错示例如下:
buffer size(3110400) is smaller than need buffer size(4147200) when format is 3.
device 0, vpc end address is illegal, check allocated buffer size: configured buffer size: 3110400, current pic: format 3 width_stride 1920 height_stride 1080.
可能原因
虽然使用了正确的DVPP内存申请接口,但:
- 代码中申请的内存大小小于该格式所需的输入或输出内存大小;
- 或者传入接口的内存大小正常,与输入格式也匹配,但是超出了实际申请的内存大小,所以校验出来结束地址非法。
处理步骤
1. 进入昇腾文档中心(https://www.hiascend.com/zh/document),拖动到“推理”区域,通过API参考进入最新版本的文档(或者可以在左上方选择需要的版本),在媒体数据处理章节,根据DVPP各功能对内存大小的要求,检查代码中对应格式的内存大小是否正确;
2. 在代码中增加打印内存长度的日志,检查传入接口的内存大小是否与实际申请的内存大小一致。
03 DVPP内存被提前释放,导致视频流解码输出的图像异常
现象描述
原始H264/H265每一帧视频流正常,解码过程无异常(无异常日志),仅输出图片有异常。
可能原因
解码过程无异常,说明送入的视频码流不是异常码流,仅输出被破坏,可能由于:
- 输出内存被复用、被踩或者被提前释放;
- 解码需要的输出内存比实际申请的内存大。
处理步骤
- 对于DVPP内存申请接口,增加日志打印内存大小及地址,检查VDEC输出内存,检查申请的内存大小是否与实际使用的一致,比如典型的错误场景,VDEC解码输出格式预期是RGB,实际仍按照YUV420SP申请内存。
- 在DVPP内存释放接口处、以及hi_mpi_vdec_get_frame/aclvdecCallback/acldvppJpegDecodeAsync接口处,增加内存大小及地址的打印日志,确认内存释放时序,是否存在内存地址解码完成前被提前释放的情况。
04 DVPP读/写内存地址无效,导致应用程序异常中断
现象描述
从日志存放路径(默认为“$HOME/ascend/log”)下获取运行应用程序的日志,Device侧内核态日志报错图像处理模块异常,报错示例如下:
vpc get err int: vpc_cvdr_axi_rd_resp_err
vpc get err int: vpc_cvdr_axi_wr_resp_err
可能原因
- cvdr_axi_rd_resp_err:表示读地址越界,可能申请的输入内存太小或内存地址无效,昇腾AI处理器执行读操作时访问到了无效地址。
- cvdr_axi_wr_resp_err:表示写地址越界,可能申请的输出内存太小或内存地址无效,昇腾AI处理器执行写操作时访问到了无效地址。
处理步骤
1. 在申请DVPP内存的接口处、以及在异常任务接口处增加日志打印,检查申请的输入\输出内存大小与实际使用的输入\输出内存大小是否一致;
2. 在释放DVPP内存的接口处增加打印日志,检查任务完成之前是否存在内存被提前释放的情况。
05 更多介绍
[1]昇腾文档中心
[2]昇腾社区在线课程
[3]昇腾论坛

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GIMP 的 GTK3 移植已正式完成
GIMP 维护者 ZeMarmot 表示 GIMP 的 GTK3 移植工作已正式完成。除了一些不推荐使用的 API 没有移植,不会再有重大任务。 GIMP 3.0 的路线图也已将该任务的进度情况更新为“已完成”。其他完成的工作包括移植到 Meson 构建系统、 intltool 使用和多层选择。 GIMP 3.0 仍在积极开发的任务包括重新设计脚本/插件 API、Wayland 支持和 space invasion。 目前看来,虽然 GIMP 的 Wayland 支持仍不稳定,但在去年改进了不少。 按照计划,GIMP 3 会在 2023 年推出 —— 至少会发布一个 RC 候选版。从目前的进度来看,GIMP 3 应该会如约发布。
- 下一篇
10分钟带你徒手做个Java线程池
摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理。 本文分享自华为云社区《放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧》,作者:冰 河。 Java线程池核心原理 看过Java线程池源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,而在ThreadPoolExecutor类中最核心的构造方法就是带有7个参数的构造方法,如下所示。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 各参数的含义如下所示。 corePoolSize:线程池中的常驻核心线程数。 maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程