專利名稱:針對(duì)程序中循環(huán)的編譯方法、編譯設(shè)備和計(jì)算機(jī)系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種對(duì)包括循環(huán)的程序進(jìn)行編譯的方法、設(shè)備和計(jì)算機(jī)系統(tǒng),更具體地,涉及一種在VLIW(超長(zhǎng)指令字)處理器中對(duì)包括循環(huán)的程序進(jìn)行編譯的方法、設(shè)備和計(jì)算機(jī)系統(tǒng)。
背景技術(shù):
在傳統(tǒng)的計(jì)算機(jī)系統(tǒng)中,其硬件部分包括CPU(中央處理單元)、存儲(chǔ)器等。計(jì)算機(jī)系統(tǒng)通過(guò)執(zhí)行指令來(lái)進(jìn)行操作。傳統(tǒng)的指令集計(jì)算機(jī)包括RISC(精簡(jiǎn)指令集計(jì)算機(jī))和CISC(復(fù)雜指令集計(jì)算機(jī)),并且VLIW在微處理器設(shè)計(jì)領(lǐng)域中成為越來(lái)越普及的技術(shù)。與RISC和CISC處理器相比,VLIW處理器具有成本低、能耗低、結(jié)構(gòu)簡(jiǎn)單和處理速度快的優(yōu)點(diǎn)。
VLIW處理器使用包括可并行執(zhí)行的若干較短指令的固定長(zhǎng)度的長(zhǎng)指令。此外,在操作中,VLIW處理器不需要多個(gè)復(fù)雜的控制電路,而超標(biāo)量處理器協(xié)作以并行執(zhí)行時(shí)必須使用多個(gè)復(fù)雜的控制電路。
此外,VLIW處理器還將多于兩個(gè)的指令組合為指令包。編譯器預(yù)先對(duì)指令包進(jìn)行調(diào)度,以使VLIW處理器能夠快速地并行執(zhí)行指令,從而微處理器不需要執(zhí)行復(fù)雜的時(shí)序分析,而在超標(biāo)量RISC和CISC處理器中必須完成復(fù)雜的時(shí)序分析。
所謂的多發(fā)射處理器允許處理器在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行多個(gè)指令。有如下兩種多發(fā)射處理器1.超標(biāo)量處理器,每個(gè)時(shí)鐘周期執(zhí)行可變數(shù)量的指令,并且可使用諸如記分牌(score boarding)之類的技術(shù)由編譯設(shè)備(例如硬件和/或軟件)進(jìn)行靜態(tài)或動(dòng)態(tài)調(diào)度。
2.VLIW(超長(zhǎng)指令字)處理器,執(zhí)行格式化為一個(gè)較大指令或固定指令包的固定數(shù)量的指令。固有地對(duì)VLIW處理器進(jìn)行靜態(tài)調(diào)度。
VLIW指令通常包括若干子指令。每個(gè)子指令與處理器中的特定功能單元(即模塊)以及運(yùn)算集相對(duì)應(yīng)。例如,Computer Architecture的285-289頁(yè),a Quantitative Approach(2ndEdition)of Hennessy,John L.和David A.Patterson ,Morgan Kaufmann Publishers,Inc.,指出了一個(gè)VLIW指令包括兩個(gè)整數(shù)運(yùn)算、兩個(gè)浮點(diǎn)數(shù)運(yùn)算、兩個(gè)存儲(chǔ)器引導(dǎo)和分支。
VLIW處理器使用多個(gè)獨(dú)立的功能單元,每個(gè)功能單元用于執(zhí)行VLIW指令的一個(gè)子指令。這些操作的并行調(diào)度需要復(fù)雜的編譯方案和工具。
圖1示出了VLIW指令和VLIW處理器之間的關(guān)系。如圖1所示,VLIW指令包括四個(gè)子指令,分別是ADD int a,b;MUL double c,3.142;READ d,ARO;和BNZ loop,e。這四個(gè)子指令與VLIW處理器中的四個(gè)功能單元相對(duì)應(yīng),即整數(shù)功能單元(INT FU)、浮點(diǎn)數(shù)功能單元(Float FU)、數(shù)據(jù)存儲(chǔ)器(數(shù)據(jù)存儲(chǔ)器)和程序存儲(chǔ)器(程序存儲(chǔ)器)。
傳統(tǒng)的VLIW編譯設(shè)備獨(dú)立地解譯每個(gè)指令并產(chǎn)生機(jī)器代碼,即每個(gè)指令對(duì)應(yīng)于具有特定長(zhǎng)度(例如256比特)的一個(gè)VLIW二進(jìn)制指令。該編譯方案會(huì)導(dǎo)致操作余量的浪費(fèi),尤其是在循環(huán)結(jié)構(gòu)中。
循環(huán)是高級(jí)和低級(jí)語(yǔ)言中均具有基本程序結(jié)構(gòu)之一。在大多數(shù)DSP(數(shù)字信號(hào)處理)風(fēng)格的應(yīng)用程序中,使用大量循環(huán)來(lái)進(jìn)行諸如濾波、相關(guān)等的計(jì)算。實(shí)際上,循環(huán)結(jié)構(gòu)使處理器以最小程序存儲(chǔ)空間來(lái)執(zhí)行重復(fù)的指令塊。
在采用傳統(tǒng)編譯方法解譯指令之后,循環(huán)表達(dá)為機(jī)器(二進(jìn)制)指令。每個(gè)二進(jìn)制指令占用程序存儲(chǔ)器中的256個(gè)比特。如果循環(huán)的重復(fù)次數(shù)是K,則處理器實(shí)現(xiàn)整個(gè)循環(huán)結(jié)構(gòu)需要K個(gè)周期(假設(shè)整個(gè)循環(huán)結(jié)構(gòu)是要重復(fù)執(zhí)行一個(gè)循環(huán)并且是零開(kāi)銷的循環(huán))。因此,對(duì)于循環(huán)來(lái)說(shuō),傳統(tǒng)編譯方法的優(yōu)點(diǎn)之一是使處理器以有限的程序存儲(chǔ)空間來(lái)執(zhí)行長(zhǎng)許多的重復(fù)循環(huán)結(jié)構(gòu)。
對(duì)于非VLIW處理器,傳統(tǒng)編譯方法可以在程序存儲(chǔ)器空間占用和循環(huán)執(zhí)行效率兩方面達(dá)到最佳結(jié)果。然而,對(duì)于VLIW處理器,傳統(tǒng)編譯方法無(wú)法確保循環(huán)執(zhí)行效率。
眾所周知,由于VLIW處理器的指令系統(tǒng)比較復(fù)雜,所以編譯器產(chǎn)生的代碼質(zhì)量對(duì)其操作性能有顯著影響。此外,由于在VLIW代碼中使用大量循環(huán),并且循環(huán)結(jié)構(gòu)的操作時(shí)間占據(jù)整個(gè)操作時(shí)間的大部分,因此循環(huán)結(jié)構(gòu)的執(zhí)行效率直接影響整個(gè)VLIW處理器的操作效率。
在用傳統(tǒng)編譯方法對(duì)VLIW循環(huán)進(jìn)行編譯的情況下,循環(huán)結(jié)構(gòu)的執(zhí)行效率不高,從而造成循環(huán)時(shí)間的浪費(fèi),因此整個(gè)VLIW處理器的操作效率難以滿足需求。
例如,如果程序中的一個(gè)循環(huán)需要重復(fù)M次,則在用傳統(tǒng)編譯方法對(duì)VLIW循環(huán)進(jìn)行編譯時(shí),VLIW處理器中浪費(fèi)了2(M-1)個(gè)指令周期。在M值相對(duì)較大的情況下,將導(dǎo)致操作性能的顯著降低。
發(fā)明內(nèi)容
鑒于現(xiàn)有技術(shù)中存在的問(wèn)題,提出本發(fā)明,本發(fā)明的目的是提供一種對(duì)包括循環(huán)的程序進(jìn)行編譯的方法。在該程序中,循環(huán)包括K個(gè)指令(K≥2)并且重復(fù)M次(M≥2),該編譯方法包括以下步驟對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;將循環(huán)中的K個(gè)指令分為第一組合指令段、連接指令段和第二組合指令段,其中,在第一組合指令段中的指令和在第二組合指令段中的指令之間分別沒(méi)有資源沖突;以及編譯程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
根據(jù)本發(fā)明的另一方面,提供了一種對(duì)包括循環(huán)的程序進(jìn)行編譯的編譯設(shè)備。在該程序中,循環(huán)包括K個(gè)指令(K≥2)并且重復(fù)M次(M≥2),該編譯設(shè)備包括分析裝置,用于對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;劃分裝置,用于將循環(huán)中的K個(gè)指令分為第一組合指令段、連接指令段和第二組合指令段,其中,在第一組合指令段中的指令和在第二組合指令段中的指令之間分別沒(méi)有資源沖突;以及編譯裝置,用于編譯程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
根據(jù)本發(fā)明的另一方面,提供了一種計(jì)算機(jī)系統(tǒng)。該計(jì)算機(jī)系統(tǒng)包括存儲(chǔ)器、輸入和輸出設(shè)備以及針對(duì)包括循環(huán)的程序的編譯設(shè)備。在該程序中,循環(huán)包括K個(gè)指令(K≥2)并且重復(fù)M次(M≥2),該編譯設(shè)備包括分析裝置,用于對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;劃分裝置,用于將循環(huán)中的K個(gè)指令分為第一組合指令段、連接指令段和第二組合指令段,其中,在分別在第一組合指令段中的指令和在第二組合指令段中的指令之間沒(méi)有資源沖突;以及編譯裝置,用于編譯程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
通過(guò)使用根據(jù)本發(fā)明的對(duì)包括循環(huán)的程序進(jìn)行編譯的方法、設(shè)備或計(jì)算機(jī)系統(tǒng),可以顯著提高程序的周期效率。
根據(jù)以下參照附圖的本發(fā)明優(yōu)選實(shí)施例的詳細(xì)說(shuō)明,本發(fā)明的這些和其它目的、特征和優(yōu)點(diǎn)將變得顯而易見(jiàn)。
下面,將參考附圖詳細(xì)描述本發(fā)明的優(yōu)選實(shí)施例。
圖1是示意性地示出了傳統(tǒng)VLIW指令和VLIW處理器之間的關(guān)系的圖;圖2是根據(jù)本發(fā)明第一實(shí)施例、針對(duì)包括循環(huán)的程序的編譯方法的流程圖;圖3是圖2所示編譯方法的資源沖突分析步驟的流程圖;圖4(a)示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,對(duì)包括偶數(shù)個(gè)指令的循環(huán)進(jìn)行編譯的情況;圖4(b)示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,對(duì)包括奇數(shù)個(gè)指令的循環(huán)進(jìn)行編譯的情況;圖5示出了VLIW循環(huán)及其編譯結(jié)果的示例;
圖6示出了對(duì)執(zhí)行相同循環(huán)的三個(gè)相鄰周期的指令段劃分結(jié)果、以及相鄰周期中的指令段組合結(jié)果;圖7舉例示出了執(zhí)行相同循環(huán)的三個(gè)相鄰周期的具體指令集;圖8示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,在分別組合圖7所示的執(zhí)行相同循環(huán)的三個(gè)相鄰周期的第一組合指令段和第二組合指令段之后的指令集;圖9示出了圖8所示組合之后的指令集的編譯結(jié)果;以及圖10示意性地示出了根據(jù)本發(fā)明第二實(shí)施例的用于實(shí)現(xiàn)編譯方法的編譯設(shè)備。
具體實(shí)施例方式
下面,將參考附圖來(lái)詳細(xì)描述本發(fā)明的優(yōu)選實(shí)施例。
為了清楚起見(jiàn),本申請(qǐng)中使用的有關(guān)術(shù)語(yǔ)示出如下程序表示可由計(jì)算機(jī)執(zhí)行的指令序列。循環(huán)表示可由程序重復(fù)執(zhí)行、直到執(zhí)行了固定次數(shù)或者直到某個(gè)條件為真或?yàn)榧贂r(shí)才停止的語(yǔ)句組。周期表示執(zhí)行循環(huán)的操作。指令表示使用計(jì)算機(jī)語(yǔ)言編寫的動(dòng)作語(yǔ)句。
在根據(jù)本發(fā)明第一實(shí)施例的VLIW處理器中針對(duì)包括循環(huán)的程序的編譯方法中,引入資源沖突分析。換言之,在針對(duì)包括循環(huán)的程序的編譯過(guò)程中,添加針對(duì)循環(huán)中的每個(gè)指令的分析。資源沖突分析過(guò)程包括兩個(gè)部分1.功能單元沖突分析;以及2.寄存器沖突分析。
功能單元分析的作用是用于避免執(zhí)行兩個(gè)指令所需的功能單元的沖突。寄存器沖突分析是用于檢查兩個(gè)指令之間的數(shù)據(jù)依賴性。通過(guò)資源沖突分析,可以在執(zhí)行相同循環(huán)的多個(gè)周期中的兩個(gè)相鄰周期中確定可以并行執(zhí)行的指令,從而提高周期執(zhí)行效率,而不改變程序的功能。
兩個(gè)指令之間沒(méi)有資源沖突這一事實(shí)表示既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突。
技術(shù)領(lǐng)域中存在多種算法,這些算法可以實(shí)現(xiàn)指令獲取,以滿足功能單元沖突和寄存器沖突的避免規(guī)則。例如,可使用編譯設(shè)備具有的語(yǔ)法校正功能。
應(yīng)該注意,各種編譯設(shè)備的編譯結(jié)果是相同的,但是用不同的算法可能產(chǎn)生不同的效果。所使用的算法直接影響編譯設(shè)備的復(fù)雜程度。編譯設(shè)備的智能化程度越高,其復(fù)雜程序越高。
圖2是根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法的流程圖,其中循環(huán)包括K個(gè)指令(K是等于或大于2的整數(shù)),并在程序中重復(fù)M次(M≥2)。
如圖2所示,針對(duì)包括循環(huán)的程序的編譯方法包括以下基本步驟在步驟S101中,對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析,并判斷在相應(yīng)指令之間是否存在資源沖突。
然后在步驟S102中,根據(jù)步驟S101中的分析結(jié)果,將循環(huán)中的K個(gè)指令分為第一組合指令段、連接指令段和第二組合指令段,其中,在第一組合指令段中的指令與在第二組合指令段中的指令之間分別沒(méi)有資源沖突??梢苑謩e對(duì)第一組合指令段中的指令和第二組合指令段中的指令進(jìn)行并行編譯,并且連接指令段中的指令與第一或第二組合指令段中的指令有資源沖突。
在步驟S103中,編譯程序,其中,以組合方式對(duì)周期N(N=2,3,...M)中的第一組合指令段和周期N-1中的第二組合指令段進(jìn)行編譯。
下面,詳細(xì)描述圖2的步驟S101中所述的資源沖突分析。
圖3示出了當(dāng)K是偶數(shù)時(shí)、在上述步驟S101中提到的資源沖突分析步驟的細(xì)節(jié)。
首先,設(shè)置兩個(gè)變量i和j,并分別將變量i和j初始化為0和K/2(步驟S201)。變量i和j初始值的設(shè)置只是為了設(shè)計(jì)該流程圖。
根據(jù)本發(fā)明的第一實(shí)施例,在K是偶數(shù)的情況下,變量i的變化范圍是1≤i≤K/2,并且變量j的變化范圍是(K/2+1)≤j≤K。實(shí)際上,在K是偶數(shù)的情況下,變量I指向的指令是循環(huán)的第一段指令(前半部分指令),而變量j指向的指令是循環(huán)的第二段指令(后半部分指令)。
然后,在步驟S202中,使變量i=i+1;并且在步驟S203中,使變量j=j(luò)+1。
接下來(lái),在步驟S204中,判斷循環(huán)中執(zhí)行第i個(gè)指令的功能單元和執(zhí)行第j個(gè)指令的功能單元是否沖突。
如果在兩個(gè)指令的執(zhí)行期間涉及相同的功能單元,則確定兩個(gè)指令之間存在功能單元沖突,否則確定兩個(gè)指令之間不存在功能單元沖突。
如果在步驟S204中的判斷結(jié)果是“否”,則流程前進(jìn)到步驟S205,進(jìn)一步判斷執(zhí)行第i個(gè)指令的寄存器是否與執(zhí)行第j個(gè)指令的寄存器沖突。
如果執(zhí)行第i個(gè)指令的源寄存器或目標(biāo)寄存器與執(zhí)行第j到第K個(gè)指令中的任意一個(gè)的源寄存器或目標(biāo)寄存器涉及相同的寄存器,則確定第i個(gè)指令和第j個(gè)指令之間存在寄存器沖突,否則確定第i個(gè)指令和第j個(gè)指令之間不存在寄存器沖突。
如果在步驟S204中的判斷結(jié)果是“是”,則意味著相應(yīng)指令之間存在功能單元沖突,流程返回步驟S203,并繼續(xù)判斷在變量i指向的第一段指令中的指令與變量j指向的第二段指令中的后繼指令之間是否存在寄存器沖突(步驟S204)。
如果在步驟S205中的判斷結(jié)果是“否”,則使j=j(luò)+1(步驟S206),并且流程繼續(xù)判斷執(zhí)行第i個(gè)指令的寄存器與執(zhí)行第j個(gè)指令的寄存器是否存在沖突(步驟S207)。
此外,如果步驟S205中的判斷結(jié)果是“是”,則流程返回步驟S203。
如果步驟S207中的判斷結(jié)果是“否”,則流程繼續(xù)判斷j是否小于K(步驟S208);如果答案是“是”,則流程返回步驟S206,否則流程前進(jìn)到步驟S209。
如果步驟S207中的判斷結(jié)果是“是”,則流程返回步驟S203。
在步驟S209中,相應(yīng)指令既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,從而確定在相應(yīng)指令之間沒(méi)有資源沖突。
上述處理完成了對(duì)循環(huán)中第一段中的一個(gè)指令與第二段中的一個(gè)指令及其后繼指令之間的資源沖突的判斷。
在步驟S210中,判斷變量i是否小于K/2。如果步驟S210中的判斷結(jié)果是“否”,則流程返回步驟S202,否則終止對(duì)循環(huán)中指令的資源沖突判斷,并且流程前進(jìn)到步驟S102(圖2)。
在步驟S202中,開(kāi)始對(duì)循環(huán)中的第一段中的另一指令與第二段中的另一指令及其后繼指令之間的資源沖突進(jìn)行判斷。
在K是奇數(shù)的情況下,資源沖突分析與K是偶數(shù)的情況類似,除了變量i的變化范圍變?yōu)?≤i≤((K+1)/2-1)以及變量j的變化范圍變?yōu)?(K+1)/2+1)≤j≤K。在這種情況下,未考慮中心指令與循環(huán)中的其它指令沖突的情況。
圖2和3所示的根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法適用于前n個(gè)指令與后n個(gè)指令匹配的循環(huán),即適用于沒(méi)有資源沖突的循環(huán)。其中,前n個(gè)指令和后n個(gè)指令必須連續(xù)排列,并表現(xiàn)出一一對(duì)應(yīng)的匹配關(guān)系。循環(huán)中部的K-2n個(gè)指令可用作連接指令段。在編譯程序時(shí),順序地編譯連接指令段。
圖4(a)示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,對(duì)包括偶數(shù)個(gè)指令的循環(huán)進(jìn)行編譯的情況。
圖4(a)所示的循環(huán)包括A、B、C、D、E、F、G和H八個(gè)(K=8)指令,并且根據(jù)本發(fā)明的指令資源沖突分析方法,進(jìn)行以下確定指令A(yù)與指令E之間沒(méi)有資源沖突(即指令A(yù)與指令E之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,并且在指令A(yù)與指令F、G和H之間也沒(méi)有寄存器沖突);在指令B與指令F之間沒(méi)有資源沖突(即指令B和指令F之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,并且在指令B與指令G和H之間沒(méi)有寄存器沖突);在指令C與指令G之間沒(méi)有資源沖突(即指令C與指令G之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,并且在指令C與指令H之間也沒(méi)有寄存器沖突);以及在指令D與指令H之間沒(méi)有資源沖突(即指令D與指令H之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突)。
圖4(a)中的箭頭示出了各個(gè)相應(yīng)指令之間匹配的情況(沒(méi)有沖突),其中,雙向箭頭表示兩個(gè)指令之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,單向箭頭表示兩個(gè)指令之間沒(méi)有寄存器沖突。
如圖4(a)所示,將循環(huán)分為第一組合指令段(包括指令A(yù)、B、C和D)和第二組合指令段(包括E、F、G和H)。在這種情況下,連接指令段中的指令個(gè)數(shù)為零。
當(dāng)編譯包括循環(huán)的程序時(shí),可分別并行地編譯周期N-1中的指令E、F、G和H以及周期N中的指令A(yù)、B、C和D,并且可分別并行地編譯周期N中的指令E、F、G和H以及周期N+1中的指令A(yù)、B、C和D。因此,周期的執(zhí)行時(shí)間顯著縮短。
當(dāng)然,如果通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,判斷出只有循環(huán)中的指令A(yù)和B與指令G和H之間沒(méi)有資源沖突,則第一組合指令段包括指令A(yù)和B,第二組合指令段包括指令G和H,并且連接指令段包括C、D、E和F。但是在這種情況下,周期的執(zhí)行時(shí)間稍長(zhǎng)于圖4(a)所示的情況。
圖4(b)示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,對(duì)包括奇數(shù)個(gè)指令的循環(huán)進(jìn)行編譯的情況。圖4(b)所示的循環(huán)包括7個(gè)指令A(yù)、B、C、D、E、F和G(K=7),并且根據(jù)本發(fā)明的指令資源沖突分析方法,進(jìn)行以下確定在指令A(yù)與指令E之間沒(méi)有資源沖突(即指令A(yù)與指令E之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,并且在指令A(yù)與指令F和G之間也沒(méi)有寄存器沖突);在指令B與指令F之間沒(méi)有資源沖突(即在指令B與指令F之間沒(méi)有功能單元沖突,并且在指令B與指令G之間也沒(méi)有寄存器沖突);在指令C與指令G之間沒(méi)有資源沖突(即在指令C與指令G之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突)。
未考慮中心指令D與循環(huán)中的其它指令有資源沖突的情況,這與K是偶數(shù)的情況不同。
在圖4(b)所示的情況下,第一組合指令段包括指令A(yù)、B和C,第二組合指令段包括指令E、F和G,連接指令段包括指令D。
當(dāng)編譯包括循環(huán)的程序時(shí),可分別并行地編譯周期N-1中的指令E、F和G以及周期N中的指令A(yù)、B和C,并可分別并行地編譯周期N中的指令E、F和G以及周期N+1中的指令A(yù)、B和C。
可以順序地編譯各個(gè)周期中的連接指令段中的指令。
圖5示出了VLIW循環(huán),其中左邊方框中是由匯編語(yǔ)言表示的VLIW循環(huán),而在右邊方框中是VLIW循環(huán)的編譯結(jié)果。
在圖5所示的周期中,指令A(yù)(READ a,AR0+;READ b,AR1+;)僅涉及讀和寫功能單元,并且執(zhí)行指令A(yù)所需要操作的寄存器包括a和b;指令E(MUL int e,f,g;)僅涉及計(jì)算功能單元,并且執(zhí)行指令E所需要操作的寄存器包括e、f和g。因此,指令A(yù)和E之間既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突。指令A(yù)和F之間沒(méi)有寄存器沖突。類似地,指令B(ADD int a,b,c;SUB int b,a,d)和指令F(WRITE g,AR2+;)也占用不同的功能單元,因此在指令B和F之間沒(méi)有寄存器沖突。
因此,可并行地編譯周期N中的指令E和F以及周期N+1中的指令A(yù)和B。
圖6示出了執(zhí)行相同循環(huán)的三個(gè)相鄰周期的指令段的劃分結(jié)果以及相鄰周期中的指令段的組合結(jié)果。
如圖6的左側(cè)示意圖所示,如果根據(jù)傳統(tǒng)方法編譯指令,則編譯設(shè)備按照以下順序編譯周期N-1、周期N和周期N+1中的各個(gè)指令段周期N-1中的第一組合指令段、連接指令段和第二組合指令段;周期N中的第一組合指令段、連接指令段和第二組合指令段;以及周期N+1中的第一組合指令段、連接指令段和第二組合指令段。
在這種情況下,需要編譯九個(gè)指令段。
如圖6的右側(cè)圖所示,根據(jù)本發(fā)明,將周期N-1中的第二組合指令段和周期N中的第一組合指令段組合以進(jìn)行編譯,并將周期N中的第二組合指令段和周期N+1中的第一組合指令段組合以進(jìn)行編譯。在這種情況下,僅需要編譯七個(gè)指令段。
可見(jiàn),指令組合是使周期N中的第一組合指令段上移并與周期N-1中的第二組合指令段一起并行地執(zhí)行,并使周期N+1中的第一組合指令段上移并與周期N中的第二組合指令段一起并行地執(zhí)行。
與中間的周期相反,并不將執(zhí)行循環(huán)的第一周期的第一組合指令段和執(zhí)行循環(huán)的最后周期的第二組合指令段與相鄰的指令段組合并一起編譯,而是將其順序地執(zhí)行。
通過(guò)使用指令組合,減少了整個(gè)循環(huán)結(jié)構(gòu)中的VLIW指令的個(gè)數(shù)。
圖7舉例示出了執(zhí)行相同循環(huán)的三個(gè)相鄰周期的具體指令集,其中,用虛線將周期N-1、周期N和周期N+1中執(zhí)行的指令分開(kāi)。
圖8示出了通過(guò)使用根據(jù)本發(fā)明第一實(shí)施例的編譯方法,在組合了圖7所示的具體指令集的第一組合指令段和第二組合指令段之后獲得的指令。
根據(jù)本發(fā)明第一實(shí)施例的針對(duì)包括循環(huán)的程序的編譯方法,可將圖7所示的循環(huán)劃分為以下指令段第一組合指令段READ a,AR0+;READ b,AR1+;ADD int a,b,c;SUB int b,a,d;第二組合指令段MUL int e,f,g;WRITE g,AR2+;連接指令段MAC int c,d,e;ADD int a,32,f;從圖8中可見(jiàn),將周期N-1中第二組合指令段的第一指令MUL inte,f,g和周期N中第一組合指令段的第一指令READ a,AR0+;READb,AR1+組合以進(jìn)行編譯,并且將周期N-1中第二組合指令段的第二指令WRITE g,AR2+和周期N中第一組合指令段的第二指令A(yù)DD inta,b,c;SUB int b,a,d組合以進(jìn)行編譯。類似地,將周期N中第二組合指令段的第一指令MUL int e,f,g與周期N+1中第一組合指令段的第一指令READ a,AR0+;READ b,AR1+組合以進(jìn)行編譯,并且將周期N中第二組合指令段的第二指令WRITE g,AR2+和周期N+1中第一組合指令段的第二指令A(yù)DD int a,b,c;SUB int b,a,d組合以進(jìn)行編譯。
圖9示出了在圖8所示組合之后的指令集的編譯結(jié)果。
圖10示意性地示出了根據(jù)本發(fā)明第二實(shí)施例的用于實(shí)現(xiàn)編譯方法的編譯設(shè)備,在程序中,循環(huán)包括K個(gè)指令(K≥2)并且重復(fù)M次(M≥2)。
如圖10所示,編譯設(shè)備包括資源沖突分析單元500,用于對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;
指令劃分單元530,用于將循環(huán)中的K個(gè)指令劃分為第一組合指令段、連接指令段和第二組合指令段,其中,第一組合指令段中的指令和在第二組合指令段中的指令之間分別沒(méi)有資源沖突。在K是偶數(shù)的情況下,指令連接部分包括彼此之間分別存在資源沖突的偶數(shù)個(gè)指令,而在K是奇數(shù)的情況下,連接指令段包括循環(huán)的中心指令以及彼此之間分別存在資源沖突的偶數(shù)個(gè)指令;以及程序編譯器540,用于編譯程序,其中將周期N(N=2,3,...M)中的第一組合指令段和周期N-1中的第二組合指令段組合以進(jìn)行編譯。
資源沖突分析單元500包括功能單元沖突分析單元510和寄存器沖突分析單元520。
功能單元沖突分析單元510用于順序地判斷執(zhí)行K個(gè)指令中的第i個(gè)指令的功能單元與執(zhí)行第j個(gè)指令的功能單元是否有沖突。在K是偶數(shù)的情況下,1≤i≤K/2,并且(K/2+1)≤j≤K。在K是奇數(shù)的情況下,1≤i≤((K+1)/2-1)并且((K+1)/2+1)≤i≤K。
寄存器沖突分析單元520用于順序地判斷執(zhí)行K個(gè)指令中的第i個(gè)指令的寄存器和執(zhí)行第j個(gè)至第K個(gè)指令的寄存器是否有沖突。在K是偶數(shù)的情況下,1≤i≤K/2,并且(K/2+1)≤j≤K。在K是奇數(shù)的情況下,1≤i≤((K+1)/2-1)并且((K+1)/2+1)≤j≤K。
在這種情況下,周期N(N=2,3,...M)中第一組合指令段的指令與周期(N-1)中第二組合指令段的指令分別既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,可分別組合以進(jìn)行編譯。
類似地,周期N中第二組合指令段的指令與周期N+1中第一組合指令段的指令分別既沒(méi)有功能單元沖突也沒(méi)有寄存器沖突,可分別組合以進(jìn)行編譯。
此外,可以順序地編譯各個(gè)周期中的連接指令段的指令。
如果循環(huán)中包括的指令個(gè)數(shù)K是偶數(shù),并且前半部分指令中的指令與后半部分指令中的指令沒(méi)有資源沖突,則將前半部分指令中的指令劃分為第一組合指令段,并將后半部分指令中的指令劃分為第二組合指令段。連接指令段中的指令個(gè)數(shù)是零,即沒(méi)有連接指令段。
根據(jù)本發(fā)明的第三實(shí)施例,還提供了一種計(jì)算機(jī)系統(tǒng),其包括存儲(chǔ)器、輸入和輸出設(shè)備(未示出)以及針對(duì)包括循環(huán)的程序的編譯設(shè)備。編譯設(shè)備與參照?qǐng)D10所述的根據(jù)本發(fā)明第二實(shí)施例的編譯設(shè)備相同。
通過(guò)使用根據(jù)本發(fā)明的針對(duì)包括循環(huán)的程序的編譯方法、編譯設(shè)備或計(jì)算機(jī)系統(tǒng),可顯著地提高程序的周期效率。
以圖5所示的循環(huán)為例,假設(shè)循環(huán)的重復(fù)次數(shù)是K。由于循環(huán)包括5個(gè)指令,按照傳統(tǒng)方式,總共需要5K個(gè)指令周期來(lái)完成整個(gè)循環(huán)結(jié)構(gòu)的編譯;如果使用根據(jù)本發(fā)明的針對(duì)包括循環(huán)的程序的編譯方法,除了第一周期和最后周期之外,每個(gè)周期都有兩個(gè)指令與前一周期中的兩個(gè)指令一起并行編譯,并且還有另外兩個(gè)指令與后繼周期中的兩個(gè)指令一起并行編譯,因此總共僅需要[5+(K-1)×(5-2)]=3K+2個(gè)指令周期來(lái)完成編譯。與傳統(tǒng)編譯方法相比,根據(jù)本發(fā)明的針對(duì)循環(huán)的編譯方法可節(jié)省5K-(3K+2)=2K-2個(gè)指令周期。
假設(shè)組合指令段的指令占整個(gè)循環(huán)的指令的比例為n%,并且循環(huán)重復(fù)K次。利用根據(jù)本發(fā)明的針對(duì)包括循環(huán)的程序的編譯方法,程序的周期效率提高的比率應(yīng)該是E=1-(1-n%)(K-1)+1K=(K-1)·n%K]]>當(dāng)K相當(dāng)大時(shí),周期效率提高可以高達(dá)大約n%。
對(duì)于圖5所示的情況,在n%=2/5=40%并且K=256時(shí),效率提高可以高達(dá)大約39.84%(近似40%)。
盡管參考文中所述結(jié)構(gòu)描述了本發(fā)明,但是本發(fā)明不局限于所述細(xì)節(jié),本申請(qǐng)意欲涵蓋落入所附權(quán)利要求的精神和范圍內(nèi)的多種修改和改變。
權(quán)利要求
1.一種對(duì)包括循環(huán)的程序進(jìn)行編譯的方法,所述程序中的所述循環(huán)包括K個(gè)指令,并且重復(fù)M次,其中K≥2,M≥2,所述編譯方法包括以下步驟a)對(duì)所述循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;b)將所述循環(huán)中的K個(gè)指令劃分為第一組合指令段、連接指令段和第二組合指令段,其中,第一組合指令段中的各個(gè)指令和在第二組合指令段中的各個(gè)指令之間分別沒(méi)有資源沖突;以及c)編譯所述程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
2.根據(jù)權(quán)利要求1所述的方法,其中,步驟a)包括在K是偶數(shù)的情況下,對(duì)于K個(gè)指令,依次且重復(fù)地確定用于執(zhí)行第i個(gè)指令的功能單元與用于執(zhí)行第j個(gè)指令的功能單元是否有沖突,其中1≤i≤K/2,(K/2+1)≤j≤K;以及對(duì)于K個(gè)指令,依次確定用于執(zhí)行第i個(gè)指令的寄存器與用于執(zhí)行第j個(gè)指令至第K個(gè)指令中的任意一個(gè)的寄存器是否有沖突,其中1≤i≤K/2,(K/2+1)≤j≤K。
3.根據(jù)權(quán)利要求1所述的方法,其中步驟a)包括在K是奇數(shù)的情況下,對(duì)于K個(gè)指令,依次且重復(fù)地確定用于執(zhí)行第i個(gè)指令的功能單元與用于執(zhí)行第j個(gè)指令的功能單元是否有沖突,其中1≤i≤((K+1)/2-1),((K+1)/2+1)≤j≤K;以及對(duì)于K個(gè)指令,依次確定用于執(zhí)行第i個(gè)指令的寄存器與用于執(zhí)行第j個(gè)指令至第K個(gè)指令中的任意一個(gè)的寄存器是否有沖突,其中1≤i≤((K+1)/2-1),((K+1)/2+1)≤j≤K。
4.根據(jù)權(quán)利要求1所述的方法,其中,連接指令段中的指令與第一或第二組合指令段中的指令有資源沖突。
5.根據(jù)權(quán)利要求4所述的方法,其中,連接指令段中的指令個(gè)數(shù)為零。
6.根據(jù)權(quán)利要求1所述的方法,其中,第一組合指令段中的指令個(gè)數(shù)與第二組合指令段中的指令個(gè)數(shù)相等。
7.根據(jù)權(quán)利要求1所述的方法,其中,依次編譯各個(gè)周期中連接指令段中的指令。
8.根據(jù)權(quán)利要求1所述的方法,其中,依次編譯第一周期的第一組合指令段和第M周期的第二組合指令段中的指令。
9.一種對(duì)包括循環(huán)的程序進(jìn)行編譯的編譯設(shè)備,所述程序中的所述循環(huán)包括K個(gè)指令并且重復(fù)M次,其中K≥2,M≥2,所述編譯設(shè)備包括分析裝置,用于對(duì)所述循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;劃分裝置,用于將所述循環(huán)中的K個(gè)指令劃分為第一組合指令段、連接指令段和第二組合指令段,其中,第一組合指令段中的各個(gè)指令和在第二組合指令段中的各個(gè)指令之間分別沒(méi)有資源沖突;以及編譯裝置,用于編譯所述程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
10.根據(jù)權(quán)利要求9所述的設(shè)備,其中,分析裝置包括對(duì)于K個(gè)指令、依次且重復(fù)地確定用于執(zhí)行第i個(gè)指令的功能單元與用于執(zhí)行第j個(gè)指令的功能單元是否有沖突的裝置;以及對(duì)于K個(gè)指令、依次確定用于執(zhí)行第i個(gè)指令的寄存器與用于執(zhí)行第j個(gè)指令至第K個(gè)指令中的任意一個(gè)的寄存器是否有沖突的裝置,其中,在K是偶數(shù)的情況下,1≤i≤K/2且(K/2+1)≤j≤K,在K是奇數(shù)的情況下,1≤i≤((K+1)/2-1)且((K+1)/2+1)≤j≤K。
11.一種計(jì)算機(jī)系統(tǒng),包括存儲(chǔ)器、輸入和輸出設(shè)備以及針對(duì)包括循環(huán)的程序的編譯設(shè)備,所述程序中的所述循環(huán)包括K個(gè)指令并且重復(fù)M次,其中K≥2,M≥2,所述編譯設(shè)備包括分析裝置,用于對(duì)所述循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;劃分裝置,用于將所述循環(huán)中的K個(gè)指令劃分為第一組合指令段、連接指令段和第二組合指令段,其中,第一組合指令段中的各個(gè)指令和在第二組合指令段中的各個(gè)指令之間分別沒(méi)有資源沖突;以及編譯裝置,用于編譯所述程序,其中,分別對(duì)周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令進(jìn)行并行編譯。
12.根據(jù)權(quán)利要求11所述的計(jì)算機(jī)系統(tǒng),其中,分析裝置包括對(duì)于K個(gè)指令、依次且重復(fù)地確定用于執(zhí)行第i個(gè)指令的功能單元與用于執(zhí)行第j個(gè)指令的功能單元是否有沖突的裝置;以及對(duì)于K個(gè)指令、依次確定用于執(zhí)行第i個(gè)指令的寄存器與用于執(zhí)行第j個(gè)指令至第K個(gè)指令中的任意一個(gè)的寄存器是否有沖突的裝置,其中,在K是偶數(shù)的情況下,1≤i≤K/2且K/2+1)≤j≤K,在K是奇數(shù)的情況下,1≤i≤((K+1)/2-1)且((K+1)/2+1)≤j≤K。
全文摘要
提供了一種對(duì)包括循環(huán)的程序進(jìn)行編輯的方法。在程序中,循環(huán)包括K個(gè)指令(K>2)并且重復(fù)M次(M>2),該編譯方法包括以下步驟對(duì)循環(huán)中的K個(gè)指令執(zhí)行資源沖突分析;將循環(huán)中的K個(gè)指令分為第一組合指令段、連接指令段和第二組合指令段,其中,在第一組合指令段中的指令和第二組合指令段中的指令各自之間沒(méi)有資源沖突;以及編譯程序,其中,將周期N(N=2,3,...M)中第一組合指令段中的指令和周期N-1中第二組合指令段中的指令組合以分別編輯。還提供了一種用于實(shí)現(xiàn)上述編譯方法的編譯設(shè)備和計(jì)算機(jī)系統(tǒng)。
文檔編號(hào)G06F9/45GK101076780SQ200580042539
公開(kāi)日2007年11月21日 申請(qǐng)日期2005年12月7日 優(yōu)先權(quán)日2004年12月13日
發(fā)明者吳凡, 孫彥孟 申請(qǐng)人:皇家飛利浦電子股份有限公司