AVS解码器在DSP平台上的优化

AVS( Audio Video Coding STandard)是由我国数字 音视频标准工作组制定的具有自主知识产权的第二代音视频压缩准。AVS实行1 元专利费用的原则,相比其它音视频编解码标准具有编码效率高、专利费用低、授权模式简单等优势。AVS 解码器的结构复杂、运算量较大,要在嵌入式平台上实现实时解码具有较大难度。在对解码器性能优化的过程中可以依据使用平台对其进行汇编指令集的优化或者针对解码器的关键算法模块进行改良,以上方法对解码器性能的提高均有一定作用,本文提出一种利用嵌入式平台的L1P Cache高速缓冲功能实现 处理器对程序代码的高效率访问的方法,从而达到提高AVS解码器性能的目的。

  1 高速缓存Cache的应用

  目前越来越多的编解码算法采用DSP的方式实现,随着DSP芯片主频的不断攀升,存储器的访问速度日益成为系统性能提升的瓶颈。在现有的制造工艺下,片上存储单元的增加将导致数据线负载电容的增加,影响到数据线上信号的开关时间,这意味着片上高速存储单元的增加将是十分有限的。为了解决存储器速度与CPU内核速度不匹配的问题,高性能的CPU普遍采用高速缓存(Cache)机制。

  以TI的C64x DSP为例,存储器系统由片内存储器和片外存储器两部分组成。其中,片内存储器采用两级缓存结构,第1级L1距离DSP核最近,数据访问速度最快,可以达到每秒600Mbyte,只能作为不能寻址的Cache使用,由相互独立的L1P和L1D 组成。

  L1P Cache是处理器访问程序代码的高速缓冲存储器,大小为16 kbyte,采用直接映射方式,每行大小32byte;L1D Cache是处理器访问数据的高速缓冲存储器,大小为16 kbyte,采用2路映射,每行大小为64byte。第2级L2是一个统一的程序/数据空间,可以整体作为SRAM映射到存储空间,也可以作为Cache和SRAM按比例的一种组合。L2与L1之间的数据交互速率为每秒300 Mbyte,L2与SDRAM之间的数据交换速率为每秒100 Mbyte。片外存储器是第3级,一般由SDRAM构成。L1、L2和片外SDRAM构成了整个存储器系统的层次结构。C64X的两级缓存结构若能运用恰当,将能极大地提高程序性能。

  根据图1的三层次的存储器系统, C64X读取程序代码时,先查看1级缓存L1,若L1已缓存了所需代码,则直接从L1读取;若L1没有该代码的缓存,则访问2级缓存L2;若L2也没有,则通过EMIF接口访问外部SDRAM,把所需代码从外部SDRAM拷贝到L2缓存区,再从L2缓存区拷贝到L1,最后由DSP内核取得。

三层次的存储器系统(图中B代表byte)

图1 三层次的存储器系统(图中B代表byte)

  研究表明,采用这种多级缓存的架构可以达到采用完全片上存储器结构的系统约80%的执行效率。本文致力于更深入地研究Cache的机制,对算法的数据结构、处理流程以及程序结构等进行优化,以提高Cache的命中率,更有效地发挥Cache的作用,从而达到提高解码器运行效率的目的。

  2 基于Cache的视频解码算法实现

  为了克服上述不足,本文通过更改视频解码算法的实现架构,充分利用Cache中L1P,减少CPU读取程序代码的缺失次数,提高解码程序的执行效率。

  在具体实施过程中,本文根据L1P的容量和程序中各个功能单元代码的大小,将图2中的功能单元分为四个模块,每个模块代码大小均小于16 kbyte,各模块所包含的功能单元为:模块A,读入一个宏块;模块B,熵解码、反扫描、反量化、反变换;模块C,重建;模块D,环路滤波。

  一个视频宏块只有遍历这四个模块之后才算最终完成解码,各个模块之间传递的中间数据如果放置在片外SDRAM中,势必影响下一个模块获取数据的速度,如果数据放置在片内SRAM中,由于片内RAM空间有限不能存储整帧数据。所以权衡考虑,每个模块完成一个宏块行(假设一幅图像包含有M个宏块行,每行有N个宏块)的解码后再交给下一个模块处理,这样既可以将中间数据放置在片内又可以充分利用L1P,减少各个模块之间的代码冲刷,直到M 个宏块行全部处理完毕,这样就得到一帧数据的解码图像。

解码算法流程

图2 解码算法流程

  如图3所示,本文以一个宏块行为处理单位,在进行解码时,首先执行模块A将整个宏块行读入高图3 处理一个宏块行的新流程速缓存中,执行完毕模块A后,读入模块B的代码,该部分代码将会冲掉模块A 的代码。执行完毕模块B后,读入模块C的代码,该部分代码将会冲掉模块B 的代码。依此类推,当执行完毕模块D后,再重复执行以对下一个宏块行进行解码。

处理一个宏块行的新流程

图3 处理一个宏块行的新流程

  每个模块在执行一个宏块行的解码过程中,会被反复执行N 次,在此期间程序代码保留在L1P中不被冲刷,直到第二个模块执行的时候第一个模块的代码才被冲刷。所以此方法解码一个宏块行才发生四次冲刷,完成一帧图像的解码共发生4 ×M 次代码冲刷,较改进之前减少冲刷次数4 ×M ×(N - 1)。

  表1中的测试序列分辨率为720 ×576,调整结构后解码速率均有不同程度的提高,通过对统计结果的平均得知,效率提高20%左右。

表1 实验结果

实验结果

  3 结论

  本文解码器优化充分利用了处理器的程序Cache功能,模块分配方式依据Cache大小而定,针对不同处理器的不同Cache, 可以有不同的模块划分方式,只需要保证每个模块代码量小于程序Cache容量即可。处理器对于数据的读取同样可以采用类似方法,以达到充分利用数据Cache的目的。此方法不仅可以应用于AVS解码器,也可应用于AVS编码器,还可以应用于与之拥有类似结构的H. 264、MPEG、VC1等编解码算法。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何重做计算机系统软件,电脑卡如何一键重做Win7旗舰版

电脑卡如何一键重做Win7旗舰版?小伙伴们在使用电脑的过程中系统会越来越卡,对于新手小白来说怎么重装系统是一个比较烦恼的问题,不知道如何下手,从哪里开始,那么接下来就以云骑士装机大师为例给小伙伴们讲解一下电脑卡…

python去停用词用nltk_【NLTK】安装和使用NLTK分词和去停词

黄聪:PythonNLTK自然语言处理学习(一):环境搭建 http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.html 安装NLTK可能出现的问题: 1. pip install ntlk 2. 如果遇到缺少stopwords报错如下:&am…

JavaScript知识概要

JavaScript 1.简介 JavaScript简介: JS是运行在浏览器端的一门脚本语言,一开始主要用来做浏览器验证,但现在功能已经不止于此。 所谓脚本语言就是指,代码不需要编译,直接运行,并且读入…

vue项目cordova打包的android应用

准备工作nodejs、cordova、AndroidStudio这些在上一篇文章中已经说过了,这里就不重复说明。以此文记录vue项目用cordova打包移动app的方法。 1.创建一个cordova项目,如创建一个名为testapp的工程:cordova create testapp 2.添加安卓平台 cord…

Django REST framework 源码解析

先放图,放图说话,可能有点长 主流程 这个颜色 从setting导入默认数据流程是 这个颜色 主流程大概流程写一下:as_view 实际返回view,并把参数{"get":"list","post":"create"}传递给view…

-9 逆序输出一个整数的各位数字_leetcode两数相加(大整数相加)

题目来源于leetcode第二题两数相加。题目描述给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来…

计算机如何添加管理员权限,电脑使用代码如何添加管理员权限

我们在使用电脑运行某些软件的时候,可能需要用到管理员权限才能运行,通常来说直接点击右键就会有管理员权限,但最近有用户向小编反馈,在需要管理员权限的软件上点击右键没有看到管理员取得所有权,那么究竟该如何才能获…

sql注入问题

${}拼接sql,会引起sql注入,sql注入例如: select * from user where name like ‘%’ or 11 or ‘%’; 这种情况下,论name为什么都可以执行 转载于:https://www.cnblogs.com/mengyinianhua/p/7649325.html

teechart绘制实时曲线_快速学会CAD绘制传输线路图纸

一工具CAD工程设计软件二方法和步骤万事开头难,遇到不懂的知识刚开始都有畏难的情绪,只要有决心学习,诚心想学会一项技能,那学会学好它就只是时间问题了。我们常常面临时间紧、需要快速入门甚至熟练地解决工作中实际情况的问题&am…

使用ajax获取用户所在地的天气

1.要获取用户归属地的天气&#xff0c;首先得获取用户所在的市区&#xff0c; 这里先获取用户的IP&#xff0c;通过IP获取IP的归属地&#xff0c;从而得到用户 地址。 获取客户端ip: js: <scripttype"text/javascript" src"http://pv.sohu.com/cityjson?ieu…

Python 之协程

之前我们学习了线程、进程的概念&#xff0c;了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题&#xff0c;都要消耗一定的时间来创建进程、创建线…

ip变换器苹果系统_加密锁能为高铁做什么?铁路电力变换器系统告诉您

代表国之重器的高铁&#xff0c;是怎样保护他们在软件上投资的专有技术不被仿冒、逆向工程和篡改呢&#xff1f;与一般的软件保护加密不同&#xff0c;高铁运行中的实时控制器对物理环境有着严苛的要求&#xff0c;如铁路电力变换器系统&#xff0c;须满足典型工业应用的扩展温…

zxing .net 多种条码格式的生成

下载地址&#xff1a;http://zxingnet.codeplex.com/ zxing.net是.net平台下编解条形码和二维码的工具&#xff0c;使用非常方便。 本文主要说明一下多种类型条码的生成。 适用的场景&#xff0c;标签可视化设计时&#xff0c;自定义条码类型&#xff0c;预览。 遍历zxing支持的…

k8s dashboard_windows10 部署 docker+k8s 集群

下面是经过踩坑之后的 windows10 单机部署 docker k8s 步骤&#xff0c;其中有几处比较关键的地方需要注意&#xff0c;后面加粗标注&#xff0c;下面就开始吧&#xff01;0、下载cmder在 windows 上有一个趁手的命令行工具非常有必要&#xff0c;推荐 Cmder&#xff0c;下面是…

Python 之网络编程基础

套接字&#xff08;socket&#xff09;初使用 基于TCP协议的socket tcp是基于链接的&#xff0c;必须先启动服务端&#xff0c;然后再启动客户端去链接服务端 server端 import socket sk socket.socket() sk.bind((127.0.0.1,8898)) # 把地址绑定到套接字 sk.listen() …

面试之网络编程和并发

1、简述 OSI 七层协议。 物理层&#xff1a;主要基于电器特性发送高低电压(1、0)&#xff0c;设备有集线器、中继器、双绞线等&#xff0c;单位&#xff1a;bit 数据链路层&#xff1a;定义了电信号的分组方式&#xff0c;设备&#xff1a;交换机、网卡、网桥&#xff0c;单位&…

redis 远程主机强迫关闭了一个现有的连接_记一次Redis+Getshell经验分享

你是我患得患失的梦&#xff0c;我是你可有可无的人&#xff0c;毕竟这穿越山河的箭&#xff0c;刺的都是用情之疾的人。前言&#xff1a;当我们接到一个授权渗透测试的时候&#xff0c;常规漏洞如注入、文件上传等尝试无果后&#xff0c;扫描端口可能会发现意外收获。知己知彼…

无线连接 服务器,服务器无线远程连接

服务器无线远程连接 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。使用Mac版Microsoft Remote Desktop工具&#xff0c;远程连接W…

IO模型

IO模型介绍 传统的网络IO模型包括五种&#xff1a; blocking IO 阻塞IOnonblocking IO 非阻塞IOIO multiplexing IO多路复用signal driven IO 信号驱动IOasynchronous IO 异步IO 由于signal driven IO&#xff08;信号驱动IO&#xff09;在实际中…

重温数据结构:树 及 Java 实现(转)

转自&#xff1a;http://blog.csdn.net/u011240877/article/details/53193877 读完本文你将了解到&#xff1a; 什么是树树的相关术语 根节点父亲节点孩子节点叶子节点如上所述节点的度树的度节点的层次树的高度树的深度树的两种实现 数组表示链表表示的节点树的几种常见分类及…