[0051]指令間的數(shù)據(jù)依賴關(guān)系的枚舉類型:包括數(shù)據(jù)讀寫數(shù)據(jù)依賴關(guān)系類型和訪存數(shù)據(jù)依賴關(guān)系類型,此外,也可包括由體系結(jié)構(gòu)決定的其他隱式數(shù)據(jù)依賴關(guān)系類型。
[0052]執(zhí)行單元的枚舉類型:包括物理執(zhí)行單元的枚舉值、擴(kuò)展的起輔助作用的組合執(zhí)行單元的枚舉值。枚舉值從O開始增長,先是所有的物理執(zhí)行單元的枚舉,然后才是擴(kuò)展的輔助執(zhí)行單元的枚舉。該枚舉類型定義在處理器的體系結(jié)構(gòu)類中,枚舉值是連續(xù)變化的,每一個功能單元都對應(yīng)一個唯一的枚舉值,對于擴(kuò)展的輔助執(zhí)行單元,需要考慮所有可能的組合。
[0053]實時的有效指令組數(shù)量(effectivelnstnGroupNum):該值為一個非負(fù)整數(shù),用于保存在某個時刻依賴網(wǎng)格中仍然保存了有效指令的行數(shù)。由于在某些代碼優(yōu)化過程中依賴網(wǎng)格中的指令會逐步移除,因而某個網(wǎng)格中的某些指令會要移動到優(yōu)先級更高的同列網(wǎng)格中,從而使得保存著有效指令的行數(shù)減少。
[0054]在面向?qū)ο笳Z言程序中,數(shù)據(jù)和相關(guān)的功能模塊都封裝在類中。本實施例中,基本塊和基本塊中的指令的基本信息保存在基本塊類對象和指令類對象之中,指定執(zhí)行相應(yīng)指令的候選功能單元信息包含在指令模板信息中并保存在指令模板類的對象中,各指令對象具有確定的指令模板;體系結(jié)構(gòu)的基本信息保存在體系結(jié)構(gòu)類對象中,通過指針或者全局變量名進(jìn)行訪問。
[0055]步驟1:指令的數(shù)據(jù)依賴優(yōu)先級值計算
獲取到指令間的數(shù)據(jù)依賴關(guān)系后,進(jìn)行指令間的數(shù)據(jù)依賴關(guān)系分析,計算指令間的數(shù)據(jù)依賴優(yōu)先級值,劃分?jǐn)?shù)據(jù)依賴優(yōu)先級,步驟如下:
①將指令的數(shù)據(jù)依賴優(yōu)先級值表中的元素個數(shù)設(shè)計為與指令數(shù)量相同,并將各元素的值初始化為O ;
②通過循環(huán)正序遍歷基本塊內(nèi)的各指令,每次循環(huán)處理的指令設(shè)為curlnstn,循環(huán)執(zhí)行步驟③?⑩查找依賴指令;
③形成curlnstn涉及的源變量集合和目標(biāo)變量集合,然后,為每個變量設(shè)置一個依賴關(guān)系解除標(biāo)識,當(dāng)變量依賴解除標(biāo)識的狀態(tài)和訪存依賴解除標(biāo)識的狀態(tài)都為解除時,結(jié)束對curlnstn的依賴指令的尋找;
④將變量依賴關(guān)系解除標(biāo)識置為未解除狀態(tài),并根據(jù)指令是否為訪存類指令來設(shè)置訪存依賴關(guān)系解除標(biāo)識的狀態(tài)為解除(針對非訪存類指令)或未解除(針對訪存類指令);
⑤從curlnstn的前一條指令開始,通過循環(huán)向基本塊的首指令逆序遍歷各指令,每次循環(huán)處理的指令設(shè)為prelnstn,并執(zhí)行步驟⑥;
⑥分析curlnstn對prelnstn的數(shù)據(jù)依賴類型的組合,當(dāng)存儲數(shù)據(jù)依賴時,生成prelnstn的源變量集合和目標(biāo)變量集合,并且,如果依賴類型中是否含有寫后寫和寫后讀及類似的依賴,設(shè)置刪除變量標(biāo)識deleteVarFlag為真,否則為假,轉(zhuǎn)入執(zhí)行步驟⑦;否則,將prelnstn切換為前一條指令,重新執(zhí)行本步驟;
⑦如果curlnstn和prelnstn都是訪存指令,并且對存儲器具有寫后讀或?qū)懞髮戭愋?,則令訪存依賴解除標(biāo)識為解除狀態(tài),否則維持原來狀態(tài);
⑧描述curlnstn和prelnstn之間的依賴關(guān)系,當(dāng)curlnstn的數(shù)據(jù)依賴優(yōu)先級值不大于prelnstn時,修改curlnstn的數(shù)據(jù)依賴優(yōu)先級值為prelnstn的數(shù)據(jù)依賴優(yōu)先級值加I ;
⑨從curlnstn的源變量集合和目標(biāo)變量集合中刪除寫后寫、寫后讀這類依賴相關(guān)的寄存器名,對由體系結(jié)構(gòu)造成的特殊數(shù)據(jù)依賴關(guān)系類型,則將依賴相關(guān)的寄存器名從兩個集合中刪去;
⑩判斷curlnstn的源變量集合和目標(biāo)變量集合是否都被清空,如果為空則將curlnstn的變量依賴解除標(biāo)識的狀態(tài)置為解除,返回執(zhí)行步驟③。
[0056]步驟2:依賴網(wǎng)格建立步驟2.1:指令組劃分
本步驟即是將具有相同數(shù)據(jù)依賴優(yōu)先級值的那些指令集中到相同的組中,得到按數(shù)據(jù)依賴優(yōu)先級值升序排列的多個指令對象指針集合構(gòu)成的指令組,步驟如下:
①用一個循環(huán)依次遍歷各指令,找出它們的數(shù)據(jù)依賴優(yōu)先級值的最大值maxDataDepPr1rityVal,此值即基本塊的硬件無關(guān)執(zhí)行延遲時間;
②根據(jù)所得的maxDataDepPr1rityVal值來確定保存各指令組的數(shù)組指令組序列instnGroups的大小,指令組對應(yīng)的數(shù)組元素的下標(biāo)與數(shù)據(jù)依賴優(yōu)先級值相同;
③用一個循環(huán)依次遍歷各指令,在循環(huán)體內(nèi),先獲得指令的數(shù)據(jù)依賴優(yōu)先級值,再將指令填寫到與此值相應(yīng)的指令組中。
[0057]步驟2.2:指令子組劃分
步驟2.1中確定了不考慮硬件的執(zhí)行單元數(shù)量限制的情況下邏輯上哪些指令可以在同一個節(jié)拍中同時發(fā)射,以及執(zhí)行基本塊內(nèi)的所有指令所需的邏輯執(zhí)行延時。本步驟則是根據(jù)指令組劃分的結(jié)果,進(jìn)一步建立指令組中各指令與功能單元的對應(yīng)關(guān)系,并根據(jù)處理器的物理執(zhí)行單元數(shù)量和指令集特征將一個指令組劃分成多個指令子組,由指令對應(yīng)的指令模板即可獲得指令可以在哪些執(zhí)行單元中執(zhí)行。
[0058]步驟2.2的詳細(xì)步驟如下:
①用指令組序列instnGroups的數(shù)組元素個數(shù)和總執(zhí)行單元數(shù)Nteu,分別作為指令子組二維表instnGroupsForUnits的的第一維和第二維的長度的初始值,用表的行數(shù)作為整型變量實時的有效指令組數(shù)量effectivelnstnGroupNum的初始值;
②用一個二重循環(huán)遍歷每個指令組中的每條指令,外層循環(huán)依次遍歷各指令組,內(nèi)層循環(huán)依次遍歷一個指令組內(nèi)的各指令對象,在內(nèi)層循環(huán)中循環(huán)執(zhí)行步驟③~⑤;
③如果指令源代碼中已經(jīng)指定執(zhí)行的功能單元,則令指令的可能執(zhí)行單元代號和最終執(zhí)行單元代號都定為指定的這個執(zhí)行單元的代號,并將指令添加到此功能單元對應(yīng)網(wǎng)格的指令子組中;否則執(zhí)行步驟④;
④如果指令只能在某一個功能單元中執(zhí)行,令指令的可能執(zhí)行單元代號和最終執(zhí)行單元代號都定為這個功能單元的代號,并將指令添加到此功能單元對應(yīng)網(wǎng)格的指令子組中;否則執(zhí)行步驟⑤;
⑤根據(jù)指令的指令模板對象中保存的候選執(zhí)行單元類別信息,按確定組合功能單元時的規(guī)則確定相應(yīng)的擴(kuò)展執(zhí)行單元代號,將指令的可能執(zhí)行單元代號定為這個代號,并將指令添加到此擴(kuò)展執(zhí)行單元對應(yīng)網(wǎng)格的指令子組中。
[0059]步驟3:并行性識別
在涉及代碼調(diào)度或代碼變換的優(yōu)化中一般需要知道相關(guān)的并行性信息,作為優(yōu)化的依據(jù),本實施例根據(jù)獲得的依賴網(wǎng)格可實現(xiàn)多種并行性信息識別以及關(guān)聯(lián)狀態(tài),包括:
識別指令的邏輯并行性:定義保存所需指令信息的集合S,然后遍歷依賴網(wǎng)格中與邏輯時間點(diǎn)對應(yīng)的那一行中的各個單元格,將其中的各指令信息添加到集合S中,集合S中即為所需的基本塊內(nèi)某個邏輯時間點(diǎn)的候選指令集合。
[0060]獲取指定功能單元某個邏輯時間點(diǎn)的候選指令集合:定義保存所需指令信息的集合S,通過邏輯時間點(diǎn)找到依賴網(wǎng)格中對應(yīng)的行號,通過功能單元號找到對應(yīng)的列號,將行號和列號對應(yīng)的單元格中保存的信息復(fù)制到集合S中,集合S中即為指定功能單元某個邏輯時間點(diǎn)的候選指令集合。
[0061]獲取各執(zhí)行單元的工作量:通過遍歷依賴網(wǎng)格中的各單元格對單元格中的指令計數(shù),然后遍歷依賴網(wǎng)格的各列,計算出列的指令總數(shù),即可獲得各邏輯節(jié)拍上各執(zhí)行單元的工作量以及總的工作量。
[0062]獲取某個功能單元因某條候選指令而與其他功能單元產(chǎn)生的關(guān)聯(lián)關(guān)系:通過依賴網(wǎng)格中對指令所從屬的功能單元的描述,可以直接確定由數(shù)據(jù)依賴相關(guān)聯(lián)的兩個功能單元,在此基礎(chǔ)上,通過對各候選指令所引起的關(guān)聯(lián)單元計數(shù),可以獲得它們所引起的關(guān)聯(lián)單元的數(shù)量信息,進(jìn)而計算出與之有關(guān)的關(guān)聯(lián)單元數(shù)。
[0063]預(yù)測下一拍關(guān)聯(lián)單元的可能狀態(tài):在指令調(diào)度時,找出依賴網(wǎng)格某個關(guān)聯(lián)單元對應(yīng)的列的第一行和第二行的單元格中的指令集合SI和S2。如果集合SI是空的,如果集合S2中某條指令所依賴的指令在本拍都能夠發(fā)射,那么可以預(yù)測在下一拍一定能夠發(fā)射該指令。
[0064]除上述并行性識別方法外,對于某些更激進(jìn)的代碼優(yōu)化技術(shù),也可能根據(jù)優(yōu)化的需求從依賴網(wǎng)格中識別出更具前瞻性的并行性。
[0065]步驟4:依賴網(wǎng)格內(nèi)容動態(tài)調(diào)整
本步驟用于在依賴網(wǎng)格第一行的某些指令被移除后,重新調(diào)整相關(guān)指令在依賴網(wǎng)格表格(指令子組二維表)中位置,步驟如下:
①如果實時的有效指令組數(shù)量effectivelnstnGroupNum的值小于I,表明已經(jīng)沒有指令保存在依賴網(wǎng)格中了,則結(jié)束