高速率AVS整数变换的汇编实现与优化

1 引言

AVS标准Ⅲ采用的8x8整数变换在获得较H.264更高的压缩率和主观图像质量的同时,增加了算法的实现复杂性和时间开销。本文重点研究AVS编解码器的整数变换模块,针对不同的算法实现模式,在原有Visual C++6.0整数变换模块基础上,分别应用MMX,SSE2和加强了乘法操作的SSE2内联汇编指令技术,优化整数变换的关键算法,实验结果表明,性能最优的SSE优化算法将单次整数变换的平均时延减少到0.5。ms以内,其编码速度比Visual C++6.0整数变换模块提高了6.3倍,实现了高速率的AVS整数变换,具有较大的实用价值。

2 AVS整数变换及蝶形算法

由于AVS正变换、反变换的基本原理近似,本文仅以正变换的分析与优化为例来详细说明。AVS对残差矩阵X的二维整数正变换定义为

式中:T8为变换矩阵,如图1所示。AVS整数变换的变换系数存在对称性,仅用加法和移位就可实现,消除了逆变换的不匹配,容易使用基8蝶形算法快速实现。图2所示为水平变换XT8的一维8点快速蝶形算法。显然,采用两个近似的C语言代码段就可实现由X到H的变换过程。依此设计的Visual C++6.O整数变换模块的算法清晰简单,容易更改数据长度,代码冗余少,但由于C程序不针对硬件编程,其较低的编解码速度不能满足HDTV实时性要求。


3 整数变换的优化设计

3.1 AVS整数变换的算法模式

利用矩阵乘法的结合律,公式(1)可以改写为

从而AVS整数变换的算法模式可分为4类:


1)水平变换一垂直变换:先水平变换H′=XT8再垂直变换

2)水平变换一转置一水平变换一转置:计算次序为

3)垂直变换一水平变换:计算次序为

4)垂直变换一转置一垂直变换一转置:计算次序为

无论采用上述哪种算法模式,为获得高质量主观图像效果并避免数据溢出,第一次变换前残差块X的每个元素均要由8位整型数据扩展为16位,第二次变换结果H的每个元素均要扩展为32位。为兼顾较高的图像压缩效率,最终输出结果需紧缩为16位的整型数据。

整数变换是典型的以计算为主的编码过程[2-3],为改进数字视频系统的实时性,需在Visual C++6.0基础上使用内联汇编,采用:Intel单指令多数据并行加速技术(SIMD)作面向硬件的程序流程和代码级优化[4]。

3.2基于MMX的优化

根据上面的分析,垂直变换比水平变换的汇编实现复杂很多,且转置过程中要并行处理多列数据,此时MMx指令集使用的64位寄存器遇到每次只能并行处理4个16位元素和2个32位元素的性能瓶颈,适合选择"水平变换一垂直变换"的算法模式:

1)水平变换H′=XT8:各矩阵元素均为16位,每次循环分两步处理残差矩阵X的一行元素,组合运算后得到矩阵H′相应行的元素,8次循环后计算得到矩阵H′。

2)垂直变换:每次取矩阵H′的两列向量的前两个元素,扩展为32位数据后作组合运算,再将结果紧缩为16位数据;此过程分4次循环计算得到矩阵H。

图3为基于MMX的整数变换汇编优化的算法流程。程序中多次使用混排指令pshufw,节省了大量movq和punpckhdq指令的时间开销。

3.3基于SSE2的优化

SSE2是基于128位寄存器的指令集,并行处理能力强大,水平变换和矩阵转置比基于MMX的优化更易实现,采用"水平变换一转置一水平变换一转置"模式能仅以两次转置过程的延时为代价减少垂直变换的代码和时间开销。具体实现步骤:

1)第一次水平变换H′=XT8:各矩阵元素占一个字,每次变换一个行向量;

2)第一次矩阵转置得到H′;

3)第二次水平变换J=H′TT8:矩阵各元素占一个双字,每次取矩阵H′各列的前4个元素并扩展为32位数据,作一系列组合运算即每次对4个行向量水平变换,变换后结果紧缩为16位数据,只需2次循环就能变换完H′T的全部元素得到矩阵J;

4)第二次矩阵转置:采用与第一次矩阵转置相同的代码段得到H=JT。

根据图4所示的算法流程,编写的优化程序可使用大量相同的代码段实现第一次水平变换,而第二次水平变换仅用2次循环实现,2次转置由相同的混排程序实现,可见整个优化程序减少了循环调用和运算复杂度。



3.4侧重使用SSE2乘法指令的优化

研究表明,垂直变换是汇编代码开销最高、时间消耗最大的环节。根据增强乘法功能SSE2指令集能在多媒体处理中大量减少乘加运算的特点,图2和基于MMx的整数变换汇编程序中大量不可替换的乘加步骤可由侧重使用SSE2乘法指令进行优化。

假定矩阵

直接计算垂直变换 得到

观察公式(4)容易发现,一个元素hij需由H′的行向量与TT8的列向量共2个向量、16个元素计算得出,求H的任意一个行向量都须要8次重复调用H'的同一个行向量且分别调用矩阵TT8的8个列向量各一次。显然,乘加运算太多和寄存器资源有限使得这样的直接垂直变换编码的代码和冗余和时间开销代价非常大。

如果利用寄存器特性,公式(4)对日的行向量计算可由图5所示快速算法求出。图中每个方框代表一个128位的寄存器空间,每个寄存器存储8个16位数据,左右两边每对寄存器相同位置的数据对应相乘后结果相加,即得到所求矩阵H的行向量。这一算法大大减少了求和次数,而且乘积与求和可以循环运算,提高了寄存器的利用率。

4 优化效果

笔者分别使用MMx,SSE2并侧重使用SSE2乘法指令内联汇编,按照上文提出的优化算法在P4,1.8 GHz。512 Mbyte内存环境下进行了实验仿真,结果如表1所示。

仿真实验数据说明,基于SSE2的优化算法其单次AVS整数变换平均延时最短,降低到了0.5 ms以内,其编码速度是C程序的6.3倍和基于MMX优化算法编码速度的1.7倍,适合高端硬件实现并获得较高的性价比;基于MMX的优化算法延时稍长,但适于低端硬件实现获得较高的性价比;侧重使用SSE2乘法指令的优化算法的编码速度较基于MMX的优化算法优势不大,这是因为大量乘法指令的执行产生了超出算法分析的计算延时。

5 小结

AVS整数变换的延时对数字电视系统的实时性有着重要的影响。笔者针对AVS整数变换的不同实现模式进行了研究,结合MMX,SSE2和侧重使用乘法的SSE2等指令集的特性,在Visual C++6.0实现整数变换模块的基础上使用内联汇编,对整数变换模块进行了优化。实验结果表明,基于SSE2的整数变换优化算法的性能最优,单次变换的平均时延减至0.5 ms以内,实现了高速率的AVS整数变换,适合高端硬件实现并获得较高的性价比;基于MMX的优化算法适合低端硬件实现获得较高的性价比,而侧重使用SSE2乘法指令的优化算法也具有进一步研究的价值。

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

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

相关文章

解析H.264视频编解码DSP实现与优化

引言 基于互联网的数字视频产业前景看好,而3G的规模部署,也会推动移动视频通信成为现实。但数字化后的视频图像具有数据海量性,给图像的存储和传输造成较大的困难。数字视频产业,是指数字内容中以数字视频形态为主的文化创意和传播…

python 打包exe_python如何封装为exe

1、首先进入python安装路径D:\Python27\Scripts下,查看pip或easy_install是否安装。2、确保安装了pip或者easy_install,在cmd命令行下输入“easy_install”,没有提示“xxx不是内部或外部命令……”,就说明easy install工具安装成功…

Django REST framework 解析器和渲染器

解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。 在了解解析器之前,我们要先知道Accept以及ContentType请求头。 Accept是告诉对方我能解析什么样的数据&#xff0c…

MyBatis的学习之路(二)

上篇文章介绍了MyBatis的配置文件,现在来介绍实体映射文件Mapper.xml。 说道实体映射文件,就不得不说一下实体与表之间的映射关系:单表映射和多表映射。 a. 单表映射 1 public class Admin{ 2 private String id; 3 private String n…

python爬取toefl_spark学习进度6-Python爬取数据的四个简单实例

今天本来想把昨天安装的intellij配置好,但是一直显示没有网络,网上查了相关资料也没有查出来解决办法。然后暂停了intellij的配置,开始做了几个Python爬取简单数据的实例,先做了几个最简单的,以后再加大难度&#xff0…

Django REST framework 版本

API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。 DRF提供了许多不同的版本控制方案。 可能会有一些客户端因为某些原因不再维护了,但是我们后端的接口还要不断的更新迭代,这个时候通过…

AngularJS中的过滤器(filter)

AngularJS中的过滤器是用于对数据的格式化,或者筛选的函数,可以直接通过以下语法使用: {{expression|filter}} {{expression|filter1|filter2}} {{expression|filter1:param1,param2,...|filter2} 过滤器的种类有number,currency&…

计算机考试上传照片教程,电脑照片传到iPhone手机的详细步骤【图文】

苹果自带的iOS系统是不可以随便和电脑进行数据交换的,必须使用iTunes软件。许多用户为此问题困扰,我们有什么可以把电脑照片传到iPhone手机?下面我们就一起来看看把电脑照片传到iphone设备的详细步骤。具体方法如下:1,…

Mware HA实战攻略之五VMwareHA测试验收

【IT168 专稿】在上一篇"VMware HA实战攻略之四VMwareHA安装及配置"中(点击),讲述了VMwareHA的概念及创建过程,还讲述了创建过程中要注意的一些事项。在本篇中,将要讲述如何在群集节点之一的ESX主机上安装虚…

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

AVS( Audio Video Coding STandard)是由我国数字 音视频标准工作组制定的具有自主知识产权的第二代音视频压缩准。AVS实行1 元专利费用的原则,相比其它音视频编解码标准具有编码效率高、专利费用低、授权模式简单等优势。AVS 解码器的结构复杂、运算量较大&#xff…

如何重做计算机系统软件,电脑卡如何一键重做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…