專利名稱:高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種可重構(gòu)計算任務(wù)編譯領(lǐng)域優(yōu)化實現(xiàn)方法,尤其是涉及一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法。
背景技術(shù):
可重構(gòu)計算陣列處理器是針對軟硬件協(xié)同設(shè)計的硬件平臺,其架構(gòu)是介于傳統(tǒng)的通用處理器和專用集成電路之間的一種硬件架構(gòu),兼顧了系統(tǒng)的靈活性和高效性,其組成一般包含通用處理器和可重構(gòu)計算陣列??芍貥?gòu)計算陣列處理器上應(yīng)用的開發(fā)過程包括將應(yīng)用劃分為不同的任務(wù),并將計算密集型任務(wù)映射到計算單元陣列上以提高其計算速度和性能,而將控制密集型任務(wù)映射為軟件以發(fā)揮通用處理器的優(yōu)勢??芍貥?gòu)計算陣列處理器的自動編譯技術(shù)可以有效減低應(yīng)用程序開發(fā)的難度,該技術(shù)中使用數(shù)據(jù)流圖(Data Flow Graph,簡稱DTO)來表示應(yīng)用中的運算任務(wù)。通過數(shù)據(jù)流圖, 編譯程序可以自動分析運算的依賴關(guān)系和并行性,從而有利于任務(wù)在可重構(gòu)運算陣列上的映射。由于可重構(gòu)計算陣列中不包含訪存功能,能夠直接向該陣列上映射的數(shù)據(jù)流圖中不應(yīng)包含訪存的數(shù)據(jù)。在應(yīng)用程序中循環(huán)的運行所占用的資源最大,數(shù)據(jù)密集型運算往往都以循環(huán)的形式出現(xiàn),循環(huán)部分的執(zhí)行速度影響著整個系統(tǒng)的運行速度,而且循環(huán)部分是應(yīng)用程序中最有可能發(fā)掘出并行性的部分,將循環(huán)高效地映射到可重構(gòu)陣列上能夠有效提高可重構(gòu)計算陣列處理器的計算速度,因此有效提取出循環(huán)的數(shù)據(jù)流圖對整個可重構(gòu)計算陣列處理器編譯系統(tǒng)具有重要的作用。經(jīng)過對現(xiàn)有技術(shù)的文獻檢索發(fā)現(xiàn),Chongyong Yin等人于2009年在 ((International Conference on Communications, Circuits and Systems))上發(fā)表白勺 《Compiler framework for reconfigurable computing system》(可重構(gòu)計算系統(tǒng)的編譯框架)中討論了面向可重構(gòu)陣列處理器數(shù)據(jù)流圖的生成方法。該文中提出的方法是首先生成整個程序代碼的CFG (控制流圖),接著分析CFG中的每個基本塊,并生成每個基本塊的 DFG0但是這種方法主要面向整個程序而不是面向循環(huán),沒有有效地區(qū)分計算密集型代碼和控制密集型代碼;且該方法是在控制流圖中的基本塊中提取數(shù)據(jù)流圖,這樣使得提取出的數(shù)據(jù)流圖規(guī)模小數(shù)量多,不利于自動編譯系統(tǒng)后端的劃分和映射優(yōu)化。
發(fā)明內(nèi)容
本發(fā)明的目的就是為了克服上述現(xiàn)有技術(shù)存在的缺陷而提供一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法。本發(fā)明的目的可以通過以下技術(shù)方案來實現(xiàn)—種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法,其特征在于,自動分析并展開高級語言程序中的循環(huán)部分,對其中的訪存操作進行預(yù)取和寫回處理,接著將其中的指令提取為不同類別的節(jié)點,通過分析這些節(jié)點生成有向邊,并形成數(shù)據(jù)流圖,具體步驟如下
1)代碼文本掃描模塊對整個高級語言代碼進行詞法和語法信息進行分析,并生成語法樹形式的中間表示數(shù)據(jù),然后執(zhí)行步驟2);2)循環(huán)展開模塊以語法樹形式的中間表示數(shù)據(jù)作為輸入,獲取其中代碼結(jié)構(gòu)信息,并對于每一個循環(huán),首先根據(jù)循環(huán)的初始條件和結(jié)束條件來確定循環(huán)的次數(shù),接著按照循環(huán)的次數(shù)或者用戶設(shè)定的次數(shù)進行循環(huán)的展開,并標定展開后的代碼塊,然后執(zhí)行步驟 3);3)預(yù)取和寫回模塊將標定的代碼塊進行訪存變量的預(yù)取和寫回,首先將讀存儲器的操作數(shù)預(yù)取到標量中,將循環(huán)中所有讀寫存儲器的操作數(shù)替換為對應(yīng)的標量,并在代碼塊的結(jié)束處將涉及寫存儲器的標量寫回到存儲器中,然后執(zhí)行步驟4);4)中間表示轉(zhuǎn)換模塊將語法樹形式的中間表示數(shù)據(jù)轉(zhuǎn)為指令列表形式的中間表示數(shù)據(jù),節(jié)點生成模塊將標定代碼塊中的每一條指令根據(jù)源操作數(shù)的數(shù)目進行分類,對分類后的代碼進行相應(yīng)的計算節(jié)點CNode的生成,然后執(zhí)行步驟5);5)邊生成模塊根據(jù)每一計算節(jié)點中的opnd和dst的數(shù)據(jù)的變量名來分析各個計算節(jié)點之間的依賴關(guān)系信息,存在從一個變量集合set到另一變量a的運算,就存在從set 集合中所有變量到變量a的有向邊,從而生成有向邊,并形成數(shù)據(jù)流圖。所述的步驟2、中的循環(huán)展開的次數(shù)為由用戶指定或根據(jù)程序的語義進行自動識別,對于此處未展開的部分進行數(shù)據(jù)流圖的提取時只提取循環(huán)體部分。所述的步驟幻中使用了一個查找表來記錄這些訪存操作的狀態(tài),從而保證替換后的依賴關(guān)系和語義不變。所述的步驟4)中指令根據(jù)源操作數(shù)的數(shù)目進行分類為單操作數(shù)指令、雙操作數(shù)指令和三操作數(shù)指令。所述的步驟4)中計算節(jié)點CNode的域包含節(jié)點編號Num、操作符op、操作數(shù)個數(shù) opnd_num、操作數(shù)opnd禾口目的操作數(shù)dst。與現(xiàn)有技術(shù)相比,本發(fā)明實現(xiàn)了高級語言代碼中循環(huán)的數(shù)據(jù)流圖的有效提取,本發(fā)明的有益效果是循環(huán)展開模塊能夠根據(jù)循環(huán)的規(guī)模自動擴展數(shù)據(jù)流圖的規(guī)模,預(yù)取和寫回模塊能夠有效集中了訪存操作,有效縮短層次化存儲系統(tǒng)的訪問延遲30%以上。
具體實施例方式下面結(jié)合具體實施例對本發(fā)明進行詳細說明。實施例本發(fā)明數(shù)據(jù)流圖提取方法可以用于改進C語言程序MPEG2中的for循環(huán)的數(shù)據(jù)流圖的提取,主要包括以下步驟1)代碼文本掃描模塊對整個高級語言代碼進行詞法和語法分析,并生成語法樹形式的中間表示,語法樹形式的中間表示保持了高級語言代碼的結(jié)構(gòu)化特點,易于編譯系統(tǒng)的分析。代碼文本掃描模塊是一般高級語言編譯系統(tǒng)進行編譯和優(yōu)化之前的必要模塊。2)循環(huán)展開模塊以語法樹形式的中間表示作為輸入,獲取其中代碼結(jié)構(gòu)信息,并對于每一個循環(huán),首先根據(jù)循環(huán)的初始條件Cs和結(jié)束條件Ce來確定循環(huán)的次數(shù)N,代碼結(jié)構(gòu)信息包括過程、代碼塊和語句。對于C語言的for循環(huán),循環(huán)次數(shù)N的計算公式N = (U-L)/st印,其中U為循環(huán)上界,L為循環(huán)下界,step為循環(huán)步長。
接著對于每一個循環(huán)執(zhí)行以下操作①循環(huán)的展開。接著根據(jù)用戶的輸入來決定展開的次數(shù)M,默認為全部展開,即M =N ;根據(jù)展開次數(shù)M對循環(huán)進行展開,并對循環(huán)相關(guān)的變量替換為循環(huán)無關(guān)的變量,以保持程序的語義;②對于未展開的部分(N-M),將其保持為原程序的循環(huán)結(jié)構(gòu),并將循環(huán)次數(shù)設(shè)置為 N-M ;③將展開后的代碼塊標記為B,若此處無法確定循環(huán)的次數(shù),則該部分不進行循環(huán)的展開,并將循環(huán)體部分進行標定。3)預(yù)取和寫回模塊將標定的代碼塊進行訪存變量的預(yù)取和寫回,首先將讀存儲器的操作數(shù)預(yù)取到標量中,將循環(huán)中所有讀寫存儲器的操作數(shù)替換為對應(yīng)的標量,并在代碼塊的結(jié)束處將涉及寫存儲器的標量寫回到存儲器中。此處需要使用查找表技術(shù)來記錄代碼的依賴關(guān)系,以保持替換后的依賴關(guān)系和語義不變,這樣既支持了一般可重構(gòu)陣列不具有訪存功能這一特性,也有效集中了訪存操作,有效縮短層次化存儲系統(tǒng)的訪問延遲。新建一個查找表LUT用于記錄代碼塊B中的所有訪存變量的狀態(tài)。對于B中每一個訪存操作m,執(zhí)行以下操作①如果m在LUT中,則將其替換為LUT中對應(yīng)項的標量,若不在,則將m替換為一個新標量,并將m和該新標量一起插入到LUT中;②如果m為讀存儲器操作,則將LUT表中對應(yīng)項的讀寫狀態(tài)記錄為讀;如果m為寫存儲器操作,則將LUT表中對應(yīng)項的讀寫狀態(tài)記錄為寫;③對LUT表中的每一項,根據(jù)其讀寫狀態(tài)進行對應(yīng)的預(yù)取和寫回,即某一項的第一次出現(xiàn)的狀態(tài)為讀則進行預(yù)取,只要有一種狀態(tài)為寫則需要進行寫回。4)中間表示轉(zhuǎn)換模塊將語法樹形式的中間表示轉(zhuǎn)為指令列表形式的中間表示,指令列表形式的中間表示結(jié)構(gòu)簡單,易于分析程序的依賴關(guān)系。節(jié)點生成模塊將標定代碼塊中的每一條指令根據(jù)源操作數(shù)的數(shù)目進行分類,分為(如絕對值操作、取反操作等);兩操作數(shù)指令(如算術(shù)運算、邏輯運算等);三操作數(shù)指令(如三目操作等)。對分類后的代碼進行相應(yīng)的計算節(jié)點CNode的生成。計算節(jié)點CNode的域包含節(jié)點編號Num,操作符op,操作數(shù)個數(shù)opncLnum,操作數(shù)opnd,目的操作數(shù)dst。節(jié)點編號Num是隨機生成的唯一的標識碼,計算指令中的源操作數(shù)作為計算節(jié)點的opnd,目的操作數(shù)作為計算節(jié)點的dst,操作數(shù)作為計算節(jié)點的操作符op,opnd_num即為指令的類型。5)邊生成模塊根據(jù)每一計算節(jié)點中的opnd和dst的數(shù)據(jù)的變量名來分析各個計算節(jié)點之間的依賴關(guān)系,存在從一個變量集合set到另一變量a的運算,就存在從set集合中所有變量到變量a的有向邊。邊生成模塊可以計算出每個節(jié)點完整的輸入和輸出信息, 并將這些信息回填到各個節(jié)點中,將沒有前驅(qū)節(jié)點的節(jié)點標記為輸入節(jié)點INode,將沒有后繼節(jié)點的節(jié)點標記為輸出節(jié)點ONode。這時循環(huán)的數(shù)據(jù)流圖已經(jīng)生成。使用本實施例的實施結(jié)果表明,使用循環(huán)展開模塊能夠使得數(shù)據(jù)流圖的個數(shù)增加 2. 7倍,平均單個數(shù)據(jù)流圖規(guī)模增加34%,預(yù)取和寫回模塊有效集中了訪存操作,在其他條件不變的情況下減少層次化存儲系統(tǒng)的訪問延遲46%。綜上所述,本發(fā)明實現(xiàn)了一個高級語言代碼中循環(huán)的數(shù)據(jù)流圖的提取方法,能夠有效的分析并提取循環(huán)中的數(shù)據(jù)流圖,本發(fā)明的有益效果是能夠根據(jù)循環(huán)的規(guī)模自動擴展數(shù)據(jù)流圖的規(guī)模,并能夠有效集中了訪存操作,比現(xiàn)有技術(shù)減少層次化存儲系統(tǒng)的訪問延遲。
權(quán)利要求
1.一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法,其特征在于,自動分析并展開高級語言程序中的循環(huán)部分,對其中的訪存操作進行預(yù)取和寫回處理,接著將其中的指令提取為不同類別的節(jié)點,通過分析這些節(jié)點生成有向邊,并形成數(shù)據(jù)流圖,具體步驟如下1)代碼文本掃描模塊對整個高級語言代碼進行詞法和語法信息進行分析,并生成語法樹形式的中間表示數(shù)據(jù),然后執(zhí)行步驟2);2)循環(huán)展開模塊以語法樹形式的中間表示數(shù)據(jù)作為輸入,獲取其中代碼結(jié)構(gòu)信息,并對于每一個循環(huán),首先根據(jù)循環(huán)的初始條件和結(jié)束條件來確定循環(huán)的次數(shù),接著按照循環(huán)的次數(shù)或者用戶設(shè)定的次數(shù)進行循環(huán)的展開,并標定展開后的代碼塊,然后執(zhí)行步驟3);3)預(yù)取和寫回模塊將標定的代碼塊進行訪存變量的預(yù)取和寫回,首先將讀存儲器的操作數(shù)預(yù)取到標量中,將循環(huán)中所有讀寫存儲器的操作數(shù)替換為對應(yīng)的標量,并在代碼塊的結(jié)束處將涉及寫存儲器的標量寫回到存儲器中,然后執(zhí)行步驟4);4)中間表示轉(zhuǎn)換模塊將語法樹形式的中間表示數(shù)據(jù)轉(zhuǎn)為指令列表形式的中間表示數(shù)據(jù),節(jié)點生成模塊將標定代碼塊中的每一條指令根據(jù)源操作數(shù)的數(shù)目進行分類,對分類后的代碼進行相應(yīng)的計算節(jié)點CNode的生成,然后執(zhí)行步驟5);5)邊生成模塊根據(jù)每一計算節(jié)點中的opnd和dst的數(shù)據(jù)的變量名來分析各個計算節(jié)點之間的依賴關(guān)系信息,存在從一個變量集合set到另一變量a的運算,就存在從set集合中所有變量到變量a的有向邊,從而生成有向邊,并形成數(shù)據(jù)流圖。
2.根據(jù)權(quán)利要求1所述的一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法, 其特征在于,所述的步驟幻中的循環(huán)展開的次數(shù)為由用戶指定或根據(jù)程序的語義進行自動識別,對于此處未展開的部分進行數(shù)據(jù)流圖的提取時只提取循環(huán)體部分。
3.根據(jù)權(quán)利要求1所述的一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法, 其特征在于,所述的步驟2、中使用了一個查找表來記錄這些訪存操作的狀態(tài),從而保證替換后的依賴關(guān)系和語義不變。
4.根據(jù)權(quán)利要求1所述的一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法, 其特征在于,所述的步驟4)中指令根據(jù)源操作數(shù)的數(shù)目進行分類為單操作數(shù)指令、雙操作數(shù)指令和三操作數(shù)指令。
5.根據(jù)權(quán)利要求1所述的一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法, 其特征在于,所述的步驟4)中計算節(jié)點CNode的域包含節(jié)點編號Num、操作符op、操作數(shù)個數(shù)opnd_num、操作數(shù)opnd和目的操作數(shù)dst。
全文摘要
本發(fā)明涉及一種高級語言代碼中循環(huán)數(shù)據(jù)流圖提取優(yōu)化信息處理方法,自動分析并展開高級語言程序中的循環(huán)部分,對其中的訪存操作進行預(yù)取和寫回處理,接著將其中的指令提取為不同類別的節(jié)點,通過分析這些節(jié)點生成有向邊,并形成數(shù)據(jù)流圖。與現(xiàn)有技術(shù)相比,本發(fā)明具有效率高、易于實現(xiàn)等優(yōu)點。
文檔編號G06F9/45GK102360306SQ20111031918
公開日2012年2月22日 申請日期2011年10月19日 優(yōu)先權(quán)日2011年10月19日
發(fā)明者付宇卓, 何衛(wèi)鋒, 景乃鋒, 曹超, 毛志剛, 繩偉光 申請人:上海交通大學(xué)