合理设置队列深度,减少硬件资源浪费,提升性能
合理选择VDEC视频解码输出格式和分辨率,性能更优
背景说明
如果用户需要借助DVPP进行视频解码,想要得到RGB格式图片,当前视频解码接口hi_mpi_vdec_send_stream支持输出YUV420SP格式或RGB888格式,且支持在解码时对图片进行缩放,所以从提升性能的角度,可以优化代码逻辑,直接调用视频解码接口hi_mpi_vdec_send_stream输出RGB888格式。
图1 VDEC解码输出的组合场景

基本原理
视频解码接口hi_mpi_vdec_send_stream支持输出YUV420SP格式或RGB888格式,可设置接口参数输出不同的格式,省去调用hi_mpi_vpc_convert_color进行格式转换的步骤,减少接口调用。
若视频码流分辨率与模型输入图片的分辨率不一致,需要对解码后的图片进行缩放处理,也可以在视频解码接口hi_mpi_vdec_send_stream中设置输出图片的分辨率,在解码的同时完成图片的缩放,省去单独调用缩放接口的步骤,减少接口调用。
总结下来,可以在视频解码接口hi_mpi_vdec_send_stream中完成解码+缩放+色域转换三个功能,减少调用接口的数量,提升性能。
使用示例
视频解码的示例代码请单击Link获取。
父主题: 使用媒体数据处理V2版本接口
合理使用VDEC解码跳帧,减少内存申请,减轻VPC压力,性能更优
背景说明
在视频解码+模型推理的场景下,若视频的帧数比较多,且不是每一帧都需要进行推理,对于不需要推理的帧,推荐用户在调用hi_mpi_vdec_send_stream接口解码时设置当前帧输出不显示,不输出解码结果。
基本原理
视频解码是需要连续的数据,解码后的数据需要输出YUV格式,则每帧数据解码后,VDEC内部还需要通过VPC进行解压缩、缩放、格式转换的流程。
如果不想获取某一帧的解码结果, 在调用hi_mpi_vdec_send_stream接口解码时设置当前帧输出不显示,这样,就不需要申请输出内存,且VDEC内部也不通过VPC模块进行解压缩、缩放、格式转换的流程。减少内存申请,也减轻了VPC的处理压力,达到提升性能的目标。
使用说明
请参见hi_mpi_vdec_send_stream接口的hi_vdec_stream结构体内的need_display参数说明。
父主题: 使用媒体数据处理V2版本接口
VPC处理时合理选择输出格式,降低内存申请,性能更优
在Atlas 200/500 A2推理产品上,VPC图像处理功能支持输出YUV400格式(灰度图像),如果模型推理的输入图像是灰度图像,就直接使用VPC功能,无需再使用AIPP色域转换功能。
基本原理
在Atlas 200/500 A2推理产品上,直接使用VPC功能输出YUV400格式(灰度图像),省去使用AIPP色域转换功能,降低AI Core单元的负载,从硬件上提升性能。
使用说明
关于VPC功能的示例代码,请参见VPC图片处理典型功能。
父主题: 使用媒体数据处理V2版本接口
合理设置队列深度,减少硬件资源浪费,提升性能
背景说明
可使用媒体数据处理V2版本接口,配置VPC队列深度,队列深度范围[10,350]之间。用户业务下发任务时,若VPC队列满后,会反压阻塞任务下发,影响性能。
基本原理
适当加大VPC队列深度,可以缓解用户业务下发任务与VPC内部任务处理相互之间性能波动的影响。
- 如果用户短时间内下发任务多于VPC通道处理速度,则多出来的任务会缓存在队列中,不会阻塞用户继续下发任务;
- 如果短时间内用户下发任务较少,则VPC可以处理队列中缓存的任务,不会造成空闲,导致硬件资源浪费。
用户可基于业务下发任务的速度与VPC单通道处理的性能适当调整队列任务深度:
- 用户业务创建一个通道,起多个线程往同一通道下发任务,且下发任务数超过上面单通道参考性能,则建议用户将队列深度设大;
- 用户业务创建一个通道,只有一个线程往该通道下发任务,且为下发一次任务,获取一次结果,串行执行。该情况通道任务不会堆积,不必设大,保持默认即可。
:::note 说明 VPC单通道处理的性能,请参见性能指标说明。 :::
使用说明
调用hi_mpi_vpc_create_chn接口或hi_mpi_vpc_sys_create_chn接口创建VPC通道时,通过hi_vpc_chn_attr结构体内的attr参数设置队列深度。
关于VPC队列深度设置示例代码,参见sample_vpc.cpp中queue_len参数。
父主题: 使用媒体数据处理V2版本接口
调用错误的内存申请接口,导致内存地址校验出错
现象描述
日志报错如下:
device 0, vpc address is illegal, please make sure it has been allocated with hi_mpi_dvpp_malloc or acldvppMalloc.
可能原因
根据日志提示,是由于没有使用指定的接口申请内存。
处理步骤
检查代码,是否使用媒体数据处理V1版本中的acldvppMalloc接口/媒体数据处理V2版本中的hi_mpi_dvpp_malloc接口申请存放VPC输入或输出数据的内存。
父主题: VPC图片处理
使用正确的内存申请接口,但内存大小传值错误
现象描述
-
日志1
buffer size(3110400) is smaller than need buffer size(4147200) when format is 3. -
日志2
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.
可能原因
-
代码中申请的内存大小小于该格式所需的输入或输出内存大小;
-
VPC任务接口传入的buffer size正常,与输入格式匹配,但是超出了实际申请的内存长度,所以校验出来结束地址非法。
处理步骤
-
检查代码,根据图片格式、宽高对齐、内存约束中的说明,检查对应格式的内存大小要求;
-
在代码中增加打印内存长度的日志,检查VPC任务接口传入的buffer size是否与实际申请的内存长度一致。
父主题: VPC图片处理
读/写内存地址无效,导致异常中断
现象描述
Device侧内核态日志报错VPC异常:
-
日志1:
vpc get err int: vpc_cvdr_axi_rd_resp_err -
日志2:
vpc get err int: vpc_cvdr_axi_wr_resp_err
可能原因
- cvdr_axi_rd_resp_err表示读地址越界,可能申请的输入内存太小或内存地址无效,昇腾AI处理器执行读操作时访问到了无效地址。
- cvdr_axi_wr_resp_err表示写地址越界,可能申请的输出内存太小或内存地址无效,昇腾AI处理器执行写操作时访问到了无效地址。
处理步骤
-
在申请DVPP内存的接口处、以及在VPC异常任务接口处增加日志打印,检查申请的输入\输出内存大小与实际使用的输入\输出内存大小是否一致;
-
在释放DVPP内存的接口处增加打印日志,检查VPC任务完成之前是否存在内存被提前释放的情况。
父主题: VPC图片处理
在线提单