前言¶
概述
本文为进行小型化开发的程序员而写,目的是介绍在单板上进行Linux开发、裁剪、优化及使用注意事项等内容。
说明: 未有特殊说明,SS927V100与SS928V100内容完全一致。
产品版本
与本文档相对应的产品版本如下。
产品名称 |
产品版本 |
|---|---|
SS626 |
V100 |
SS928 |
V100 |
SS927 |
V100 |
读者对象
本文档(本指南)主要适用于以下工程师:
技术支持工程师
软件开发工程师
修改记录
文档版本 |
发布日期 |
修改说明 |
|---|---|---|
00B01 |
2025-09-15 |
第1次临时版本发布。 |
综述¶
DDR小型化可以从多个方向入手:uboot、kernel、filesys、SDK、APP都可以在内存使用上做一定程度的优化。本文主要是对SDK和APP的小型化进行简单的说明。
基于 SS626V100的SDK目前支持运行Linux和liteos双系统或单linux系统,如业务场景只需运行单linux系统,可参考《内存布局调整指南》3.2章节裁剪liteos系统相关MMZ占用。本文中默认以Linux和liteos双系统为基础进行描述。SS626V100的系统小型化基于DEMO单板实现,以容量为2G Bytes的DDR内存为例。
图 1 DEMO板中Linux系统内存分配图(仅供参考)

其中基于SS626V100典型场景业务的MMZ内存占用数据,请参考《SS626V100 Memory Usage Statistics Report》。此外,客户业务的具体内存占用,需结合具体场景进行分析,下文介绍各模块MMZ内存占用及小型化可优化手段。
主要模块工作占用MMZ情况¶
一般业务中MMZ的占用往往是内存消耗的很大一部分,本章节主要介绍一般业务场景中几个主要模块工作时占用MMZ的情况。
VI¶
VI采集状态下最多会占用三个视频帧VB。一个用于当前帧采集,一个用于准备给下一帧采集,一个在轮转流程中(主要是后级模块占用)。
SS928V100中 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相关内存,为用户指定大小和驱动内部分配之和。SS626V100包括PTS数据存放内存。
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。SS626V100此块内存名称为vfmw_vdh_msg。
vfmw_vdh_ext:VDH逻辑工作时需要的内存,与模块参数中设置的最大宽高相关。SS626V100默认模块参数(宽高8192x8192)时大小572KBytes。
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。
说明:
SS927V100不支持SVP_NNN模块。
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。
DCC¶
dcc_msg_buf:SS626V100使用,用于双核通信任务。
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块的实时剩余bytes get:获取vb块的模块,通过此信息可以判断具体哪个模块的VB块size分大了 |
SYS¶
措施 |
相关模块参数/接口 |
收益 |
影响 |
注意 |
proc信息 |
|---|---|---|---|---|---|
设置调度模式为OT_SCHEDULE_QUICK |
ss_mpi_sys_set_schedule_mode |
加速vb轮转,可以减少vb分配 |
- |
具体操作和注意事项请参考《MPP 媒体处理软件 V5.0 FAQ》的“1.9 Quick schedule”注意事项 |
- |
关闭logmpp_mdc |
g_mdc_log_enable |
节省logmpp_mdc日志68K |
- |
|
- |
去除MDC侧内存分配 |
- |
不需要加载:xx_dcc.ko、xx_vdec_adapt.ko |
- |
|
- |
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 |
压缩比不压缩情况要更节省内存和带宽 |
- |
- |
|
在线WDR行模式卷绕 |
ss_mpi_vi_set_wdr_fusion_grp_attr |
默认不卷绕,根据配置的cache_line节省内存 |
cache_line配置过小时可能导致图像分层 |
SS928V100支持 |
vi wdr fusion grp attr:cache_line |
pipe设置压缩输出 |
ss_mpi_vi_set_pipe_attr |
压缩比不压缩情况要更节省内存和带宽 |
- |
SS928V100支持 |
vi pipe attr1: compress_mode |
调整VI_VPSS在离线模式 |
ss_mpi_sys_set_vi_vpss_mode |
在线/在离线/离在线通路比全离线通路节省1-2个VB; |
VI在线只能处理一路,VPSS在线无法在VI_CHN做通道后处理相关功能 |
SS928V100支持 |
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前面 |
SS928V100支持 |
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个数 |
SS928V100支持 |
vi pipe bnr buf num: bnr_buf_num |
手动关闭 ISP BayerNR功能 |
ss_mpi_isp_set_nr_attr |
关闭BayerNR可节省参考帧等内存和带宽 |
影响效果 |
SS928V100支持 |
bayernr info: enable |
VDEC¶
措施 |
相关模块参数/接口 |
收益 |
影响 |
注意 |
proc信息 |
|---|---|---|---|---|---|
解码码流buffer使用省内存模式分配 |
ss_mpi_vdec_set_mod_param:mini_buf_mode |
|
- |
- |
module param:mini_buf_mode |
控制用户数据user data buffer大小 |
ss_mpi_vdec_set_user_data_attr:
|
不申请或者少申请user data buffer |
- |
etail user_data state:
|
|
控制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:
|
可节省部分MMZ和OS内存 |
VDH相关的内存分配的内存少了可能会导致解码性能下降,但是不影响功能。JPEGD的相关配置可以节省OS内存。 |
- |
module param:
|
按场景设置解码通道能力集 |
ss_mpi_vdec_set_protocol_param |
可节省部分OS内存 |
- |
- |
chn video attr & params:
|
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:
|
说明: 具体参见《MPP媒体处理软件V5.0开发参考》"视频解码”章节。
VPSS¶
措施 |
相关模块参数/接口 |
收益 |
影响 |
注意 |
proc信息 |
|---|---|---|---|---|---|
关闭backup帧 |
|
每个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:
|
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信息 |
|---|---|---|---|---|---|
动态切换编码分辨率 |
|
切换编码分辨率时不销毁通道,减少内存碎片,如使用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比例调节 |
|
若设置为80,则帧buffer为原始大小的80%。 |
|
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 |
多区域聚集模式 |
|
可节省部分MMZ内存 |
聚集模式VO不支持缩放 |
SS626V100支持 |
|
单区域模式VO省buffer方案 |
|
单区域模式非直通时可设置显示buff最小为2 |
减少了一块用于显示的buffer |
SS626V100支持 |
|
多区域模式VO省buffer方案 |
|
多区域模式下减少一块显示buffer |
可能出现显示卡顿 |
- |
|
说明: 具体参见《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
SS626V100在线画框可节省G3的MMZ内存, 若仅G3用作在线画框时可以不分配G3的MMZ。 G4用作在线画框时也一样。
措施 |
相关模块参数/接口 |
收益 |
影响 |
注意 |
proc信息 |
|---|---|---|---|---|---|
设置合适的图形层物理显存 |
video |
根据实际分辨率设置合适的图形层物理显存避免内存浪费。 |
无 |
- |
mem_size |
图形层缩放 |
FBIOPUT_SCREENSIZE |
可节省部分MMZ内存。 |
- |
- |
- |
在线画框 |
FBIO_DRAW_SMART_RECT |
可节省G3的MMZ内存。 |
G3用作标清层显示,需要重新加载KO,分配足够的内存。 |
|
mem_size |
AUDIO¶
措施 |
相关接口/参数 |
收益 |
影响 |
注意 |
proc信息 |
|---|---|---|---|---|---|
按场景合理设置通道数量、AI缓存音频帧数量、一帧采样点数。 |
ss_mpi_ai_set_pub_attr:chn_cnt、frame_num、point_num_per_frame |
可节省部分OS内存 |
需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 |
- |
cat /proc/umap/ai ai dev attr:chn_cnt、frame_num、point_num |
按场景合理设置AENC缓存音频帧大小 |
ss_mpi_aenc_create_chn:buf_size |
可节省部分OS内存 |
需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 |
- |
cat /proc/umap/aenc aenc chn attr:buf_size |
按场景合理设置ADEC缓存音频帧大小 |
ss_mpi_adec_create_chn:buf_size |
可节省部分OS内存 |
需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 |
- |
cat /proc/umap/adec adec chn attr:buf_size |
按场景合理设置通道数量、AO缓存音频帧数量,一帧采样点数。 |
ss_mpi_ao_set_pub_attr:chn_cnt、frame_num、point_num_per_frame |
可节省部分OS内存 |
需要用户保证buffer大小设置合理,否则可能会出现采集丢帧等异常。 |
- |
cat /proc/umap/ao ao 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
转换模型时配置参数
ATC --batch_num参数配置1,可以减少输入输出及workbuf的内存占用。
ATC --online_model_type参数配置为0,此配置使转换的模型不带调试相关信息,减少模型占用内存。
量化参数配置
activation_quant_params - num_bits配置为8
weight_quant_params - num_bits配置为4
备注:该配置参数会影响模型精度。
KO模块参数
可以通过模块参数svp_nnn_max_task_node_num来更改任务节点个数,从而减少任务节点占用mmz内存。
workbuf共享
同一条流上的多个模型之间可以使用同一块workbuf,从而减少mmz内存占用。
说明:
SS927V100不支持SVP_NNN模块
NNN
转换模型时配置参数:ATC -enable_single_stream=true,使能一个模型使用一条流。
多个模型串行推理时,使用aclmdlLoadFromFileWithMem或者aclmdlLoadFromMemWithMem加载方式,手动分配workbuf内存,然后多模型共享同一块工作内存,从而减少mmz内存占用。
IVE
MD的proc信息的内存只有在支持MD的时候才会进行分配。
用户不调用IVE的resize,kcf和csc这3个算子不会开辟resize,kcf和csc对应的辅助内存。
可以通过配置模块参数max_node_num来控制链表节点个数,减小链表节点占用的MMZ内存。
KCF
可以减少使用核数,从而减小内存。
MAU
用户不调用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内存大小。
可以通过配置模块参数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;
|
驱动内部确定申请的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加解密时内存长度 |
|
由用户层接口传入的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/isp module/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模块可不加载。