2.尽量减少数据类型的大小。可以用 8位数据就不用 16位数据 , 这样不但节省空间 ,而且能提高L1D的使用效率。因为 L1D行的大小是固定的, 在一行内如果采用 8位数据 比 16位数据可多放一倍 , 从而减少程序中 Cache缺失情况的发生。
3.采用乒乓缓存结构, 提高 Cache命中率 , 减少 CPU等待时间。
在视频编码模块中,当前帧和参考帧数据放在片外存储器,在编码过程中需要依次对图像帧中的每个宏块进行操作。但宏块直接从片外内存读取,这就会发生CPU等待。可以设置两对片上缓存,一对存放当前帧宏块,一对存放参考帧宏块,它们以乒乓方式工作。乒乓缓冲工作模式如图1所示。编码前E DMA将片外的当前帧中编码宏块数据和在搜索范围内的参考帧宏块数据搬移到片上内存。在用EDMA搬移数据到其中一块片内缓存的同时,,处理器可以对另一块缓存中的数据进行处理。经过这样的修改,CPU一直从片上读取存储器数据大大减少了CPU阻塞情况的发生,提高了编码速度。
图2 乒乓缓冲存储器结构
SAD和像素插值的优化
SAD(Sum ofAbsolute Difference)是运动估计模块[7]关键模块 , 而 DM642提供了一套丰富的视频和图像专用指令可以高效实现运动估计算法。
LDNDW (Load Non2alignedDoubleWord)指令,可以一次读取 64位无边界数据。这个指令可以从当前帧中和参考帧一次读取8个 8位像素数据。因此可以提高当前帧和参考帧宏块数据的搬移速度。
SUBABS4(Subtractwith Absolute)指令,计算在两组 8位数据包之间的 4个绝对值之差。
DOPTPU4是个计算 4对 8位数据乘积求和的运算。两个 DOPTPU4可在单周期内并行 , 所以可极大地提高 SAD的计算速度。具体步骤如下:
1)两个 LDNDW指令从当前帧和参考帧取 8个像素;
2)两个 SUBABS4计算 8个像素的差值;
3)两个 DOTPU4计算 8个像素乘积求和。
像素插值也是个计算量大的模块。AVG4指令可执行 4个 8位数值平均值计算。AVG2可以执行 2个 16位数据的平均计算。SHRMB(Shift Right andMerge Byte) 右移第 2个寄存器 , 把第 1个寄存器的低位作为高字节。AVG4计算平均值,SHRMB处理结果。
此外笔者参考 TI提供的 IMGLIB支持库 该库中还包括了许多常用的图像和视频处理的函数 ,以完成 DCT、 IDCT (Inverse Direct Cosine Transform)、中值滤波等功能 , 这些函数都是经过汇编优化。完全能够实现软件流水, 执行效率很高。采用标准序列 Coastguard.yuv编码 5帧数据,主要函数优化前后性能比较,如表 1所示。
表 1 各个函数优化性能比较
Tab1Performance of functions by analysis