H.264视频编码器在DSP上的实现与优化
用CCS的分析工具Profile分析C代码,将反复调用的程序段(例如DCT变换和IDCT变换)放在片内程序存储区中,把频繁用到的数据段(如编码表)放在片内数据存储器中,把运用次数较少的程序和数据段放在片外存储器中,避免对程序或数据进行不必要的反复搬移。
在H.264编码器运行过程中,由于一帧图象的数据量很大,因此将参考帧和当前帧数据放到片外存储器中,需要用到时,再将它们从外部存储器搬到片内存储器中,以提高程序的运行效率。
3.3 代码优化
进行代码优化,先要找出程序的瓶颈,即占用CPU时间较多的代码,然后对其进行有针对性的优化。使用CCS提供的代码剖析工具Profile可以统计显示出程序中各个重要段和函数的运行时间,找出运算量较大的程序段,优化这些程序段,对于提高算法的性能有巨大影响。
⑴ 联合使用-pm和-03编译选项,对代码进行项目级的优化:CCS提供了强大功能的编译选项,从-O0到-O3共四级优化。-O3编译选项使能软件流水和其他优化方法,-pm选项从程序代码角度,把整个项目的所有源程序联合起来,作为一个模块来处理。-pm和-03两个选项联合使用,能进行一系列的优化,并且代码尺寸变小很多。
⑵ 使用const、restrict 关键字修饰指针:const指示编译器其修饰的指针所指向的内容不能修改;restrict指示编译器其修饰的指针与其他指针指向的内容不会覆盖,这些信息使两个指针不会访问同一存储器地址,可以消除存储器之间的相关性,这样可以并行执行多个数据的读取和运算,使代码运行达到昀大效率。
⑶ 对短字长数据使用宽长度的存储器访问(数据打包处理):即当CPU执行一连串短型数据(如16bit数据)操作时,可将数据类型设置为32bit长度的int型,这样可以一次性访问2个短型数据,然后使用C6000指令,同时进行两个数据的操作,减少了对内存的访问,这比采用16bit长度short型节约一半的时间。
⑷ 循环展开,把C语言中的循环打开,把多循环变为少循环,减少循环嵌套,使得可能并行的指令增加,从而改进软件流水编排,改善代码性能。
⑸ 减少C函数的调用,尽量使用系统提供的内联函数(intrinsics函数)代替C函数,C6000编译器提供了许多intrinsics,是直接与C6000汇编指令映射的在线函数,可以快速优化C代码,这样减少许多不必要的操作,提高代码运算速度。
⑹ 使用软件流水技术,软件流水是一种对循环中的指令进行调度优化的技术,利用软件流水可生成非常紧凑的循环代码。当编译时采用-O2或-O3级别的优化选项时,编译器将对程序中的循环进行软件流水。通过软件流水的优化,可以大大提高循环代码的效率,极大地实现指令的并行性。
3.4 汇编程序级优化
通过 profile clock工具找出效率很低的部分,使用线形汇编继续优化。线性汇编语言是 C6000系列 DSP独有的一种编程语言,介于高级语言和低级语言之间。和标准的汇编语言不同的是,在编写线性汇编程序时可不必考虑指令的延时、指令的并行、寄存器的使用和功能单元的分配等,汇编优化器将根据代码的情况自动确定这些信息。汇编程序优化可通过对自动编译生成的汇编文件进行修改而进行。汇编优化其实就是根据以上各个方面的特点,采取针对性的方法,以获得尽可能高的程序效率。常用的汇编伪指令如下:
⑴ 定义一个可被汇编优化器优化且可被 C/C++当做函数调用的线性汇编代码段的伪指令:
label .cproc [ var1,[var2,…] ]
.endproc
⑵ 定义一个可被汇编优化器优化的线性汇编代码段的伪指令:
label .proc [ reg1,[reg2,…] ]
.endproc [ reg1,[reg2,…] ]
线性汇编优化时还需要考虑以下几个方面:① 平均分配使用功能单元,提高代码的并
行度。② 使流水线核心循环的时钟周期数昀小。
4 实验结果
经过以上各种算法优化后,基于DSP硬件平台DM642 EVM的H.264编码算法的性能得到了极大提高。实验中采用Foreman、Container、News三个H.264标准测试序列,分别代表高、中、低运动格式,采用IPP编码模式,对优化前后的算法进行了测试。
表3给出了优化前后对各种标准测试序列进行编码后的测试结果,算法优化在保证图象质量的前提下,极大提高了编码速度,视频图象较好地实现了实时性编码要求。
本文重点探讨了H.264视频编码算法在DM642 EVM硬件平台上的实现和优化,经过优化后算法具有较好的实现性和实时性。在此基础上,还可以在调整代码结构方面进行优化,使其更加适合DSP的指令系统。此外还可以更合理的利用TMS320DM642芯片的结构和丰富的外部接口,更高效的实现编解码器算法。
- 在FPGA上实现H.264/AVC 视频编码标准(07-23)
- 用数字信号处理器优化视频编码器(03-11)
- 基于ADSP-BF561的H.264视频编码器的实现(01-10)
- 基于ADSP-BF561处理器的视频编码器平台(01-16)
- 基于嵌入式平台的视频编码器的实现(07-30)
- 基于ADSP-BF561的H.264视频编码器系统的实现(03-05)