新闻中心

EEPW首页>消费电子>设计应用> 基于TMS320DM642 的X264 视频编码器的优化

基于TMS320DM642 的X264 视频编码器的优化

作者: 时间:2010-12-03 来源:网络 收藏


示例中, 除了数据搬移中必需的数据存放源地址和目的地址之外,还定义了变量Ping_Pong 和DAT_ID。其中Ping_Pong 是一个标志变量,用来表示当前存放搬移数据的目的存储区是Ping 存储区还是Pong 存储区,DAT_ID 是正在进行的EDMA 搬移的句柄变量。在进入正式的编码循环体以前,EDMA 会事先把一个要编码的宏块像素值搬移到Ping 存储区(假设Ping_Pong=0 表示Ping存储区)。进入循环体以后,首先进行目标存储区的交替(Ping_Pong=1-Ping_Pong,此时Ping_Pong=1,表示 Pong 存储区),接着等待前一次搬移是否完成(DAT_wait(DAT_ID)),如果前一次搬移完成,就可以立即开始下一次搬移,同时CPU 立即进行对本次搬移数据的处理。以后的操作类似,直至所有的宏块都完成编码,结束循环体。

3.3 循环体的优化

在X264编码器中,循环体出现的频率比较高,而且往往循环体是在整个编码器中比较占用时间的部分。尤其是当出现循环体嵌套,或者循环体内部存在逻辑判断语句或者函数调用时,编译器一般不会对该循环进行优化。针对这些问题, 比较常用的方法有嵌套循环体内部循环展开,用条件操作符代替逻辑判断语句,使用内联函数,使用MUST_ITERATE 伪指令操作符[11-12],将大循环体拆成几个小循环体。笔者使用的循环体优化的例子代码为:

本文引用地址://m.amcfsurvey.com/article/166324.htm

3.JPG

在上面示例中,伪指令MUST_ITERATE 主要是告诉编码器,本次循环总共要执行396 次,这样编译器就可以进行软件流水来优化这个循环。

3.4 编译器优化选项

在完成上述的手工优化后,接下来通过设置编译器选项来使用编译器优化,本文采用的编译器优化选项有:-pm(在程序级别进行优化),-o3(对文件级别进行最强的优化),-op3(速度最重要),-ml3(缺省情况下将全部数据和函数作为far 型)。

3.5汇编优化

假如使用上述优化策略对编码工程进行优化后,编码器的速度还不能达到应用要求,就需要编写手工汇编程序。编写手工汇编程序之前, 首先要用CCS 的profile工具对编码工程进行剖析, 找出比较耗时或频繁调用的函数部分,把这些部分改写成汇编函数。

采用的是哈佛体系结构, 将数据和程序分开存放。大体上来说,编写汇编语言函数主要步骤为:把操作数从内存中取出来放到CPU 的寄存器中, 然后在CPU内部用不同的运算单元对寄存器里的操作数进行运算,最后把运算的结果存到内存中。其中,函数参数传递、函数返回值寄存器、条件寄存器、栈指针寄存器的保存都必须按照规定使用相应的寄存器,否则会出现错误。

在编写汇编语言的过程中要考虑下方面:1) 充分理解待编写的函数的逻辑功能。只有真正理解了函数实现的功能和具体的数据流程图, 才能使汇编语言的构架比较高效;2) 数据结构的选择和安排。由于DM642 允许数据打包处理,即一条指令可以同时对几个字节进行操作,这对于图像和处理非常有益, 所以能够打包处理的就尽可能打包处理;3) 寄存器的分配和指令的先后顺序。DM642 的CPU 有2 套完全对称的运算单元和寄存器。只要把操作数分别存、取到隶属于不同套的寄存器里面,采用不同的运算单元,合理安排指令的先后顺序,保证在资源不冲突的条件下尽量在一个周期内安排更多的指令,实现指令运行的高效性、并行性。



关键词:视频DSP

评论


相关推荐

技术专区

关闭