流输入读取的多媒体扩展指令的设计与实现方法

文档序号:7965357阅读:176来源:国知局
专利名称:流输入读取的多媒体扩展指令的设计与实现方法
技术领域
本发明属于处理器设计技术领域,应用于多媒体处理器的设计,具体涉及一种针对音视频解码中解码数据码流输入(简称流输入)读取指令的设计与实现方法。
背景技术
在几乎所有的图像与视频压缩标准中,如JPEG、JPEG2000、MPEG-1、MPEG-2、MPEG-4、H.264,解码时,都要先对编码信息进行解码如MPEG-1和MPEG-2的音频协议第三层(MP3)的头信息和边信息中包含Huffman表、量化因子等用来解码编码数据的信息,在解码过程中要对这些包含编码信息的码流进行实时读取。图1为在32位RISC上实现流输入功能的程序流程图(以字节为读取单位),首先判断字节数据缓冲是否空,如空则从内存中读取1字节数据放入字节数据缓冲寄存器中,然后判断要读取的码流长度(Len)是否小于字缓冲寄存器中剩余的Bits数(Left),如小于则读取Len位Bits并更新字节缓冲寄存器中剩余的Bits数,如果大于则首先把字节缓冲寄存器中剩余的Bits数读出来,并且更新Len(Len-=Left)和Left(Left=8),然后再判断Len是否大于8,如果大于则直接读取一个字节,并且更新Len(Len-=8)和Left(Left=8),然后再判断Len是否大于8,直到Len小于8为止,当Len小于8时,从字节缓冲寄存器中读取Len Bits并更新Left,最后将读取的所有Bits放入返回值中返回。
上述程序在兼容SPARC V8指令集的32位通用RISC(LEON2)上对应63条汇编指令,在MP3解码过程中占用全部解码时间的5.5%。由于流输入操作普遍存在于各种音视频解码过程中,因此如果能在通用RISC的指令集上添加专门针对流输入读取的指令会有效的提高处理器对多媒体解码处理的性能。从申请人对现有的文献进行检索,还没有发现公开的流输入读取指令设计及其硬件实现结构与方法。

发明内容
本发明的目的在于,提供流输入读取的多媒体扩展指令的设计与实现方法。该方法能在通用RISC的指令集上添加专门针对流输入读取的指令,能够有效的提高处理器对多媒体解码处理的性能。
为了实现上述任务,本发明采取以下的技术解决方案流输入读取的多媒体扩展指令的设计与实现方法,其特征在于,该方法针对音视频解码中流数掘输入读取设计了4条媒体扩展指令,其硬件实现结构包括两个32比特的缓冲寄存器、读取码流的地址寄存器(Addr)、Flag标志寄存器、Left寄存器与两个任意位移位器。
码流读初始化(Bini)指令用来设置读取码流的地址寄存器(Addr),装载两个32Bit的初始数掘到两个码流缓冲寄存器,两个寄存器交替地从数据Cache中装载数据,设置Flag标志寄存器与Left寄存器;由标志Flag决定当前存放前面码流的缓冲寄存器;码流读取(Bread)指令从码流缓冲寄存器中读取32位以内的任意Bit流数掘,数据装载(Bload)指令从数据Cache装载32Bit的字到任一码流缓冲寄存器中;当前码流地址返回(bpos)指令返回码流读取操作中的Left与Addr寄存器值;每次使用任意位移位操作读取需要的Len位码流后Left=Left-Len,当Left小于等于0时,需要装载32位码流数据到空的码流缓冲寄存器中,同时反转Flag标志寄存器,同时Left=32+Left;对于Len<=Left,可在一个节拍内实现码流读取,使用32位的任意位左移/右移移位器各1个;对于Len>Left,可在两个节拍内实现码流读取以及使用2个32位的任意位左移/右移位器的共享方法;对于一些数据加减法操作不需要加法器,可用简单的取反加1和取反逻辑实现。
本发明设计了该流数据读取指令的硬件实现电路以及在处理器中的流水线划分,给出了其在基于SPARC V8处理器中具体指令编码方式,实验证明该扩展指令的效率是手工优化的SPARC V8处理器指令实现的5-8倍。


图1Libmad(MP3解码程序)中流输入读取程序流程图;图2双缓冲寄存器的更新机制;图3Len<=Left时,流输入读取电路的数据流;图4Len>Left时,流输入读取电路的数据流;图5数据装载时电路中的数据流;图6用已有的SPARC V8指令实现码流读取。
以下结合附图和发明人给出的实施例对本发明作进一步的详细说明。
具体实施例方式
按照上述技术方案,本发明实际是一种针对音视频解码程序中解码数据流读取的处理器扩展指令设计及硬件实现结构与方法。其硬件实现结构包括两个32比特的缓冲寄存器、读取码流的地址寄存器(Addr)、Flag标志寄存器、Left寄存器与两个任意位移位器。
假设每次读取的比特数不大于32,因此需要两个32比特的缓冲寄存器Buffer0、Buffer1,两个寄存器交替地从数据Cache中装载数据,由标志Flag决定当前存放前面码流的缓冲寄存器。具体来说,当Flag为1,Buffer1存放前面码流,读取码流时,先从Buffer1中读取,如果Buffer1不够,再从Buffer0读取;当Flag为0,Buffer0存放前面码流,读取码流时,先从Buffer0中读取,如果Buffer0不够,再从Buffer1读取;另外,用Left寄存器表示包含前面码流的缓冲寄存器还有多少个比特位没有被读取。每次读取码流后,Left=Left-Len,当Left小于等于0时,需要装载数据到为空的码流缓冲寄存器中,同时反转Flag标志寄存器,Left=32+Left。双缓冲寄存器的具体更新机制可用图2表示。根据图2所示的更新方法,可分两种情况(Len<=Left和Len>Left)具体描述电路中的数据流,分别如图3和图4所示。
当Len<=Left时,读取码流只需要一个时钟周期,在这个时钟周期里,实现从Buffer寄存器到out寄存器的计算与传送,同时Buffer得到更新;当Len>Left时,需要两个时钟周期。out寄存器返回要读取的码流,且存放于低位,其余位为零。这样得到的out寄存器的值可直接参与解码应用。具体实现时,可以将out寄存器连接到处理器中的一个通用寄存器。另外,所需的移位器可以复用通用处理器中的移位器(不复用时,码流读取操作需要的移位器个数为两个),当在图4所示的Len>Left情况,在T2节拍,可以复用T1节拍中使用过的移位器。
整个解决方案涉及到一些加减法操作,但可以用简单的取反加1和取反逻辑实现,并不需要加法器。在读取码流时,需计算移位次数32-len,由于len范围为[1,32],可将len低5位取反加1即可算出32-len。在装载数据时,需计算Left=32+Left,注意到Left的范围为[-31,32],将Left用8位补码表示,如果Left等于0,直接赋Left为00100000;如果Left小于0(此时Left高三位必然为1),将高三位取反即可。
1.流输入读取的指令设计设计的实现流输入读取功能的指令Bini、Bread、Bload与Bpos的数据流描述如下,其中T1、T2分别表示两个节拍,Bread指令后面应跟有Bload指令。
Bini reg译码阶段根据指令码中reg的编号读取reg的值。
执行阶段
T1将寄存器reg的值写入Addr中;T2根据Addr从数据Cache中装入64Bits到Buffer[1,0]中,寄存器更新如下Addr=Addr+8,Left=32,Flag=1。
Bread reg or imm_Len译码阶段当指令中表示码流长度(Len)的操作数为立即数寻址时,从指令中得到该值;当为寄存器寻址时,根据寄存器编号,读取该寄存器的值;然后将Len与Left相减。
执行阶段根据Len与Left的相减结果,有两种情况①当Len<=Left时T1根据Flag选择Buffer1或Buffer0,对该Buffer逻辑右移32-Len位输出到out寄存器中;同时将该Buffer值输出到另一移位器,逻辑左移Len位,用来更新该Buffer值;寄存器更新Left=Left-Len。
②当Len>Left时T1根据Flag选择包含后面码流的Buffer(设为Buffer0,如图4所示),对该Buffer逻辑右移Left位,输出结果记为tmp1,同时将Buffer值送入到另一移位器,逻辑左移Len-Left位,输出结果记为tmp2,寄存器更新Bufffer0=tmp2,Buffer1=tmp1 ORBuffer1。
T2将Buffer1送入到移位器,逻辑右移32-Len,输出到out寄存器中。同时Left=Left-Len。
Bload译码阶段分析Left,如果Left小于等于0,在执行阶段做数据装载操作;否则在执行阶段不做任何操作。
执行阶段(Left小于等于0)T1Flag为1,选择buffer1;Flag为0,选择buffer0。根据Addr,从数据Cache装入32Bits到被选中的buffer中。Addr=Addr+4;Flag=~Flag;Left=32+Left。
bpos reg1,reg2译码阶段从指令中得到reg1、reg2的编号。
执行阶段T1将Left写入reg1;将Addr写入reg2中。
2.码流读取指令的一种实现上面一般化地描述了码流读取指令的功能和数据流,在这里我们给出在SPARC体系结构上实现这些特殊指令的具体例子。将码流读取指令融入SPARC结构主要涉及到指令的编码以及这些指令如何与已有的寄存器的值交互。指令编码采用SPARC V8中第三种编码格式,并且op=2,该格式如下所示Op=2

3129 24 18 13 12 40具体编码格式如下所示,码流读取指令的硬件电路中的寄存器(比如Left、Addr)没有编码,因为这些指令总是默认地使用这些寄存器。由于SPARC是RISC结构,所以指令的操作数多为寄存器,其中Bread指令的操作数(表示长度)既可以由立即数表示,也可以由寄存器来表示。Bread指令的输出结果总是默认地存放到%o0寄存器,这是因为在SPARC结构中,%o0寄存器是用来存放函数返回值的寄存器。
bini Rs2

31 2924 18 13 12 4 0bread Rs2 or length


31 29*24 18 13 12 7*0bpos Rs1,Rd

31 29 2418 13 03.流输入读取指令效率分析流输入读取指令的运行效率分析需要比较添加扩展指令前后实现同样的码流读取所需要的指令条数。由于码流读取大多应用于解码程序,而这种解码程序一般用高级语言实现,因此在这里引入码流读取的一种高级语言模型(C语言),使用两个函数实现流输入读取Bitinit(struct Bitptr*ptr,unsigned word*pword);
unsigned long Bitread(struct Bitptr*ptr,int Len);
其中结构体Bitptr定义如下struct Bitptr{ unsigned int*ptr_word;
unsigned int Cur_word;
unsigned short Left;
}参数ptr指向当前要读取的比特,结构体中成员ptr_word代表下一个要装载的字在数据缓冲的内存地址;Cur_word是当前字数据缓冲,当前要读取的比特首先从该缓冲中读取,如果不够,再根据ptr_word装载下一个字到数据缓冲;Left表示在当前的字数据缓冲中还有多少比特没有被读取。函数Bit_init( )依靠pword参数对ptr指向的结构体初始化;函数Bitread( )根据ptr和要读取的比特数(Len)返回一个32位的无符号整数,该整数的低Len位(按从左到右的顺序)就是要读取的码流,其余位为零。
当没有添加码流读取指令时,用SPARC V8汇编指令实现上述两个函数,%o寄存器用来传递参数,%o0传递第一个参数,%o1传递第二个参数,……,依此类推,%o0用来传递返回值;最后面两条指令retl,nop用于函数返回。如下所示的函数实现所用的SPARC V8指令不是用编译器生成的,而是手工编写的优化指令,基本是用现有的SPARC V8指令实现流输入读取的最快速度。
Bitinit:
st %o1,[%o0]ld [%o1],%o1st %o1,[%o0+4]set32,%o1sth %o1,[%o0+8]retlnop
Bitread该函数的手动汇编的优化指令与流程图如图6所示。
当使用流输入读取指令时,上述函数的汇编指令实现如下Bitinit:
Bini %o1retlnopBitread:
Bread %o1Bloadretlnop因为流输入读取一般是一次初始化,多次读取,因此读取效率的提高主要取决于Bitread( ),使用扩展的流输入读取指令后,函数Bitread( )所需要的指令数为4,而在图6的两个分支分别用了15、23条指令,因此使用流输入读取指令是非常高效的。在程序中需要读取码流的地方都可以手工插入Bread指令而代替Bitread函数的调用,省略了与之相关的参数传递和函数返回的开销,效率更高,但将使程序员的工作量增大,因此用Bread指令精简地实现已有的流输入读取函数不失为一种好的方法。
权利要求
1.流输入读取的多媒体扩展指令的设计与实现方法,其特征在于,该方法针对音视频解码中流数据输入读取设计了4条媒体扩展指令,其硬件实现结构包括两个32比特的缓冲寄存器、读取码流的地址寄存器(Addr)、Flag标志寄存器、Left寄存器与两个任意位移位器;码流读初始化(Bini)指令用来设置读取码流的地址寄存器(Addr),装载两个32Bit的初始数据到两个码流缓冲寄存器,两个寄存器交替地从数据Cache中装载数据,设置Flag标志寄存器与Left寄存器;由标志Flag决定当前存放前面码流的缓冲寄存器;码流读取(Bread)指令从码流缓冲寄存器中读取32位以内的任意Bit流数据,数据装载(Bload)指令从数据Cache装载32Bit的字到任一码流缓冲寄存器中;当前码流地址返回(bpos)指令返回码流读取操作中的Left与Addr寄存器值;每次使用任意位移位操作读取需要的Len位码流后Left=Left-Len,当Left小于等于0时,需要装载32位码流数据到空的码流缓冲寄存器中,同时反转Flag标志寄存器,同时Left=32+Left;对于Len<=Left,可在一个节拍内实现码流读取,使用32位的任意位左移/右移移位器各1个;对于Len>Left,可在两个节拍内实现码流读取以及使用2个32位的任意位左移/右移位器的共享方法;对于一些数据加减法操作不需要加法器,可用简单的取反加1和取反逻辑实现。
全文摘要
本发明公开了一种流输入读取的多媒体扩展指令的设计与实现方法,该方法针对音视频解码中流数据输入读取设计了4条媒体扩展指令,其硬件实现结构包括两个32比特的缓冲寄存器、读取码流的地址寄存器(Addr)、Flag标志寄存器、Left寄存器与两个任意位移位器;该扩展指令包括指令读初始化(Bini),码流读取(Bread),数据装载(Bload),当前码流地址返回(Bpos)构成,并设计了该流数据读取指令的硬件实现电路以及在处理器中的流水线划分,给出了其在基于SPARC V8处理器中具体指令编码方式,实验证明该扩展指令的效率是手工优化的SPARC V8处理器指令实现的5-8倍。能够有效的提高处理器对多媒体解码处理的性能。
文档编号H04N7/26GK1912925SQ20061010506
公开日2007年2月14日 申请日期2006年8月29日 优先权日2006年8月29日
发明者梅魁志, 郑南宁, 吴奇, 李国辉, 张元林, 黄畅 申请人:西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1