跳转至

DDR 小型化指南

前言

概述

本文为进行小型化开发的程序员而写,目的是介绍在单板上进行Linux开发、裁剪、优化及使用注意事项等内容。

读者对象

本文档(本指南)主要适用于以下工程师:

  • 技术支持工程师
  • 软件开发工程师

修改记录

文档版本 发布日期 修改说明
00B01 2025-09-15 第1次临时版本发布。

综述

DDR小型化可以从多个方向入手:uboot、kernel、filesys、SDK、APP都可以在内存使用上做一定程度的优化。本文主要是对SDK和APP的小型化进行简单的说明。

系统小型化基于DEMO单板实现,以容量为2G Bytes的DDR内存为例。

图 1 DEMO板中Linux系统内存分配图(仅供参考)

客户业务的具体内存占用,需结合具体场景进行分析,下文介绍各模块MMZ内存占用及小型化可优化手段。

主要模块工作占用MMZ情况

一般业务中MMZ的占用往往是内存消耗的很大一部分,本章节主要介绍一般业务场景中几个主要模块工作时占用MMZ的情况。

VI

VI采集状态下最多会占用三个视频帧VB。一个用于当前帧采集,一个用于准备给下一帧采集,一个在轮转流程中(主要是后级模块占用)。

Hi3403V100中 MMZ占用:

  • vi(%d)_model_%d:每路pipe需占用两个一定大小模板MMZ内存,大小与通路宽度相关,宽度小于等于4096时大小为16KB。
  • vi(%d)_lmf:每路pipe开启LMF功能时占用MMZ内存,用于存放LMF的系数,固定值4K。
  • vi(%d)_bnr_mot:每路pipe开启Bayer NR功能时需要占用的motion buffer内存,大小由处理图像大小的宽高决定。
  • vi(0)_bnr_rnt:每路pipe开启Bayer NR功能时需要占用的rnt内存,大小由处理图像大小的宽高决定;离线时个数由ss_mpi_vi_set_pipe_bnr_buf_num。
  • 接口设置,默认为40块。
  • vi(0)_bnr_ref%d:每路pipe开启Bayer NR功能时需要占用的时域参考内存,大小由处理图像大小的宽高决定。

VDEC

VDEC MMZ占用分为buffer占用、轮转占用和设备占用。

Buffer占用

  • vdec(%d)_stream:解码码流Buffer相关内存,为用户指定大小和驱动内部分配之和。
  • vfmw(%d)_usd_buf:用户数据Buffer内存,大小根据用户指定的进行分配。
  • vdec(%d)_adp_ref:用于存储通道使用vb的相关信息。
  • vdec(%d)_adp_event:用于存储解码过程中产生的event信息。
  • vfmw(%d)_shr_img:用于存储解码出图像的相关信息。
  • vdec_adp_proc:用于存储mdc侧vdec产生的proc信息。
  • vfmw_mdc_shr:用于存储mdc侧vfmw产生的proc信息。

设备占用

  • vfmw(%d)_seg_buf:SCD切码流后存放内存,与分辨率相关,与协议无关。
  • vfmw_scd_msg:SCD逻辑工作时需要的内存,固定值为44Kbytes。
  • vfmw(%d)_vdh_msg:VDH逻辑工作时需要的内存,与模块参数中设置最大slice个数相关,默认模块参数(slice 600个)时大小为616KBytes。
  • vfmw_vdh_ext:VDH逻辑工作时需要的内存,与模块参数中设置的最大宽高相关。
  • vfmw_mdma_msg:VDH逻辑工作时需要的内存,固定值44KBytes。

轮转占用

  • vdec(%d)_pic_vb:vb大小和个数都由用户配置。私有vb模式下,大小根据用户配置通道属性中frame_buf_size确定,个数根据用户配置通道属性中frame_buf_cnt确定。
  • vdec(%d)_tmv_vb:vb大小和个数都由用户配置。私有vb模式下,大小根据用户配置通道属性中tmv_buf_size确定,个数为 “参考帧+1”,其中参考帧个数根据用户配置通道属性中ref_frame_num确定。

VPSS

  • vb_pool: Group占用两块VB (前级模块送来:当前工作VB+Backup 帧),每个使能通道会获取通道大小的VB(通道模式为Auto时,为后端模块获取),硬件处理完成后会发送到后端绑定模块。如果需要做旋转/二级缩放功能,还需申请中间的临时VB(公共VB)。
  • vpss(%d)_src:每组需占用亮度和MMZ内存资源,约4K大小。
  • vpss(%d)_dci:每组开启DCI功能时占用MMZ内存,约4K大小。
  • vpss(%d)_model:每组需占用一定大小模板MMZ内存。大小与模块参数中的split_node_num以及组的max_width有关。split_node_num和max_width越大,占用大小越大。
  • vpss(%d)_lmf:每组开启LMF功能时占用MMZ内存,用于存放LMF的系数,固定值4K。
  • vpss(%d)_rgn_luma:每组开启通道亮度和功能时占用MMZ内存,用于存放亮度和统计信息,固定值4K。
  • vmallocinfo:每组上下文需占用一定大小OS内存。总大小与组数量相关,组越多占用越大。

VGS

VGS模块根据job、node、task数目,分配固定的MMZ内存。

  • vmallocinfo:根据job、task数目及上下文占用OS内存。数目越多占用越大。
  • vgs_node_buf:根据node数目,占用一定大小的MMZ内存。数目越多占用越大。

VENC

  • 硬件相关:

    vedu_hal_(%d):硬件需要使用的内存,与IP个数相关。

  • 通道相关内存(以H264为例,H265则前缀为h265e):

    • h264e(%d)_node:寄存器节点配置内存,每个通道一块。
    • h264e(%d)_str0:码流buffer,每个通道一块。
    • h264e(%d)_rcn(%d):参考帧重构帧内存,个数与编码参考帧个数相关。
    • h264e(%d)_info(%d):参考帧重构帧信息内存,个数与编码参考帧个数相关。
    • h264e(%d)_deblur:通过ss_mpi_venc_set_deblur 使能去模糊后,需要相应去模糊处理内存。
    • h264e(%d)_md:通过ss_mpi_venc_set_md使能MD检测,需要相应的MD检测内存。
    • venc(%d)_svc:通过ss_mpi_venc_enable_svc使能SVC,需要相应的SVC内存。
    • jpege(%d)_stm:jpege码流buffer,每个通道一块。
    • jpege(%d)_roi_map:通过ss_mpi_venc_set_jpeg_roi_attr使能roi_map,为jpege的roi_map分配内存。
    • vmallocinfo:各个通道的通道上下文内存;UserData数据;码率控制相关内存。

VO

VO MMZ占用分为系数MMZ占用、获取亮度和MMZ占用,VB轮转MMZ占用。

  • 系数MMZ占用:

    vo_coef_buf:回写缩放系数(128KB)和多区域配置系数(8KB)的内存存放占用, 共计136KB。如果芯片不支持回写缩放,则不会申请对应系数,一个多区域占用4KB内存,两个多区域占用8KB.

  • 获取亮度和MMZ占用:

    vo(%d,%d)_luma:VO模块获取视频层和通道亮度和时动态申请MMZ内存占用,某个通道固定占用4KB。如果芯片不支持获取亮度和,则不申请此内存。

  • VB轮转MMZ占用:

    vo(%d)_disp_buf:vb大小和个数都由用户配置。大小根据用户配置视频层属性img_size确定,个数根据用户配置视频层属性中display_buf_len确定。Single模式下VO会占用3块私有VB用来显示轮转。

    Multi模式下,如果前端绑定VPSS为auto模式,VO会占用4块私有VB用来显示轮转;如果前端为User模式,VO可以不分配VB,此时占用前端模块发送过来的VB,显示完后释放。

GFBG

加载ko时,用户指定图形层、鼠标层的显示buf大小。支持的图层均可指定,图层id号与vram id号需保证匹配。

例如:insmod gfbg.ko video="gfbg:vram0_size:32400,vram1_size:32400,vram2_size:256,vram3_size:4052".

  • vram0_size: 对应gfbg0图形层内存大小,单位KB,对应mmz name= gfbg_layer0。
  • vram1_size: 对应gfbg1图形层内存大小,单位KB,对应mmz name= gfbg_layer1。
  • vram2_size: 对应gfbg2图形层内存大小,单位KB,对应mmz name= gfbg_layer2。
  • vram3_size: 对应gfbg3图形层内存大小,单位KB,对应mmz name= gfbg_layer3。

AUDIO

AI

  • ai(%d)_frm:AI的通道buffer根据chn_cnt、frame_num和point_num_per_frame分配。
  • ai(%d)_dma:AI的DMA缓冲区根据chn_cnt和point_num_per_frame分配。

AO

  • ao(%d)_dma&frm:AO的DMA缓冲区和通道buffer根据chn_cnt、frame_num和point_num_per_frame分配。
  • ao(%d, %d)_cir:音频帧buffer根据frame_num和point_num_per_frame分配。

AENC

  • aenc(%d)_strm:码流buffer根据buf_size分配。
  • aenc(%d)_cir:环形缓冲区根据编码通道数分配。

REGION

区域信息上下文节点

去掉不必要的模块可以减少内存的占用,如:

  • 模块加载时分配的1024个区域信息上下文节点,占用os内存4kb。区域信息上下文在创建区域时动态分配。
  • 如果是overlay或者是overlayex类型的区域,还会创建乒乓buff用于存放位图数据。
  • rgn_pin_pon_(%d):乒乓buff的大小由用户设置的width,height,canvas_num和颜色格式决定,占用MMZ内存。

通道管理信息节点

其他模块调用REGION的函数向REGION注册信息时动态分配,占用MMZ内存。

TDE

通道使用MMZ,为固定值总大小:(OT_TDE_CMD_NUM) * 64 + (OT_TDE_JOB_NUM) * 96 + (OT_TDE_NODE_NUM) * 256 +(OT_TDE_FILTER_NUM) * 1024。

SVP

SVP_NNN

SVP_NNN内存占用分为MMZ内存和os内存,其中MMZ内存包括任务节点和推理内容内存。

  • 节点MMZ占用:

    内核态节点的大小,默认值100KB;

    用户态节点的大小,默认值80KB。

  • 推理MMZ占用(Resnet50 Batch 1典型场景):

    OM内存大小,值50828KB;

    输入输出数据内存大小,值8596KB;

    模型信息内存大小,值12KB。

  • OS内存占用:

    OS内存主要包括两部分:静态全局变量的内存,大小大约5.6KB;动态内存,大小大约0.594KB。

    说明:

IVE

IVE内存占用分为MMZ内存和os内存,其中MMZ内存包括任务链表和辅助内存。

  • 任务链表MMZ占用:

    ive_queue: IVE任务链表的大小,默认为212KB。

  • 辅助MMZ内存占用:

    • ive_tmp_node: IVE的多算子组合任务需要的临时节点,固定值4KB。
    • Md_proc: MDproc信息需要的MMZ内存,固定值8KB。
    • ive_resize_param: resize算子计算需要的辅助内存,固定值9264Byte.
    • ive_yuv_to_hsv_table: ive颜色空间转换存放table的辅助内存,固定值2048Byte
    • ive_yuv_to_lab_table: ive颜色空间转化存放table的辅助内存,固定值6656Byte
  • OS内存占用:

    ive占用的OS内存主要分为kmalloc开辟的内存和静态全局变量占用内存,OS内存加mmz内存不超过235KB。

KCF

KCF内存占用分为MMZ内存和OS内存,其中MMZ内存包括任务链表和辅助内存。

  • 任务链表MMZ占用:

    kcf_queue: KCF任务链表的大小,固定值106688Byte。

  • 辅助MMZ内存占用:

    kcf_param: KCF计算需要的辅助内存,固定值45328Byte。

  • OS内存占用:

    KCF占用的OS内存主要分为kmalloc开辟的内存和静态全局变量占用内存,OS内存加mmz内存不超过150KB。

MAU

MAU内存主要分为MMZ内存和OS内存,其中MMZ内存为任务链表的内存。

  • 任务链表占用:

    svp_mau_queue: MAU任务链表的大小,默认160KB。

  • OS内存占用:

    MAU 占用的os内存主要有mem_info链表内存使用os内存,mem_info链表内存占用(40 * mau_max_mem_info_num)Byte,以及mau上下文的静态全局变量占用的内存。os内存加mmz内存总共不超过163KB。

PCIV

PCIV MMZ占用分为pcie-mcc消息池占用、window占用、VB轮转占用。

  • pcie-mcc消息池占用:

    用于pcie-mcc消息通信,在加载从片pcie驱动时指定位置与大小,大小固定为1M。

  • window占用:

    主片发起DMA操作时,从片空间只能在窗口上读写,加载osal驱动时指定mmz名为window,默认大小7M,起始位置紧跟pcie-mcc消息池之后(pcie-mcc消息池+window连续空间最大8M)。

  • VB轮转占用:

    • 主片轮转VB:VB大小和个数由用户配置,大小必须保证能接收完整图像,一般根据通道属性中的图像宽高,格式属性等确定;分配释放由用户调用接口控制;接收从片图像时,轮转VB往后传,通过查询后端占用情况决定是否接收下一次轮转。
    • 从片轮转VB:从片接收前端图像,如果是VPSS使用auto模式送帧,则由pciv获取VB,其他模式则接受图像时占用VB;直通模式(PCIV透传)则DMA发送完成释放VB;非直通模式(OSD、缩放等操作),需要获取VGS写出VB,并释放接收图像VB,DMA发送完成后,释放VGS写出VB。

GDC

GDC模块根据job、node、task数目,分配固定的MMZ内存。

  • vmallocinfo:根据job、task数目及上下文占用OS内存。数目越多占用越大。
  • gdc_node_buf:根据node数目,占用一定大小的MMZ内存。数目越多占用越大。
  • gdc_int_pole_coef:存储插值系数需要的MMZ内存,固定值4KB。

CIPHER

固定大小(驱动内部确定申请的MMZ内存的长度)

  • Hash初始化:给SHA节点链表分配内存,固定值28 *255* 1=7KB;255作为链表最大深度,最小深度为2;HASH消息的DMA内存:逻辑只识别物理内存,需要申请最大的64KB物理内存存储hash消息。
  • Cipher驱动模块初始化:给CIPHER节点链表分配内存entry list size(20KB),用来存放16个通道每个通道CCM GCM aad的物理内存padding buffer(2KB),固定值22KB。

非固定大小(由用户层接口传入的MMZ内存申请的长度)。

cipher加解密:依赖虚拟地址/物理地址加解密接口的参数byte_len。

VDA

vda(%d):通道内部计算结果存储相关内存,主要包括SAD结果内存、RGN运动区域信息内存和背景。

ISP

  • isp[%d].vreg[%d]:外部虚拟寄存器内存。
  • isp[%d].proc:用户态算法proc调试信息。
  • isp[%d].trans:dng, dcf, colorgammut等信息内存。
  • isp[%d].ldci:ldci算法内存。
  • isp[%d].clut:clut算法内存。
  • be_lut_stt[%d]:be lut信息内存。
  • pre_on_lut_stt[%d]:在线通路ADVANCED模式be lut信息内存。
  • isp[%d].stat:统计信息(FE,BE)内存。
  • isp[%d].fe_stat:FE统计信息内存。
  • isp[%d].wdr:wdr算法内存。
  • isp[%d].drc:drc算法内存。
  • isp[%d].be_cfg:离线通路be config buffer。
  • isp[%d].be_stt_on:在线通路be统计信息内存。
  • isp[%d].fe_stt:fe统计信息内存。
  • isp[%d].be_stt:离线通路be统计信息内存。
  • isp[%d].stit_fe:拼接通路fe统计信息内存。
  • isp[%d].stit_be:拼接通路be统计信息内存。

HNR

  • hnr_pqp_buf[%d]:hnr模型文件内存。
  • hnr_ping_pong_buf:hnr模型推理使用的工作内存。

    开启HNR功能参考帧模式需要多占用4~6个视频帧VB,无参考帧模式需要多占用1个视频帧VB。

各模块内存相关可优化配置

VB

措施 相关模块参数/接口 收益 影响 注意 proc信息
检查是否有vb池的vb个数设置过多 略 mini_free不为0的pool id里的VB块个数设置过多,可以再减去mini_free个。 - 公共VB池、模块VB池、UserVB池的个数设置参见《MPP 媒体处理软件 V5.0 开发参考》“系统控制章节”的VB相关接口。PrivateVB池的个数设置需要到相关模块的接口里找到对应的参数。 mini_free:vb个数的历史最小余量
检查是否有VB块size设置过大 略 free_bytes不为0的VB块size分大了,可以再减去free_bytes。 - 公共VB池、模块VB池、UserVB池的VB块大小设置参见《MPP 媒体处理软件 V5.0 FAQ》“系统控制章节”的VB相关接口。PrivateVB池的个数设置需要到相关模块的接口里找到对应的参数。 free_bytes:vb块的实时剩余bytesget:获取vb块的模块,通过此信息可以判断具体哪个模块的VB块size分大了

SYS

措施 相关模块参数/接口 收益 影响 注意 proc信息
设置调度模式为OT_SCHEDULE_QUICK ss_mpi_sys_set_schedule_mode 加速vb轮转,可以减少vb分配 - 具体操作和注意事项请参考《MPP 媒体处理软件 V5.0 FAQ》的“1.9 Quick schedule”注意事项 -

VI

措施 相关接口 收益 影响 注意 proc信息
开启 Early/Early_end机制 ss_mpi_vi_set_pipe_frame_interrupt_attr 线性或者在线WDR,节省一个VB;离线WDR(2路),节省两个VB VI采集响应的中断数翻倍 - vi pipe frame interrupt attr:interrupt_type
chn输出设置压缩 ss_mpi_vi_set_chn_attr 压缩比不压缩情况要更节省内存和带宽 - - Hi3403V100:vi phys chn attr1:compress_mode其他:vi phychn attr 2:compress_mode
在线WDR行模式卷绕 ss_mpi_vi_set_wdr_fusion_grp_attr 默认不卷绕,根据配置的cache_line节省内存 cache_line配置过小时可能导致图像分层 Hi3403V100支持 vi wdr fusion grp attr:cache_line
pipe设置压缩输出 ss_mpi_vi_set_pipe_attr 压缩比不压缩情况要更节省内存和带宽 - Hi3403V100支持 vi pipe attr1:compress_mode
调整VI_VPSS在离线模式 ss_mpi_sys_set_vi_vpss_mode 在线/在离线/离在线通路比全离线通路节省1-2个VB; VI在线只能处理一路,VPSS在线无法在VI_CHN做通道后处理相关功能 Hi3403V100支持 vi vpss mode & vi video mode:vi_vpss_mode
调整VI_VIDEO模式 ss_mpi_sys_set_vi_video_mode normal模式,比advanced模式可节省2块VB normal模式 HNR功能在BE前面 Hi3403V100支持 vi vpss mode & vi video mode:vi_vpss_mode
调整BayerNR buf_num个数 ss_mpi_vi_set_pipe_bnr_buf_num 默认个数为40个,可根据需离线缓存的YUV调整个数,节省部分内存 bnr_buf_num主要影响VI连续缓存不释放的YUV个数 Hi3403V100支持 vi pipe bnr buf num:bnr_buf_num
手动关闭 ISP BayerNR功能 ss_mpi_isp_set_nr_attr 关闭BayerNR可节省参考帧等内存和带宽 影响效果 Hi3403V100支持 bayernr info: enable

VDEC

措施 相关模块参数/接口 收益 影响 注意 proc信息
解码码流buffer使用省内存模式分配 ss_mpi_vdec_set_mod_param:mini_buf_mode 可以把码流buffer设置小一些。可以减少vfmw(%d)_seg_buf内存 - - module param:mini_buf_mode
控制用户数据user data buffer大小 ss_mpi_vdec_set_user_data_attr:enablemax_user_data_len 不申请或者少申请user data buffer - - etail user_data state:enablemax_user_data_len
控制jpeg解码progressive_buffer ss_mpi_vdec_set_mod_param:progressive_en 不申请progressive_buffer 使用JPEGD progressive功能时,设置dynamic_alloc_en为TD_TRUE,可以动态分配progressive_buffer,减少progressive_buffer内存占用 - module param:progressive_en
按场景设置解码器最大能力集 ss_mpi_vdec_set_mod_param:video_mod_parampic_mod_param 可节省部分MMZ和OS内存 VDH相关的内存分配的内存少了可能会导致解码性能下降,但是不影响功能。JPEGD的相关配置可以节省OS内存。 - module param:max_video_widthmax_video_heightmax_slice_numvdh_msg_nummax_pic_widthmax_pic_heightprogressive_endynamic_alloc_encapacity_strategy
按场景设置解码通道能力集 ss_mpi_vdec_set_protocol_param 可节省部分OS内存 - - chn video attr & params:max_vps_nummax_sps_nummax_pps_nummax_slice_segment_num
H264解码无B帧码流时可关闭Tmv开关 ss_mpi_vdec_create_chn:temporal_mvp_en 可节省Tmv buffer - - chn video attr & params:tmv_en
解码模块最大支持的通道数 g_vdec_max_chn_num g_vfmw_max_chn_num 可节省部分OS内存 - - module param:g_vdec_max_chn_num
只解码I帧的通道把参考帧设置为0 ss_mpi_vdec_create_chn:ref_frame_num 减少pic_vb、tmv_vb分配个数 - 把通道解码模式设置为I模式,否则logmpp会报错。 chn video attr & params:ref_num
设置快速释放参考帧模式为自适应模式或者强制模式 ss_mpi_vdec_set_chn_param:quick_mark_mode 加速vb轮转,可以减少pic_vb、tmv_vb分配个数 - - chn video attr & params:quick_mark_mode
根据实际应用的宽高尽量小的创建通道 ss_mpi_vdec_create_chn 可以减少vfmw(%d)_seg_buf内存 - - chn comm attr & params:max_wmax_h

说明:

具体参见《MPP媒体处理软件V5.0开发参考》"视频解码”章节。

VPSS

措施 相关模块参数/接口 收益 影响 注意 proc信息
关闭backup帧 ss_mpi_vpss_enable_backup_framess_mpi_vpss_disable_backup_frame 每个VPSS GROUP少占用1帧输入源的buffer。 VO暂停情况下放大或切换画面时显示设备背景色。 - vpss grp attr1:backup
不同时开启nr、dei功能 ss_mpi_vpss_create_grp 每个VPSS GROUP少分配两帧buffer(参考帧和重构帧)。 影响图像效果。 nr、dei中只要有一个功能开启,都会分配参考帧和重构帧buffer。 vpss grp attr:nrdei_mode
CH0输出YUV压缩 ss_mpi_vpss_set_chn_attr:compress_mode 比不压缩情况要更节省内存和带宽 - - vpss chn output status:compress_mode
开启 Early/Early_end机制 ss_mpi_vpss_set_grp_frame_interrupt_attr 全在线模式下每个通道节省一帧buffer - - frame interrupt attr: int_type
减小模块参数split_node_num ss_mpi_vpss_set_mod_param 减小每组寄存器模板所占用的mmz内存 - split_node_num与输入分辨率的宽成正比,默认为3。当场景固定且为小分辨率时,可调小其值;超大分辨率时,选择合适的取值,避免浪费内存。 vpss module param:split_node_num

说明:

具体使用方法及限制参见《MPP媒体处理软件V5.0开发参考》“视频处理子系统”章节。

VGS

措施 相关模块参数 收益 影响 注意 proc信息
设置VGS支持的最大job数 g_max_vgs_job 默认值128,按需减小可节省内存 job数量过少会限制VGS性能。 - module params:g_max_job_num
设置VGS支持的最大task数 g_max_vgs_task 默认值200,按需减小可节省内存 task数量过少会限制VGS性能 - module params:g_max_task_num
设置VGS支持的最大node数 g_max_vgs_node 默认值200,按需减小可节省内存 node数量过少会限制VGS性能 - module params:g_max_node_num

VGS模块主要是OS内存和node用的mmz。考虑场景的减小最大job数、最大task数和最大node数可以降低些OS占用内存以及node占用的MMZ内存。

说明:

具体使用方法及限制参见《MPP媒体处理软件V5.0开发参考》“视频图形子系统”章节。

VENC

措施 相关模块参数/接口 收益 影响 注意 proc信息
动态切换编码分辨率 ss_mpi_venc_set_chn_attrss_mpi_venc_get_chn_attr 切换编码分辨率时不销毁通道,减少内存碎片,如使用NormalP,可比SmartP和DualP减少参考帧/重构帧占用帧存的总大小 无 切换分辨率后所有参数恢复默认值。 -
编码码流buffer使用省内存模式分配 ss_mpi_venc_set_mod_param:mini_buf_mode 可以把码流buffer设置小一些。 此模式需要用户保证码流buffer大小设置合理,在码率较高或客户获取码流不及时情况下出现码流buffer不足而不断重编或者丢帧的情况。 - h265e/h264e/jpege模块都有module param:mini_buf_mode
参考帧重构帧buffer复用 ss_mpi_venc_create_chn:rcn_ref_share_buf_en 大约可节省(ref_num+1-1.2* ref_num)帧buffer 超大帧、码率过冲、码率buffer满等异常情况导致的丢帧或者重编,下一帧只能插入I帧 - h265e/h264e模块的ref_param info:rcn_ref_share_buf_en
参考帧重构帧buffer比例调节 ss_mpi_venc_set_chn_attrss_mpi_venc_get_chn_attrframe_buf_ratio 若设置为80,则帧buffer为原始大小的80%。 P帧刷I slice可能会出现整帧刷成I块且提前结束刷I slice;去呼吸效应在某些帧上可能会失效;QPMAP表不能强制指定skip块,SkipWeight表不能强制指定skip块ROI背景低帧率编码可能会出现部分帧的非ROI区域不能编码为p_skip块某些场景指定为p_skip帧的情况下可能会失效,如编码瞬时码率超过阈值时丢帧策略。skip倾向性可能会失效 - h265e/h264e模块的ref_param info:frame_buf_ratio
动态回收参考帧buffer ss_mpi_venc_set_mod_param:frame_buf_recycle 当编码切换GOP模式,参考帧由多变少时,可动态释放多出来的参考帧buffer - - venc 模块的module param:frame_buf_recycle
编码模块支持的最大通道数 模块参数:g_venc_max_chn_num 可节省部分OS内存 - - venc模块的module param:venc_max_chn_num
相同分辨率多通道编码使用UserVB模式节省内存 ss_mpi_venc_set_mod_param:vb_src 比PrivateVB模式节省更多帧存buffer - 仅h265e/h264e支持 h265e模块的module param:h265_vb_src;h264e模块的module param:h264_vb_src

说明:

具体参见《MPP媒体处理软件V5.0开发参考》"视频编码”章节。

VO

措施 相关接口 收益 影响 注意 proc信息
VO水线设置为2 ss_mpi_vo_set_chn_recv_threshold 减少通道VB的积累 可能出现少量丢帧 - vo chn play info 1:threshold
回放模式显示队列长度设置最小值3 ss_mpi_vo_set_video_layer_attr 高清设备可节省1帧buffer。 影响VO显示流畅性。 - vo video layer status 2:disp_buf_len
直通模式DispBufLen可以设置为0 ss_mpi_vo_set_video_layer_attr 可不用分配Display Buffer - - vo video layer status 2:disp_buf_len
多区域模式VO省buffer方案 ss_mpi_vo_set_video_layer_attrss_mpi_vo_set_vtthss_mpi_vo_set_less_buf_attr 多区域模式下减少一块显示buffer 可能出现显示卡顿 - vo video layer status 2:disp_buf_lenvo interface status:vtth less_buf_enableless_buf_vtth

说明:

具体参见《MPP媒体处理软件V5.0开发参考》"视频输出”章节。

GFBG

加载ko时,叠加图形层的显存大小根据像素格式、分辨率大小、buf模式算出,用户可以根据实际使用场景来得出需要的显存大小。

非压缩:按实际UI大小,像素格式,单双BUF计算分配:

例:1080P argb8888 双buf模式,

buf_size = 1920 * 4 * 1080 * 2 / 1024 = 16200KB

压缩:argb8888像素格式,宽>=320的情况下,相对于非压缩情况可节省内存45%:

例:1080P argb8888 双buf模式,

buf_size = (1920 * 4 * 1080 * 2 / 1024)* 55% = 8910KB

若仅G3用作在线画框时可以不分配G3的MMZ。 G4用作在线画框时也一样。

措施 相关模块参数/接口 收益 影响 注意 proc信息
设置合适的图形层物理显存 video 根据实际分辨率设置合适的图形层物理显存避免内存浪费。 无 - mem_size
图形层缩放 FBIOPUT_SCREENSIZE 可节省部分MMZ内存。 - - -

AUDIO

措施 相关接口/参数 收益 影响 注意 proc信息
按场景合理设置通道数量、AI缓存音频帧数量、一帧采样点数。 ss_mpi_ai_set_pub_attr:chn_cnt、frame_num、point_num_per_frame 可节省部分OS内存 需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 - cat /proc/umap/aiai dev attr:chn_cnt、frame_num、point_num
按场景合理设置AENC缓存音频帧大小 ss_mpi_aenc_create_chn:buf_size 可节省部分OS内存 需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 - cat /proc/umap/aencaenc chn attr:buf_size
按场景合理设置ADEC缓存音频帧大小 ss_mpi_adec_create_chn:buf_size 可节省部分OS内存 需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 - cat /proc/umap/adecadec chn attr:buf_size
按场景合理设置通道数量、AO缓存音频帧数量,一帧采样点数。 ss_mpi_ao_set_pub_attr:chn_cnt、frame_num、point_num_per_frame 可节省部分OS内存 需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 - cat /proc/umap/aoao dev attr:chn_cnt、frame_num、point_num

说明:

参考文档《MPP 媒体处理软件 V5.0 开发参考》“音频”章节。

REGION

  • 用户分配乒乓buff指定的width,height按需要尽可能小。
  • 当区域类型为overlay/overlayex格式时,可以设置pixel_format为CLUT2/CLUT4,CLUT2相比ARGB1555可节省7/8的内存,CLUT4相比1555可节省3/4内存。此方法会降低图像质量。
  • overlay/overlayex可采用单buff模式,方法为把区域属性中的canvas_num设置为1,当图像需要频繁刷新时可能会出现撕裂效果。
  • 参考文档《MPP 媒体处理软件 V5.0 开发参考》“区域管理”章节,proc信息查看命令cat /proc/umap/rgn。
措施 相关模块参数/接口 收益 影响 注意 proc信息
使用ARGB CLUT2 OVERLAY和OVERLAYEX_RGN ss_mpi_rgn_create: pixel_format 设置为OT_PIXEL_FORMAT_ARGB_CLUT2 ARGB CLUT2是 ARGB 1555的1/8,是ARGB 8888的 1/16。 只能显示4种颜色 多个OSD叠加有重叠区域时, Layer层次高的OSD会覆盖Layer层次低的OSD。 region status of overlay: pixel_format;region status of overlayex: pixel_format
使用ARGB CLUT4 OVERLAY和OVERLAYEX_RGN ss_mpi_rgn_create: pixel_format 设置为OT_PIXEL_FORMAT_ARGB_CLUT4 ARGB CLUT4是 ARGB 1555的1/4,是ARGB 8888的 1/8。 只能显示16种颜色 多个OSD叠加有重叠区域时, Layer层次高的OSD会覆盖Layer层次低的OSD。 region status of overlay: pixel_format;region status of overlayex: pixel_format

SVP

SVP_NNN

  1. 转换模型时配置参数

    • ATC --batch_num参数配置1,可以减少输入输出及workbuf的内存占用。
    • ATC --online_model_type参数配置为0,此配置使转换的模型不带调试相关信息,减少模型占用内存。
  2. 量化参数配置

    • activation_quant_params - num_bits配置为8
    • weight_quant_params - num_bits配置为4

    备注:该配置参数会影响模型精度。

  3. KO模块参数

    可以通过模块参数svp_nnn_max_task_node_num来更改任务节点个数,从而减少任务节点占用mmz内存。

  4. workbuf共享

    同一条流上的多个模型之间可以使用同一块workbuf,从而减少mmz内存占用。

    说明:

NNN

  1. 转换模型时配置参数:ATC -enable_single_stream=true,使能一个模型使用一条流。
  2. 多个模型串行推理时,使用aclmdlLoadFromFileWithMem或者aclmdlLoadFromMemWithMem加载方式,手动分配workbuf内存,然后多模型共享同一块工作内存,从而减少mmz内存占用。

IVE

  1. MD的proc信息的内存只有在支持MD的时候才会进行分配。
  2. 用户不调用IVE的resize,kcf和csc这3个算子不会开辟resize,kcf和csc对应的辅助内存。
  3. 可以通过配置模块参数max_node_num来控制链表节点个数,减小链表节点占用的MMZ内存。

KCF

可以减少使用核数,从而减小内存。

MAU

  1. 用户不调用ss_mpi_svp_mau_add_mem_info接口记录mem_info时,不会分配mem_info链表内存,如果用户需要调用ss_mpi_svp_mau_add_mem_info接口记录men_info,可以通过配置模块参数mau_max_mem_info_num来控制存储mem_info内存大小。
  2. 可以通过配置模块参数mau_max_node_num来控制链表节点个数,减小链表节点占用的MMZ内存。

VDA

加载vda模块ko时设置模块参数最大通道数g_vda_max_chn_num,省OS内存。

PCIV

  • window占用:如果不涉及主片发起的DMA任务,window空间可不用分配,需要注意,如果不分配window空间,需要留意mmz空间完整性,不要被pcie_mcc的空间分割。
  • VB轮转占用:
    • 主片轮转VB:用于接收绑定图像,如果只用DMA功能,可不分配;如果传输效率够(图像小,帧率低),可使用单buff,个数只分配一个。
    • 从片轮转VB:接收绑定图像时,尽量使用直通模式;仅用户DMA传输时,不占用和分配轮转VB。

GDC

GDC模块主要是OS内存和node用的mmz。考虑场景的减小最大job数、最大task数和最大node数可以降低些OS占用内存以及node占用的MMZ内存。

CIPHER

措施 相关模块参数 收益 影响 注意 proc信息
Hash初始化内部固定内存大小配置 HASH_MAX_DEPTH;ss_mpi_cipher_hash_updata/in_data_lenss_mpi_cipher_hash_final/out_hash_len 驱动内部确定申请的MMZ内存的长度节省 可减小链表深度来减小链表内存总大小;也可根据实际场景修改HASH消息的长度,减小申请的物理内存。 - cat/proc/umap/cipher
Cipher驱动模块初始化内部固定内存大小配置 SYMC_MAX_LIST_NUM;CHIP_AES_CCM_GCM_SUPPORT宏关闭 驱动内部确定申请的MMZ内存的长度节省 可减小链表深度减少链表的内存总大小;可根据实际场景不适用CCM/GCM就删除给CCM/GCM申请的padding buffer - cat/proc/umap/cipher
按场景合理设计cipher加解密时内存长度 ss_mpi_cipher_encrypt/byte_lenss_mpi_cipher_decrypt/byte_len 由用户层接口传入的MMZ内存申请的长度节省 由用户层接口根据实际场景传入合适的MMZ内存申请的长度,可节省部分MMZ内存 - cat/proc/umap/cipher

ISP

措施 相关接口/参数 收益 影响 注意 proc信息
离线通路时,按场景合理设置be config bufer个数。 ss_mpi_isp_set_ctrl_param:be_buf_num 可节省部分MMZ内存 需要用户保证buffer大小设置合理,否则可能会出现获取be config buffer异常。 - cat/proc/umap/ispmodule/control param:be_buf_num

HNR

措施 相关接口/参数 收益 影响 注意 proc信息
VI stagger输入场景且VI视频模式为OT_VI_VIDEO_MODE_NORM时 ss_mpi_hnr_attach_out_vb_pool: ot_vb_pool 可节省MMZ内存 需要用户保证VB大小,个数设置合理, - cat/proc/umap/vb

其它措施

限制栈大小

默认的栈大小为8192KB,如果内存较小时,会导致线程创建不成功。根据实际的业务需要的栈空间,修改栈的限制大小为1024KB,如果业务更少则可以改成512KB或者更小。

有两种方法可以修改栈大小:

  • 使用 ulimit –s 1024 命令,在应用程序启动之前调用一次;
  • 在main函数最开始调用函数 pthread_attr_setstacksize 也可实现对单个应用程序修改栈空间的目的。

优化代码中内存使用

优化代码中内存使用,特别是对栈、堆、常量、全局变量的使用,主要需要注意:

  • 避免应用程序代码中申请后不用的变量;
  • 不要随意申请大块的内存,够用即可;
  • 冗余的内存使用还包含不用的功能模块的初始化。

应用程序中禁用fork、system等进程创建函数

由于主进程的数据段占用内存已经很多,如果fork子进程必定消耗大量内存而且会有大概率失败,那么应用程序中应该禁用fork、system等进程创建函数:如bspmm调用、mkfs.vfat调用等。

根据场景去掉不必要的模块

去掉不必要的模块可以减少内存的占用,如:

  • 使用gfbg 0buffer或者标准模式,TDE可不加载,如果TDE未加载,则REGION使用memcpy进行Overlay/OverlayEx的拷贝;
  • 无需音频输入、编码场景,AI、VENC可不加载;
  • 无需使用REGION的场景,REGION可不加载;
  • 无需使用JPEGE场景,jpege模块可不加载。