写点什么

CANN 开发实践:4 个 DVPP 内存问题的典型案例解读

  • 2023-04-19
    广东
  • 本文字数:2079 字

    阅读完需:约 7 分钟

本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾 CANN。


DVPP 是昇腾 AI 处理器内置的图像处理单元,通过 AscendCL 媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括图像编解码、视频编解码、图像抠图缩放等。


由于媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址 128 字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于 DVPP 内存问题的典型案例,并给出原因分析及解决方法:


  1. 使用错误的 DVPP 内存申请接口,导致应用程序报错并退出

  2. 内存大小不符合 DVPP 的要求,导致应用程序报错并退出

  3. DVPP 内存被提前释放,导致视频流解码输出的图像异常

  4. 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 每一帧视频流正常,解码过程无异常(无异常日志),仅输出图片有异常。

可能原因


解码过程无异常,说明送入的视频码流不是异常码流,仅输出被破坏,可能由于:


  • 输出内存被复用、被踩或者被提前释放;

  • 解码需要的输出内存比实际申请的内存大。

处理步骤


  1. 对于 DVPP 内存申请接口,增加日志打印内存大小及地址,检查 VDEC 输出内存,检查申请的内存大小是否与实际使用的一致,比如典型的错误场景,VDEC 解码输出格式预期是 RGB,实际仍按照 YUV420SP 申请内存。

  2. 在 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]昇腾论坛


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
CANN开发实践:4个DVPP内存问题的典型案例解读_人工智能_华为云开发者联盟_InfoQ写作社区