專利名稱:流輸入讀取的多媒體擴(kuò)展指令的設(shè)計(jì)與實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于處理器設(shè)計(jì)技術(shù)領(lǐng)域,應(yīng)用于多媒體處理器的設(shè)計(jì),具體涉及一種針對(duì)音視頻解碼中解碼數(shù)據(jù)碼流輸入(簡(jiǎn)稱流輸入)讀取指令的設(shè)計(jì)與實(shí)現(xiàn)方法。
背景技術(shù):
在幾乎所有的圖像與視頻壓縮標(biāo)準(zhǔn)中,如JPEG、JPEG2000、MPEG-1、MPEG-2、MPEG-4、H.264,解碼時(shí),都要先對(duì)編碼信息進(jìn)行解碼如MPEG-1和MPEG-2的音頻協(xié)議第三層(MP3)的頭信息和邊信息中包含Huffman表、量化因子等用來(lái)解碼編碼數(shù)據(jù)的信息,在解碼過(guò)程中要對(duì)這些包含編碼信息的碼流進(jìn)行實(shí)時(shí)讀取。圖1為在32位RISC上實(shí)現(xiàn)流輸入功能的程序流程圖(以字節(jié)為讀取單位),首先判斷字節(jié)數(shù)據(jù)緩沖是否空,如空則從內(nèi)存中讀取1字節(jié)數(shù)據(jù)放入字節(jié)數(shù)據(jù)緩沖寄存器中,然后判斷要讀取的碼流長(zhǎng)度(Len)是否小于字緩沖寄存器中剩余的Bits數(shù)(Left),如小于則讀取Len位Bits并更新字節(jié)緩沖寄存器中剩余的Bits數(shù),如果大于則首先把字節(jié)緩沖寄存器中剩余的Bits數(shù)讀出來(lái),并且更新Len(Len-=Left)和Left(Left=8),然后再判斷Len是否大于8,如果大于則直接讀取一個(gè)字節(jié),并且更新Len(Len-=8)和Left(Left=8),然后再判斷Len是否大于8,直到Len小于8為止,當(dāng)Len小于8時(shí),從字節(jié)緩沖寄存器中讀取Len Bits并更新Left,最后將讀取的所有Bits放入返回值中返回。
上述程序在兼容SPARC V8指令集的32位通用RISC(LEON2)上對(duì)應(yīng)63條匯編指令,在MP3解碼過(guò)程中占用全部解碼時(shí)間的5.5%。由于流輸入操作普遍存在于各種音視頻解碼過(guò)程中,因此如果能在通用RISC的指令集上添加專門(mén)針對(duì)流輸入讀取的指令會(huì)有效的提高處理器對(duì)多媒體解碼處理的性能。從申請(qǐng)人對(duì)現(xiàn)有的文獻(xiàn)進(jìn)行檢索,還沒(méi)有發(fā)現(xiàn)公開(kāi)的流輸入讀取指令設(shè)計(jì)及其硬件實(shí)現(xiàn)結(jié)構(gòu)與方法。
發(fā)明內(nèi)容
本發(fā)明的目的在于,提供流輸入讀取的多媒體擴(kuò)展指令的設(shè)計(jì)與實(shí)現(xiàn)方法。該方法能在通用RISC的指令集上添加專門(mén)針對(duì)流輸入讀取的指令,能夠有效的提高處理器對(duì)多媒體解碼處理的性能。
為了實(shí)現(xiàn)上述任務(wù),本發(fā)明采取以下的技術(shù)解決方案流輸入讀取的多媒體擴(kuò)展指令的設(shè)計(jì)與實(shí)現(xiàn)方法,其特征在于,該方法針對(duì)音視頻解碼中流數(shù)掘輸入讀取設(shè)計(jì)了4條媒體擴(kuò)展指令,其硬件實(shí)現(xiàn)結(jié)構(gòu)包括兩個(gè)32比特的緩沖寄存器、讀取碼流的地址寄存器(Addr)、Flag標(biāo)志寄存器、Left寄存器與兩個(gè)任意位移位器。
碼流讀初始化(Bini)指令用來(lái)設(shè)置讀取碼流的地址寄存器(Addr),裝載兩個(gè)32Bit的初始數(shù)掘到兩個(gè)碼流緩沖寄存器,兩個(gè)寄存器交替地從數(shù)據(jù)Cache中裝載數(shù)據(jù),設(shè)置Flag標(biāo)志寄存器與Left寄存器;由標(biāo)志Flag決定當(dāng)前存放前面碼流的緩沖寄存器;碼流讀取(Bread)指令從碼流緩沖寄存器中讀取32位以內(nèi)的任意Bit流數(shù)掘,數(shù)據(jù)裝載(Bload)指令從數(shù)據(jù)Cache裝載32Bit的字到任一碼流緩沖寄存器中;當(dāng)前碼流地址返回(bpos)指令返回碼流讀取操作中的Left與Addr寄存器值;每次使用任意位移位操作讀取需要的Len位碼流后Left=Left-Len,當(dāng)Left小于等于0時(shí),需要裝載32位碼流數(shù)據(jù)到空的碼流緩沖寄存器中,同時(shí)反轉(zhuǎn)Flag標(biāo)志寄存器,同時(shí)Left=32+Left;對(duì)于Len<=Left,可在一個(gè)節(jié)拍內(nèi)實(shí)現(xiàn)碼流讀取,使用32位的任意位左移/右移移位器各1個(gè);對(duì)于Len>Left,可在兩個(gè)節(jié)拍內(nèi)實(shí)現(xiàn)碼流讀取以及使用2個(gè)32位的任意位左移/右移位器的共享方法;對(duì)于一些數(shù)據(jù)加減法操作不需要加法器,可用簡(jiǎn)單的取反加1和取反邏輯實(shí)現(xiàn)。
本發(fā)明設(shè)計(jì)了該流數(shù)據(jù)讀取指令的硬件實(shí)現(xiàn)電路以及在處理器中的流水線劃分,給出了其在基于SPARC V8處理器中具體指令編碼方式,實(shí)驗(yàn)證明該擴(kuò)展指令的效率是手工優(yōu)化的SPARC V8處理器指令實(shí)現(xiàn)的5-8倍。
圖1Libmad(MP3解碼程序)中流輸入讀取程序流程圖;圖2雙緩沖寄存器的更新機(jī)制;圖3Len<=Left時(shí),流輸入讀取電路的數(shù)據(jù)流;圖4Len>Left時(shí),流輸入讀取電路的數(shù)據(jù)流;圖5數(shù)據(jù)裝載時(shí)電路中的數(shù)據(jù)流;圖6用已有的SPARC V8指令實(shí)現(xiàn)碼流讀取。
以下結(jié)合附圖和發(fā)明人給出的實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。
具體實(shí)施例方式
按照上述技術(shù)方案,本發(fā)明實(shí)際是一種針對(duì)音視頻解碼程序中解碼數(shù)據(jù)流讀取的處理器擴(kuò)展指令設(shè)計(jì)及硬件實(shí)現(xiàn)結(jié)構(gòu)與方法。其硬件實(shí)現(xiàn)結(jié)構(gòu)包括兩個(gè)32比特的緩沖寄存器、讀取碼流的地址寄存器(Addr)、Flag標(biāo)志寄存器、Left寄存器與兩個(gè)任意位移位器。
假設(shè)每次讀取的比特?cái)?shù)不大于32,因此需要兩個(gè)32比特的緩沖寄存器Buffer0、Buffer1,兩個(gè)寄存器交替地從數(shù)據(jù)Cache中裝載數(shù)據(jù),由標(biāo)志Flag決定當(dāng)前存放前面碼流的緩沖寄存器。具體來(lái)說(shuō),當(dāng)Flag為1,Buffer1存放前面碼流,讀取碼流時(shí),先從Buffer1中讀取,如果Buffer1不夠,再?gòu)腂uffer0讀??;當(dāng)Flag為0,Buffer0存放前面碼流,讀取碼流時(shí),先從Buffer0中讀取,如果Buffer0不夠,再?gòu)腂uffer1讀?。涣硗?,用Left寄存器表示包含前面碼流的緩沖寄存器還有多少個(gè)比特位沒(méi)有被讀取。每次讀取碼流后,Left=Left-Len,當(dāng)Left小于等于0時(shí),需要裝載數(shù)據(jù)到為空的碼流緩沖寄存器中,同時(shí)反轉(zhuǎn)Flag標(biāo)志寄存器,Left=32+Left。雙緩沖寄存器的具體更新機(jī)制可用圖2表示。根據(jù)圖2所示的更新方法,可分兩種情況(Len<=Left和Len>Left)具體描述電路中的數(shù)據(jù)流,分別如圖3和圖4所示。
當(dāng)Len<=Left時(shí),讀取碼流只需要一個(gè)時(shí)鐘周期,在這個(gè)時(shí)鐘周期里,實(shí)現(xiàn)從Buffer寄存器到out寄存器的計(jì)算與傳送,同時(shí)Buffer得到更新;當(dāng)Len>Left時(shí),需要兩個(gè)時(shí)鐘周期。out寄存器返回要讀取的碼流,且存放于低位,其余位為零。這樣得到的out寄存器的值可直接參與解碼應(yīng)用。具體實(shí)現(xiàn)時(shí),可以將out寄存器連接到處理器中的一個(gè)通用寄存器。另外,所需的移位器可以復(fù)用通用處理器中的移位器(不復(fù)用時(shí),碼流讀取操作需要的移位器個(gè)數(shù)為兩個(gè)),當(dāng)在圖4所示的Len>Left情況,在T2節(jié)拍,可以復(fù)用T1節(jié)拍中使用過(guò)的移位器。
整個(gè)解決方案涉及到一些加減法操作,但可以用簡(jiǎn)單的取反加1和取反邏輯實(shí)現(xiàn),并不需要加法器。在讀取碼流時(shí),需計(jì)算移位次數(shù)32-len,由于len范圍為[1,32],可將len低5位取反加1即可算出32-len。在裝載數(shù)據(jù)時(shí),需計(jì)算Left=32+Left,注意到Left的范圍為[-31,32],將Left用8位補(bǔ)碼表示,如果Left等于0,直接賦Left為00100000;如果Left小于0(此時(shí)Left高三位必然為1),將高三位取反即可。
1.流輸入讀取的指令設(shè)計(jì)設(shè)計(jì)的實(shí)現(xiàn)流輸入讀取功能的指令Bini、Bread、Bload與Bpos的數(shù)據(jù)流描述如下,其中T1、T2分別表示兩個(gè)節(jié)拍,Bread指令后面應(yīng)跟有Bload指令。
Bini reg譯碼階段根據(jù)指令碼中reg的編號(hào)讀取reg的值。
執(zhí)行階段
T1將寄存器reg的值寫(xiě)入Addr中;T2根據(jù)Addr從數(shù)據(jù)Cache中裝入64Bits到Buffer[1,0]中,寄存器更新如下Addr=Addr+8,Left=32,F(xiàn)lag=1。
Bread reg or imm_Len譯碼階段當(dāng)指令中表示碼流長(zhǎng)度(Len)的操作數(shù)為立即數(shù)尋址時(shí),從指令中得到該值;當(dāng)為寄存器尋址時(shí),根據(jù)寄存器編號(hào),讀取該寄存器的值;然后將Len與Left相減。
執(zhí)行階段根據(jù)Len與Left的相減結(jié)果,有兩種情況①當(dāng)Len<=Left時(shí)T1根據(jù)Flag選擇Buffer1或Buffer0,對(duì)該Buffer邏輯右移32-Len位輸出到out寄存器中;同時(shí)將該Buffer值輸出到另一移位器,邏輯左移Len位,用來(lái)更新該Buffer值;寄存器更新Left=Left-Len。
②當(dāng)Len>Left時(shí)T1根據(jù)Flag選擇包含后面碼流的Buffer(設(shè)為Buffer0,如圖4所示),對(duì)該Buffer邏輯右移Left位,輸出結(jié)果記為tmp1,同時(shí)將Buffer值送入到另一移位器,邏輯左移Len-Left位,輸出結(jié)果記為tmp2,寄存器更新Bufffer0=tmp2,Buffer1=tmp1 ORBuffer1。
T2將Buffer1送入到移位器,邏輯右移32-Len,輸出到out寄存器中。同時(shí)Left=Left-Len。
Bload譯碼階段分析Left,如果Left小于等于0,在執(zhí)行階段做數(shù)據(jù)裝載操作;否則在執(zhí)行階段不做任何操作。
執(zhí)行階段(Left小于等于0)T1Flag為1,選擇buffer1;Flag為0,選擇buffer0。根據(jù)Addr,從數(shù)據(jù)Cache裝入32Bits到被選中的buffer中。Addr=Addr+4;Flag=~Flag;Left=32+Left。
bpos reg1,reg2譯碼階段從指令中得到reg1、reg2的編號(hào)。
執(zhí)行階段T1將Left寫(xiě)入reg1;將Addr寫(xiě)入reg2中。
2.碼流讀取指令的一種實(shí)現(xiàn)上面一般化地描述了碼流讀取指令的功能和數(shù)據(jù)流,在這里我們給出在SPARC體系結(jié)構(gòu)上實(shí)現(xiàn)這些特殊指令的具體例子。將碼流讀取指令融入SPARC結(jié)構(gòu)主要涉及到指令的編碼以及這些指令如何與已有的寄存器的值交互。指令編碼采用SPARC V8中第三種編碼格式,并且op=2,該格式如下所示Op=2
3129 24 18 13 12 40具體編碼格式如下所示,碼流讀取指令的硬件電路中的寄存器(比如Left、Addr)沒(méi)有編碼,因?yàn)檫@些指令總是默認(rèn)地使用這些寄存器。由于SPARC是RISC結(jié)構(gòu),所以指令的操作數(shù)多為寄存器,其中Bread指令的操作數(shù)(表示長(zhǎng)度)既可以由立即數(shù)表示,也可以由寄存器來(lái)表示。Bread指令的輸出結(jié)果總是默認(rèn)地存放到%o0寄存器,這是因?yàn)樵赟PARC結(jié)構(gòu)中,%o0寄存器是用來(lái)存放函數(shù)返回值的寄存器。
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.流輸入讀取指令效率分析流輸入讀取指令的運(yùn)行效率分析需要比較添加擴(kuò)展指令前后實(shí)現(xiàn)同樣的碼流讀取所需要的指令條數(shù)。由于碼流讀取大多應(yīng)用于解碼程序,而這種解碼程序一般用高級(jí)語(yǔ)言實(shí)現(xiàn),因此在這里引入碼流讀取的一種高級(jí)語(yǔ)言模型(C語(yǔ)言),使用兩個(gè)函數(shù)實(shí)現(xiàn)流輸入讀取Bitinit(struct Bitptr*ptr,unsigned word*pword);
unsigned long Bitread(struct Bitptr*ptr,int Len);
其中結(jié)構(gòu)體Bitptr定義如下struct Bitptr{ unsigned int*ptr_word;
unsigned int Cur_word;
unsigned short Left;
}參數(shù)ptr指向當(dāng)前要讀取的比特,結(jié)構(gòu)體中成員ptr_word代表下一個(gè)要裝載的字在數(shù)據(jù)緩沖的內(nèi)存地址;Cur_word是當(dāng)前字?jǐn)?shù)據(jù)緩沖,當(dāng)前要讀取的比特首先從該緩沖中讀取,如果不夠,再根據(jù)ptr_word裝載下一個(gè)字到數(shù)據(jù)緩沖;Left表示在當(dāng)前的字?jǐn)?shù)據(jù)緩沖中還有多少比特沒(méi)有被讀取。函數(shù)Bit_init( )依靠pword參數(shù)對(duì)ptr指向的結(jié)構(gòu)體初始化;函數(shù)Bitread( )根據(jù)ptr和要讀取的比特?cái)?shù)(Len)返回一個(gè)32位的無(wú)符號(hào)整數(shù),該整數(shù)的低Len位(按從左到右的順序)就是要讀取的碼流,其余位為零。
當(dāng)沒(méi)有添加碼流讀取指令時(shí),用SPARC V8匯編指令實(shí)現(xiàn)上述兩個(gè)函數(shù),%o寄存器用來(lái)傳遞參數(shù),%o0傳遞第一個(gè)參數(shù),%o1傳遞第二個(gè)參數(shù),……,依此類推,%o0用來(lái)傳遞返回值;最后面兩條指令retl,nop用于函數(shù)返回。如下所示的函數(shù)實(shí)現(xiàn)所用的SPARC V8指令不是用編譯器生成的,而是手工編寫(xiě)的優(yōu)化指令,基本是用現(xiàn)有的SPARC V8指令實(shí)現(xiàn)流輸入讀取的最快速度。
Bitinit:
st %o1,[%o0]ld [%o1],%o1st %o1,[%o0+4]set32,%o1sth %o1,[%o0+8]retlnop
Bitread該函數(shù)的手動(dòng)匯編的優(yōu)化指令與流程圖如圖6所示。
當(dāng)使用流輸入讀取指令時(shí),上述函數(shù)的匯編指令實(shí)現(xiàn)如下Bitinit:
Bini %o1retlnopBitread:
Bread %o1Bloadretlnop因?yàn)榱鬏斎胱x取一般是一次初始化,多次讀取,因此讀取效率的提高主要取決于Bitread( ),使用擴(kuò)展的流輸入讀取指令后,函數(shù)Bitread( )所需要的指令數(shù)為4,而在圖6的兩個(gè)分支分別用了15、23條指令,因此使用流輸入讀取指令是非常高效的。在程序中需要讀取碼流的地方都可以手工插入Bread指令而代替Bitread函數(shù)的調(diào)用,省略了與之相關(guān)的參數(shù)傳遞和函數(shù)返回的開(kāi)銷,效率更高,但將使程序員的工作量增大,因此用Bread指令精簡(jiǎn)地實(shí)現(xiàn)已有的流輸入讀取函數(shù)不失為一種好的方法。
權(quán)利要求
1.流輸入讀取的多媒體擴(kuò)展指令的設(shè)計(jì)與實(shí)現(xiàn)方法,其特征在于,該方法針對(duì)音視頻解碼中流數(shù)據(jù)輸入讀取設(shè)計(jì)了4條媒體擴(kuò)展指令,其硬件實(shí)現(xiàn)結(jié)構(gòu)包括兩個(gè)32比特的緩沖寄存器、讀取碼流的地址寄存器(Addr)、Flag標(biāo)志寄存器、Left寄存器與兩個(gè)任意位移位器;碼流讀初始化(Bini)指令用來(lái)設(shè)置讀取碼流的地址寄存器(Addr),裝載兩個(gè)32Bit的初始數(shù)據(jù)到兩個(gè)碼流緩沖寄存器,兩個(gè)寄存器交替地從數(shù)據(jù)Cache中裝載數(shù)據(jù),設(shè)置Flag標(biāo)志寄存器與Left寄存器;由標(biāo)志Flag決定當(dāng)前存放前面碼流的緩沖寄存器;碼流讀取(Bread)指令從碼流緩沖寄存器中讀取32位以內(nèi)的任意Bit流數(shù)據(jù),數(shù)據(jù)裝載(Bload)指令從數(shù)據(jù)Cache裝載32Bit的字到任一碼流緩沖寄存器中;當(dāng)前碼流地址返回(bpos)指令返回碼流讀取操作中的Left與Addr寄存器值;每次使用任意位移位操作讀取需要的Len位碼流后Left=Left-Len,當(dāng)Left小于等于0時(shí),需要裝載32位碼流數(shù)據(jù)到空的碼流緩沖寄存器中,同時(shí)反轉(zhuǎn)Flag標(biāo)志寄存器,同時(shí)Left=32+Left;對(duì)于Len<=Left,可在一個(gè)節(jié)拍內(nèi)實(shí)現(xiàn)碼流讀取,使用32位的任意位左移/右移移位器各1個(gè);對(duì)于Len>Left,可在兩個(gè)節(jié)拍內(nèi)實(shí)現(xiàn)碼流讀取以及使用2個(gè)32位的任意位左移/右移位器的共享方法;對(duì)于一些數(shù)據(jù)加減法操作不需要加法器,可用簡(jiǎn)單的取反加1和取反邏輯實(shí)現(xiàn)。
全文摘要
本發(fā)明公開(kāi)了一種流輸入讀取的多媒體擴(kuò)展指令的設(shè)計(jì)與實(shí)現(xiàn)方法,該方法針對(duì)音視頻解碼中流數(shù)據(jù)輸入讀取設(shè)計(jì)了4條媒體擴(kuò)展指令,其硬件實(shí)現(xiàn)結(jié)構(gòu)包括兩個(gè)32比特的緩沖寄存器、讀取碼流的地址寄存器(Addr)、Flag標(biāo)志寄存器、Left寄存器與兩個(gè)任意位移位器;該擴(kuò)展指令包括指令讀初始化(Bini),碼流讀取(Bread),數(shù)據(jù)裝載(Bload),當(dāng)前碼流地址返回(Bpos)構(gòu)成,并設(shè)計(jì)了該流數(shù)據(jù)讀取指令的硬件實(shí)現(xiàn)電路以及在處理器中的流水線劃分,給出了其在基于SPARC V8處理器中具體指令編碼方式,實(shí)驗(yàn)證明該擴(kuò)展指令的效率是手工優(yōu)化的SPARC V8處理器指令實(shí)現(xiàn)的5-8倍。能夠有效的提高處理器對(duì)多媒體解碼處理的性能。
文檔編號(hào)H04N7/26GK1912925SQ20061010506
公開(kāi)日2007年2月14日 申請(qǐng)日期2006年8月29日 優(yōu)先權(quán)日2006年8月29日
發(fā)明者梅魁志, 鄭南寧, 吳奇, 李國(guó)輝, 張?jiān)? 黃暢 申請(qǐng)人:西安交通大學(xué)