專利名稱:一種支持有向有環(huán)圖的微調(diào)度方法
技術(shù)領(lǐng)域:
本發(fā)明涉及指令級(jí)并行性編譯、微調(diào)度技術(shù)領(lǐng)域,特別是涉及一種支持帶“回邊”的“有向有環(huán)圖”的微調(diào)度方法,及相應(yīng)編譯優(yōu)化技術(shù)。
背景技術(shù):
指令調(diào)度是機(jī)器相關(guān)優(yōu)化的重要階段。成功的指令調(diào)度需要滿足數(shù)據(jù)相關(guān),控制相關(guān)和結(jié)構(gòu)相關(guān)及其它約束條件,通過重排指令順序提高資源利用率和指令并行度。而其中結(jié)構(gòu)相關(guān),是指如果指令并行執(zhí)行,可能發(fā)生的資源沖突。要解決這類相關(guān)需要訪問占用資源狀態(tài),訪問機(jī)器狀態(tài),獲取指令間延遲等等,所以需要頻繁的訪問機(jī)器模型Muchnick.Advance Compiler Design and Implementation.Morgan KaufmannPublishers,1997。
另外,有的機(jī)器對(duì)指令發(fā)送順序也有特殊要求,如Intel公司基于IA-64體系結(jié)構(gòu)的第一代、第二代處理器—安騰(Itanium)和麥金利(McKinley即itanium2)。它們都需要機(jī)器以特殊的模板,例如MII,發(fā)射指令。其中MII表示第一條發(fā)射Memory指令,而后兩條必須是Integer指令。為此指令調(diào)度需要考慮更加復(fù)雜的因素,這對(duì)代碼移植也是十分不利的。
鑒于性能和移植性的雙重需求,我們將指令調(diào)度考慮結(jié)構(gòu)相關(guān)和其它限制條件的部分單獨(dú)拿出來(lái),使之成為一個(gè)新模塊,稱為微調(diào)度Dong-Yuan Chen,Lixia Liu,Chen Fu,Shuxin Yang,Chengyong Wu,Roy Ju.Efficient Resource Management during InstructionScheduling for the EPIC Architecture. Parallel Architectures andCompilation Techniques.2003,936∽45。它負(fù)責(zé)封裝目標(biāo)機(jī)微體系結(jié)構(gòu)的具體細(xì)節(jié)。一方面為其它機(jī)器相關(guān)的優(yōu)化提供訪問機(jī)器參數(shù)以及機(jī)器狀態(tài)的接口,使編譯器在一定程度上與機(jī)器無(wú)關(guān),能夠快速適應(yīng)目標(biāo)機(jī)硬件的修改或換代。另一方面,也提高了指令調(diào)度的靈活性與可移植性。
首先,微調(diào)度的工作涉及范圍小,對(duì)于機(jī)器狀態(tài)轉(zhuǎn)換,我們只需關(guān)心當(dāng)前周期的狀態(tài)變化即可,加上特殊限制,我們最多需要考慮前面幾個(gè)的周期狀態(tài)。那樣也就是幾個(gè)周期內(nèi)的調(diào)度范圍。其次,我們必須考慮為指令分配功能部件,考慮指令的重排,這就要求在周期內(nèi)作一種類似調(diào)度一樣的工作。
在滿足結(jié)構(gòu)相關(guān)的過程中,微調(diào)度部分還必須得知當(dāng)前機(jī)器占用資源的狀態(tài),當(dāng)選擇了合適的指令發(fā)射之后,狀態(tài)要隨之相應(yīng)的變化。這種機(jī)器狀態(tài)變化的過程和有限狀態(tài)自動(dòng)機(jī)狀態(tài)轉(zhuǎn)換類似。
通常,指令調(diào)度解決結(jié)構(gòu)相關(guān)有兩種方法,向后檢測(cè)和向前檢測(cè)。向后方法是記錄當(dāng)前周期已發(fā)射的指令,對(duì)于每個(gè)待發(fā)射的指令,判斷是否和當(dāng)前周期已發(fā)射的指令發(fā)生資源沖突或者違背其它限制。如果存在沖突或者違背,則不允許該指令在當(dāng)前周期發(fā)射,否則允許發(fā)射。而前向檢測(cè)方法是對(duì)于發(fā)射每條指令都記錄了發(fā)射后的機(jī)器狀態(tài),對(duì)于新的候選指令,從當(dāng)前機(jī)器狀態(tài)判斷是否能夠到達(dá)下一個(gè)合法狀態(tài)。如果不能則不允許指令發(fā)射,否則反之。兩種方法一種向后看,看過去發(fā)射的指令,另一種向前看判斷下一個(gè)狀態(tài)是否合法T.Muller.Employingfinite automata for resource scheduling. In the 26th AnnualInternational Symposium on Microarchitecture,Austin,Dec 199312∽20。后向方法需要對(duì)于每條指令有復(fù)雜的比較和判斷,速度慢且算法復(fù)雜,但它能處理特殊情況,并且空間消耗小。而前向方法通過狀態(tài)轉(zhuǎn)移,速度快,算法簡(jiǎn)單,但是要想模擬所有狀態(tài),空間消耗大,而且難以處理特殊情況。微調(diào)度結(jié)合了這兩種方法各自的優(yōu)點(diǎn),實(shí)現(xiàn)了一種處理器結(jié)構(gòu)相關(guān)的混合方法。
目前微調(diào)度的思想已經(jīng)在ORC中得到了成功的應(yīng)用Open ResearchCompiler(ORC).http//ipf-orc.sourceforge.net.2002.。但它只是實(shí)現(xiàn)了對(duì)“有向無(wú)環(huán)圖”的調(diào)度,還不支持“有向有環(huán)圖”的情況,故還不能應(yīng)用于軟件流水中,實(shí)現(xiàn)對(duì)帶“回邊”指令的調(diào)度。另一方面,ORC中軟件流水(SWPSoftware Pipeline)模塊里編排指令束(bundling)的原有部分,其算法簡(jiǎn)單,沒有微調(diào)度Richard A.Huff.Lifetime-sensitive modulo scheduling. ACM SIGPLAN Notices,1993,28(6)258∽267,除了不夠靈活以外,還喪失許多潛在的提高優(yōu)化性能的機(jī)會(huì)。
作為一種循環(huán)調(diào)度方法,軟件流水(SWP)可以有效的開發(fā)程序中隱藏的指令級(jí)并行性(Instruction Level Parallelism,簡(jiǎn)稱ILP)。它通過重迭不同循環(huán)體的執(zhí)行來(lái)提高速度。在一個(gè)循環(huán)體尚未執(zhí)行完畢之前,可以啟動(dòng)下一個(gè)循環(huán)體,二者之間的時(shí)間差距稱為啟動(dòng)間距(Initiationinterval,簡(jiǎn)稱II)。目前軟件流水調(diào)度有兩大主要技術(shù)Move-then-scheduling技術(shù)(也即代碼移動(dòng)技術(shù))和Schedule-then-move技術(shù)。前者是跨越循環(huán)回邊(back-edge)一條一條的移動(dòng)指令。后者則是直接從零開始形成最終的調(diào)度。Schedule-then-move家族又有兩大成員Unrollbased scheduling和Modulo Scheduling。前者是既做循環(huán)展開(unroll)又做指令調(diào)度,后者只對(duì)循環(huán)中的一個(gè)iteration進(jìn)行調(diào)度,使得每次經(jīng)過相同的時(shí)間間隔重復(fù)同樣的調(diào)度,不會(huì)有資源沖突和相關(guān)沖突。模調(diào)度是目前實(shí)現(xiàn)軟件流水最受歡迎的方法Josep M.Codina,JosepLlosa,Antonio González.A Comparative Study of ModuloScheduling Techniques.Proceedings of the 16th internationalconference on Supercomputing.2002,797∽106。ORC中采用了Richard A.Huff提出的Slack Modulo SchedulingRichard A.Huff.Lifetime-sensitive modulo scheduling.ACM SIGPLAN Notices,1993,28(6)258∽267。模調(diào)度之后緊接的就是編排指令束(bundling)。Itanium的架構(gòu)中規(guī)定一個(gè)周期內(nèi)能夠發(fā)射兩個(gè)指令束(bundle),每個(gè)指令束有三條指令,它們的發(fā)送必須要依據(jù)一定的模板(template)。Itanium中指定了16種指令模板(MII,MI_I,MLX,MMI,M_MI,MFI,MMF,MIB,MBB,BBB,MMB,MFB,RESERVED_A,RESERVED_D,RESERVED_3,RESERVED_F)。我們把template的三個(gè)指令位置分別為三個(gè)空槽(slot0,slot1,slot2)。ORC中SWP部分的bundling源自于Pro64。其基本思想如下<pre listing-type="program-listing">SWP_Pack_A_Bundle(ops_list)//ops_list是模調(diào)度認(rèn)為可以在一個(gè)cycle中放下的指令集合{ while(!ops_list.empty()){ //ops_list不為空for(each slot in current bundle){//對(duì)當(dāng)前指令束的每一個(gè)slotfor(every slot_kind on each slot){ //對(duì)每個(gè)slot可能放置的指令類型f for(each op in ops_list) //對(duì)ops_list中的每一個(gè)opif(!SWP_Violates_Dependencies(ops_list.first_op(),op)) { //op和它之前未放置的那些op沒有依賴關(guān)系 SWP_Bundle_Next_In_Group(op,slot,slot_kind);//放置該slot_kind類型的//op到slot ops_list.erase(op); //刪除已放置的op } }//end for(every slot_kind…) }//end for(each slot…) }//whil e}</pre>算法中ops_list是模調(diào)度認(rèn)為可以在一個(gè)時(shí)鐘周期(cycle)中放下的指令集合。其中對(duì)每個(gè)指令槽(slot)找可能放置的指令類型時(shí),僅僅是根據(jù)一種線性的優(yōu)先級(jí)排序。比如,在為一個(gè)bundle的slot1選擇可放置的指令類型時(shí),是按照F>I>M>B的參考順序來(lái)指定指令槽類型(slot_kind)。并且按照算法,一旦前面的slot已經(jīng)放好指令后,后面的指令不會(huì)將其彈出,即使后面的指令找不到合適的template來(lái)放置時(shí)也如此。而事實(shí)上,很多情況下彈出已放置的指令恰恰可以發(fā)掘潛在的優(yōu)化的機(jī)會(huì)。例如adds,shr_i.u,add,lfetch,xor,ld8_i六條指令(分別是M/I,I,M/I,M,M/I,M類型),本來(lái)可以用MII,MMI(ld8_i,shr_i.u,add;lfetch,xor,adds)在一個(gè)cycle中放下,但SWP的bundling中的線性優(yōu)先級(jí)算法卻把它排成了MII,MMF+MFB(adds,shr_i.u,add;lfetch,xor,nop.f+ld8_I,nop.f,nop.b)也即用了兩個(gè)cycle才放下。也即模調(diào)度認(rèn)為可以在一個(gè)cycle中放下,而事實(shí)上沒有放下。我們稱這種情況為分拆問題(Splitissue)Intel Corp.Itanium Processor Microarchitecture Reference.http//developer.intel.com/design/itanium/arch spec.htm,2000。
另一方面,該算法不僅增加了許多空指令(NOP),增加了指令cache訪問不命中(I-Cache miss)的可能性;而且填NOP指令時(shí),優(yōu)先選用的是nop.f而不是nop.i,這也增加了執(zhí)行時(shí)出現(xiàn)停頓(stall)的可能性Intel Corp.Intel Itanium2 Processor Reference Manual.2002,753∽54。當(dāng)這些指令集所在基本塊(BBBasic Block)被執(zhí)行的頻率非常高,并且這些指令集由于SWP做了循環(huán)展開(Loop unrolling)而在該基本塊中多次重現(xiàn)時(shí),就會(huì)顯著影響編譯優(yōu)化的性能。也正是這個(gè)例子,直接導(dǎo)致了SPEC2000中的bzip2(ISET=ref)在ORC peak選項(xiàng)下編譯后,運(yùn)行時(shí)間下降了約2%。
綜上所述,在現(xiàn)有技術(shù)軟件流水的模調(diào)度中,會(huì)出現(xiàn)分拆問題,也增加了指令cache訪問不命中的可能性,降低了編譯效率,從而降低了編譯優(yōu)化的性能。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種支持有向有環(huán)圖的微調(diào)度方法,避免軟件流水模調(diào)度中出現(xiàn)的分拆問題(Split issue),減小了出現(xiàn)指令cache訪問不命中(I-Cache miss)的可能性,提高了并行編譯效率,從而進(jìn)一步提高了編譯優(yōu)化性能。
為了解決上述技術(shù)問題,本發(fā)明提供一種支持有向有環(huán)圖的微調(diào)度方法,包括以下步驟一種支持有向有環(huán)圖的微調(diào)度方法,其特征在于包括以下步驟a)計(jì)算指令集中每條指令的級(jí)數(shù)值;b)判斷指令集是否為空?如果是,執(zhí)行步驟1);如果否,執(zhí)行下一步;c)判斷機(jī)器當(dāng)前狀態(tài)空間是否已滿或所有指令均被選過?若是,執(zhí)行下一步,若否,執(zhí)行步驟e);d)完成前一周期的機(jī)器狀態(tài)空間的模板指派,更新前一周期的機(jī)器狀態(tài)空間中指令的絕對(duì)槽值,把當(dāng)前周期的機(jī)器狀態(tài)空間賦給前一周期的狀態(tài)空間,把當(dāng)前機(jī)器的狀態(tài)空間置空;e)從指令集中選一指令,為其分配功能部件,把當(dāng)前機(jī)器的狀態(tài)空間賦給當(dāng)前周期的測(cè)試空間;f)根據(jù)數(shù)據(jù)依賴圖,檢查當(dāng)前機(jī)器的狀態(tài)空間中每一條指令與步驟e)中選取指令的相關(guān)性,即判斷是否有下列四種情況之一來(lái)判斷相關(guān)性,如有,則執(zhí)行步驟h),如否,則執(zhí)行下一步;四種情況為當(dāng)前周期的機(jī)器狀態(tài)空間中的任一條指令和所選指令間不存在數(shù)據(jù)相關(guān);數(shù)據(jù)依賴圖中任一指令與所選指令的弧上延遲值為0;數(shù)據(jù)依賴圖中任一指令到所選指令的弧上的循環(huán)迭代數(shù)差值不為0;模調(diào)度中任一指令所在的級(jí)數(shù)不為所選指令所在的級(jí)數(shù);g)置feasible為false,然后執(zhí)行步驟k),其中,feasible為判斷是否存在周期內(nèi)的依賴關(guān)系的邏輯變量;h)將指令op加入當(dāng)前周期的測(cè)試空間中,置feasible為TRUE,調(diào)用模板匹配函數(shù)為當(dāng)前周期的測(cè)試空間狀態(tài)中的指令尋找模板,并實(shí)現(xiàn)有限狀態(tài)自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)移;i)判斷有限狀態(tài)自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)移是否成功?如果是,執(zhí)行下一步,如果否,執(zhí)行步驟1);j)測(cè)試成功,把當(dāng)前周期的測(cè)試空間的值賦給當(dāng)前周期的機(jī)器狀態(tài)空間,更新所選指令的絕對(duì)槽值,從指令集中刪除所選指令,然后執(zhí)行步驟b);k)在當(dāng)前周期的機(jī)器狀態(tài)空間中為所選指令做上已選標(biāo)記,然后執(zhí)行步驟c);
l)微調(diào)度結(jié)束。
在上述技術(shù)方案中,所述指令集為模調(diào)度認(rèn)為放在同一cycle中發(fā)送的指令集。
在上述技術(shù)方案中,步驟a)中所述每條指令的級(jí)數(shù)值為所述指令在扁平調(diào)度中的位置除以啟動(dòng)間距。
在上述技術(shù)方案中,所述絕對(duì)槽值表示所述方法結(jié)束后指令的絕對(duì)槽值。
由上可知,本發(fā)明所述的一種支持有向有環(huán)圖的微調(diào)度方法,在運(yùn)用重排(Reorder)技術(shù)和協(xié)調(diào)(Negotiate)技術(shù)編排模調(diào)度認(rèn)為能在同一cycle中發(fā)射的指令集合的時(shí)候,除了考慮指令間的依賴關(guān)系以外,還要同時(shí)考慮指令間弧上的級(jí)數(shù)值和指令所在的級(jí)數(shù),實(shí)現(xiàn)對(duì)“回邊”的支持;避免軟件流水模調(diào)度中出現(xiàn)的分拆問題(Split issue),減小了出現(xiàn)指令cache訪問不命中(I-Cache miss)的可能性,提高了并行編譯效率,從而進(jìn)一步提高了編譯優(yōu)化性能。
圖1a是本發(fā)明實(shí)施例中循環(huán)體的偽代碼示意圖;圖1b是本發(fā)明實(shí)施例中循環(huán)體循環(huán)展開后的前三個(gè)循環(huán)示意圖;圖1c是本發(fā)明實(shí)施例中一個(gè)迭代內(nèi)的數(shù)據(jù)依賴圖;圖1d是本發(fā)明實(shí)施例中循環(huán)的執(zhí)行調(diào)度情況;圖2a是本發(fā)明實(shí)施例中一個(gè)迭代內(nèi)扁平調(diào)度(II=2)的示意圖;
圖2b是本發(fā)明實(shí)施例中流水線執(zhí)行示意圖;圖3a是本發(fā)明實(shí)施例中循環(huán)迭代差值非0時(shí)寄存器分配前后示意圖;圖3b是本發(fā)明實(shí)施例中指令級(jí)數(shù)不等時(shí)寄存器分配前后示意圖;圖4是本發(fā)明實(shí)施例中支持有向有環(huán)圖的微調(diào)度方法流程圖。
圖面說明圖1d中,latency=1,omega=1,II=1;I1到I7表分別表示第1個(gè)cycle到第7個(gè)cycle。
圖3中,TN表示臨時(shí)變量(Temporary Name);TN表示全局臨時(shí)變量(Global Temporary Name)。
圖4中,流程圖中字母含義ops_list為模調(diào)度認(rèn)為可放在同一cycle中發(fā)送的指令集;Stage為模調(diào)度中指令所在的級(jí)數(shù)(opstage=op在扁平調(diào)度中的位置(location)/啟動(dòng)間距(II));NULL表示空集;prev_state,cur_state分別表示前一周期和當(dāng)前周期的機(jī)器狀態(tài)空間,temp_state表示當(dāng)前周期的機(jī)器狀態(tài)的測(cè)試空間,若測(cè)試成功,則把temp_state的值賦給cur_state.
tried為一布爾變量,其值為真表示cur_state中該op已被選過一次;絕對(duì)slot值表示MSMDDG算法結(jié)束后指令的絕對(duì)槽值;op表示從ops_list中選出的一條指令;inst是cur_state中的任意一條指令;Arc_latency(inst,op)表示DDG中指令inst到指令op的弧上的延遲值;Omega(inst,op)表示DDG中指令inst到指令op的依賴關(guān)系所跨越的循環(huán)迭代數(shù)。
Stage(inst)表示模調(diào)度中指令inst所在的級(jí)數(shù)(即location/II),該值已在程序的一開始就計(jì)算完畢;feasible為判斷是否存在周期內(nèi)的依賴關(guān)系的邏輯變量;Bundle_Helper為微調(diào)度中現(xiàn)有模板匹配函數(shù),其功能是在當(dāng)前周期內(nèi),試圖通過有限狀態(tài)自動(dòng)機(jī)(FSAFinite State Automata)的狀態(tài)轉(zhuǎn)移,為temp_state狀態(tài)空間中的指令尋找合適的模板。
具體實(shí)施例方式
上文提到,模調(diào)度屬于Move-then-scheduling技術(shù),是跨越循環(huán)回邊(back-edge)一條一條的移動(dòng)指令,它構(gòu)建的“數(shù)據(jù)依賴圖”(DDGDataDependence Graph)不同于傳統(tǒng)的“有向無(wú)環(huán)圖”(DAGDirectedAcyclic Graph),而是一種“有向有環(huán)圖”(DCGDirected CyclicGraph)。
它不僅包含循環(huán)內(nèi)同一迭代(iteration)指令間的依賴關(guān)系,而且還包含不同迭代間的循環(huán)攜帶依賴關(guān)系(loop-carried dependence)。正是后者,通過循環(huán)回邊(如果從DDG的初始節(jié)點(diǎn)到節(jié)點(diǎn)a的每條路經(jīng)都要經(jīng)過節(jié)點(diǎn)b,則說節(jié)點(diǎn)b支配節(jié)點(diǎn)a(b dom a)。如果b dom a,則邊a→b稱為“回邊”。如圖1c中節(jié)點(diǎn)1指向自身的回邊),把傳統(tǒng)的DAG變成了“有向有環(huán)圖”Vicki H.Allan,Reese B.Jones,Randall M.Lee,Stephen J.Allan.Software pipelining.ACM Computing Surveys(CSUR).1995,9(27)376∽432。我們把這個(gè)“有向有環(huán)圖”記為DDG(N,A),其中,N是表示所有指令的節(jié)點(diǎn)的集合,A是表示所有依賴關(guān)系的弧的集合。每條弧都用一個(gè)序偶(omega,latency)標(biāo)記。迭代距離(omega)表示依賴關(guān)系所跨越的循環(huán)迭代數(shù),延遲(latency)表示第一條指令產(chǎn)生的結(jié)果能為第二條指令所使用而必需消耗的時(shí)間。
為了說明ORC中微調(diào)度如何對(duì)DDG做出支持,如圖1所示,圖1a中示出的循環(huán)體經(jīng)過三次循環(huán)展開變成了圖1b,我們看到不僅同一迭代內(nèi)有依賴關(guān)系,不同迭代間也有依賴關(guān)系。這些依賴關(guān)系可以用圖1c的DDG來(lái)充分表示。節(jié)點(diǎn)1指向節(jié)點(diǎn)2弧上的序偶(0,1)表示同一迭代內(nèi)latency=1的依賴關(guān)系;節(jié)點(diǎn)1指向自身的回邊上的序偶為(1,1),意味著當(dāng)前迭代(iteration)的第一條指令和下一迭代的第一條指令也有l(wèi)atency=1依賴關(guān)系。由于模調(diào)度在計(jì)算啟動(dòng)間距(II)時(shí)會(huì)保證II*omega>=latency,所以當(dāng)模調(diào)度選定II調(diào)度完畢后,便已經(jīng)考慮了所有的依賴關(guān)系,包括迭代內(nèi)和迭代間的依賴關(guān)系。
換句話說,一方面,模調(diào)度在進(jìn)行“扁平調(diào)度(Flat schedule即對(duì)一個(gè)iteration的調(diào)度)”時(shí),要考慮一個(gè)迭代中相繼的若干指令之間的依賴性(如圖2a中示出的指令2,3被扁平調(diào)度調(diào)到同一cycle,證明他們之間沒有依賴關(guān)系)。另一方面,由于數(shù)據(jù)依賴圖是有環(huán)的,模調(diào)度在調(diào)度一條指令時(shí),還必須要考慮這條指令和扁平調(diào)度中所有“模II余數(shù)相同”的指令之間的依賴性,因?yàn)樗麄兪峭瑫r(shí)執(zhí)行的。如圖2b中I1,I3,I5中的指令是同時(shí)執(zhí)行的(Iii mod 2=1;i為指令在扁平調(diào)度中的位置location),I2,I4,I6中的指令是同時(shí)執(zhí)行的(Iii mod2=0)。方框內(nèi)的指令是流水線穩(wěn)定時(shí)一個(gè)循環(huán)中的指令,稱為一個(gè)級(jí)數(shù)(stage),它的長(zhǎng)度等于II。一條指令所在的stage=location/II。Cycle I5中的指令6和指令1分別來(lái)自于stage2和stage0。
模調(diào)度結(jié)束之后,接下來(lái)由微調(diào)度負(fù)責(zé)bundling。為了支持有向有環(huán)圖,微調(diào)度必須要考慮Omega和Stage兩項(xiàng)因素。
如圖2b所示,Cycle I5中的指令6,2,3,1在扁平調(diào)度中的位置模II余數(shù)相同,它們?cè)贓PIC結(jié)構(gòu)中是在同一cycle中一起發(fā)送的。假設(shè)指令6和指令2之間有先讀后寫(RAWRead After Write)的依賴關(guān)系(見下例),按照常見的調(diào)度方法,我們是不能把它們放到同一個(gè)cycle之內(nèi)的,因?yàn)楹笠粋€(gè)adds要使用前一個(gè)adds的結(jié)果,必須要等待一個(gè)cycle(latency=1)。但從有向有環(huán)圖可以得知,它們之間的弧上的權(quán)值里omega=1,也即指令2是來(lái)自下一個(gè)iteration里的。對(duì)這種omega!=0的情況,SWP在bundling之后的寄存器分配(Register Allocation)可以輕易的通過寄存器重命名消除這一RAW的相關(guān)性,參見B.R.Rau,M.Lee,P.P.Tirumalai,M.S.Schlansker.Register Allocation for Software PipelinedLoops.Proc.of the SIGPLAN’92 Conf.on Programming Language Design andImplementation.1992,6283∽299。事實(shí)上ORC原有的軟件流水部分也是這么做的。所以,當(dāng)omega>=1時(shí),我們實(shí)際上是可以把這兩條指令放到同一cycle的,圖3a示出了指令6和指令2在軟件流水做RegisterAllocation前后的情況。
Cycle I5中指令2和指令3在Flat Scheduling中就被放到了同一個(gè)cycle,證明其間沒有相關(guān)性。指令6和指令1還可能是下面這種情形。同樣,指令6到指令1也是先讀后寫(RAW)的依賴關(guān)系,如圖3b所示,st1的源操作數(shù)要使用adds的結(jié)果操作數(shù)。按常見的調(diào)度方法,我們也不能把它們放到同一個(gè)cycle中。但從模調(diào)度提供的信息可得知,指令6和指令1不是位于同一個(gè)stage。前者來(lái)之stage2,后者來(lái)自stage0。對(duì)這種情況,SWP也會(huì)在bundling之后的Register Allocation中通過寄存器重命名消除它們之間的相關(guān)性,參見B.R.Rau,M.Lee,P.P.Tirumalai,M.S.Schlansker.Register Allocation for Software Pipelined Loops.Proc.of theSIGPLAN’92 Conf.on Programming Language Design and Implementation.1992,6283∽299。所以,當(dāng)它們的stage不相同的時(shí)候,實(shí)際上也可以放進(jìn)同一個(gè)cycle中。圖3b示出了指令6和指令1在軟件流水做RegisterAllocation前后的情況。
綜上所述,為了實(shí)現(xiàn)對(duì)“回邊”的支持,微調(diào)度在運(yùn)用重排(Reorder)技術(shù)和協(xié)調(diào)(Negotiate)技術(shù)編排模調(diào)度認(rèn)為能在同一cycle中發(fā)射的指令集合的時(shí)候,除了考慮指令間的依賴關(guān)系以外,還要同時(shí)考慮指令間弧上的omega值和指令所在的stage。這樣才能和bundling之后Register Allocation配合起來(lái),取得較好的優(yōu)化性能。
下面參見圖4詳細(xì)說明本發(fā)明實(shí)施例中支持有向有環(huán)圖的微調(diào)度方法,如圖4所示,支持有向有環(huán)圖的微調(diào)度方法包括以下步驟步驟101,計(jì)算指令集(ops_list)中每條指令的級(jí)數(shù)值(Stage);其中,stage=location/II;ops_list為模調(diào)度認(rèn)為可放在同一cycle中發(fā)送的指令集,location為在扁平調(diào)度中的位置,II為啟動(dòng)間距;步驟103,判斷指令集(ops_list)是否為空?如果是,執(zhí)行步驟123;如果否,執(zhí)行下一步;步驟105,判斷機(jī)器當(dāng)前狀態(tài)空間(cur_state)是否已滿或所有指令(op)均有tried標(biāo)志,即指令是否已被選過?若是,執(zhí)行下一步,若否,執(zhí)行步驟109;步驟107,完成前一周期的機(jī)器狀態(tài)空間prev_state的模板指派,更新prev_state中指令的絕對(duì)slot值,把當(dāng)前周期的機(jī)器狀態(tài)空間值賦給前一周期的狀態(tài)空間,把當(dāng)前機(jī)器的狀態(tài)空間置空,即prev_state=cur_state,cur_state=NULL;步驟109,從指令集ops_list中選一指令OP,為其分配功能部件,把當(dāng)前機(jī)器的狀態(tài)空間cur_state賦給當(dāng)前周期的測(cè)試空間temp_state;步驟111,根據(jù)數(shù)據(jù)依賴圖,檢查當(dāng)前機(jī)器的狀態(tài)空間的每一條指令inst與指令op的相關(guān)性。即通過判斷是否有下列四種情況之一來(lái)判斷是否有相關(guān)性,如有,則執(zhí)行步驟115,如否,則執(zhí)行下一步;在步驟111中,四種情況為當(dāng)前周期的機(jī)器狀態(tài)空間中的任一條指令inst和該指令op間不存在數(shù)據(jù)相關(guān);數(shù)據(jù)依賴圖中指令inst與指令op的弧上延遲值為0,即Arc_latency(inst,op)==0;數(shù)據(jù)依賴圖中指令inst到指令op的弧上的Omega不為0,即Omega(inst,op)?。?;模調(diào)度中指令inst所在的級(jí)數(shù)不為指令op所在的級(jí)數(shù),即Stage(inst)?。絊tage(op);步驟113,置feasible為false,然后執(zhí)行步驟121,其中,feasible為判斷是否存在周期內(nèi)的依賴關(guān)系的邏輯變量;步驟115,將指令op加入當(dāng)前周期的測(cè)試空間temp_state狀態(tài)空間中,置feasible為TRUE,調(diào)用Bundle_Helper為temp_state中的指令尋找模板,并實(shí)現(xiàn)FSA的狀態(tài)轉(zhuǎn)移,其中,Bundle_Helper為微調(diào)度中現(xiàn)有模板匹配函數(shù),其功能是在當(dāng)前周期內(nèi),試圖通過有限狀態(tài)自動(dòng)機(jī)(FSAFinite State Automata)的狀態(tài)轉(zhuǎn)移,為temp_state狀態(tài)空間中的指令尋找合適的模板;步驟117,判斷FSA狀態(tài)轉(zhuǎn)移是否成功?如果是,執(zhí)行下一步,如果否,執(zhí)行步驟121;步驟119,測(cè)試成功,把temp_state的值賦給cur_state,即cur_state=temp_state,更新指令op的絕對(duì)slot值,從指令集ops_list中刪除該指令op,然后執(zhí)行步驟103;步驟121,在cur_state中為指令op做上tried標(biāo)記,然后執(zhí)行步驟105;步驟123,微調(diào)度結(jié)束。
綜上所述,本發(fā)明為了實(shí)現(xiàn)對(duì)“回邊”的支持,微調(diào)度在運(yùn)用重排(Reorder)技術(shù)和協(xié)調(diào)(Negotiate)技術(shù)編排模調(diào)度認(rèn)為能在同一cycle中發(fā)射的指令集合的時(shí)候,除了考慮指令間的依賴關(guān)系以外,還要同時(shí)考慮指令間弧上的omega值和指令所在的stage。這樣才能和bundling之后Register Allocation配合起來(lái),取得較好的優(yōu)化性能,避免軟件流水模調(diào)度中出現(xiàn)的分拆問題(Split issue),減小了出現(xiàn)指令cache訪問不命中(I-Cache miss)的可能性,提高了并行編譯效率,從而進(jìn)一步提高了編譯優(yōu)化性能。
權(quán)利要求
1.一種支持有向有環(huán)圖的微調(diào)度方法,其特征在于包括以下步驟a)計(jì)算指令集中每條指令的級(jí)數(shù)值;b)判斷指令集是否為空?如果是,執(zhí)行步驟l);如果否,執(zhí)行下一步;c)判斷機(jī)器當(dāng)前狀態(tài)空間是否已滿或所有指令均被選過?若是,執(zhí)行下一步,若否,執(zhí)行步驟e);d)完成前一周期的機(jī)器狀態(tài)空間的模板指派,更新前一周期的機(jī)器狀態(tài)空間中指令的絕對(duì)槽值,把當(dāng)前周期的機(jī)器狀態(tài)空間賦給前一周期的狀態(tài)空間,把當(dāng)前機(jī)器的狀態(tài)空間置空;e)從指令集中選一指令,為其分配功能部件,把當(dāng)前機(jī)器的狀態(tài)空間值賦給當(dāng)前周期的測(cè)試空間;f)根據(jù)數(shù)據(jù)依賴圖,檢查當(dāng)前機(jī)器的狀態(tài)空間的每一條指令與步驟e)中選取指令的相關(guān)性,即判斷是否有下列四種情況之一來(lái)判斷相關(guān)性,如有,則執(zhí)行步驟h),如否,則執(zhí)行下一步;四種情況為當(dāng)前周期的機(jī)器狀態(tài)空間中的任一條指令和所選指令間不存在數(shù)據(jù)相關(guān);數(shù)據(jù)依賴圖中任一指令與所選指令的弧上延遲值為0;數(shù)據(jù)依賴圖中任一指令到所選指令的弧上的循環(huán)迭代數(shù)差值不為0;模調(diào)度中任一指令所在的級(jí)數(shù)不為所選指令所在的級(jí)數(shù);g)置feasible為false,然后執(zhí)行步驟k),其中,feasible為判斷是否存在周期內(nèi)的依賴關(guān)系的邏輯變量;h)將指令op加入當(dāng)前周期的測(cè)試空間中,置feasible為TRUE,調(diào)用模板匹配函數(shù)為當(dāng)前周期的測(cè)試空間狀態(tài)中的指令尋找模板,并實(shí)現(xiàn)有限狀態(tài)自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)移;i)判斷有限狀態(tài)自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)移是否成功?如果是,執(zhí)行下一步,如果否,執(zhí)行步驟l);j)測(cè)試成功,把當(dāng)前周期的測(cè)試空間的值賦給當(dāng)前周期的機(jī)器狀態(tài)空間,更新所選指令的絕對(duì)槽值,從指令集中刪除所選指令,然后執(zhí)行步驟b);k)在當(dāng)前周期的機(jī)器狀態(tài)空間中為所選指令做上已選標(biāo)記,然后執(zhí)行步驟c);l)微調(diào)度結(jié)束。
2.如權(quán)利要求1所述的一種支持有向有環(huán)圖的微調(diào)度方法,其特征在于,所述指令集為模調(diào)度認(rèn)為放在同一cycle中發(fā)送的指令集。
3.如權(quán)利要求1所述的一種支持有向有環(huán)圖的微調(diào)度方法,其特征在于步驟a)中所述每條指令的級(jí)數(shù)值為所述指令在扁平調(diào)度中的位置除以啟動(dòng)間距。
4.如權(quán)利要求1所述的一種支持有向有環(huán)圖的微調(diào)度方法,其特征在于,所述絕對(duì)槽值表示所述方法結(jié)束后指令的絕對(duì)槽值。
全文摘要
本發(fā)明涉及一種支持有向有環(huán)圖的微調(diào)度方法,在運(yùn)用重排(Reorder)技術(shù)和協(xié)調(diào)(Negotiate)技術(shù)編排模調(diào)度認(rèn)為能在同一cycle中發(fā)射的指令集合的時(shí)候,除了考慮指令間的依賴關(guān)系以外,還要同時(shí)考慮指令間弧上的延遲值和指令所在的級(jí)數(shù),實(shí)現(xiàn)對(duì)“回邊”的支持;避免軟件流水模調(diào)度中出現(xiàn)的分拆問題(Split issue),減小了出現(xiàn)指令cache訪問不命中(I-Cache miss)的可能性,提高了并行編譯效率,從而進(jìn)一步提高了編譯優(yōu)化性能。
文檔編號(hào)G06F9/45GK1670699SQ20041002945
公開日2005年9月21日 申請(qǐng)日期2004年3月19日 優(yōu)先權(quán)日2004年3月19日
發(fā)明者文嚴(yán)治, 連瑞琦, 劉章林, 吳承勇, 張兆慶 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所