本發(fā)明屬于計(jì)算軟件,具體涉及一種面向連續(xù)訪存的程序編譯優(yōu)化方法、系統(tǒng)及設(shè)備。
背景技術(shù):
1、risc-v(reduced?instruction?set?computer?-?v)是一種開放的指令集架構(gòu)(instruction?set?architecture,isa),由加州大學(xué)伯克利分校于2010年開始設(shè)計(jì)。risc-v?isa的設(shè)計(jì)著眼于提供一種簡(jiǎn)潔、模塊化的架構(gòu),旨在滿足從嵌入式到高性能計(jì)算的廣泛應(yīng)用需求。risc-v指令集包含了基本的指令集(rv64i),以及一系列的模塊化擴(kuò)展指令集,如乘法-除法擴(kuò)展(m)、原子操作擴(kuò)展(a)、浮點(diǎn)數(shù)擴(kuò)展(f/d)等。該設(shè)計(jì)兼具硬件實(shí)現(xiàn)的簡(jiǎn)便性以及良好的指令集擴(kuò)展性和軟件靈活性。相比于其他商業(yè)指令集架構(gòu),risc-v具備開放、模塊化等優(yōu)勢(shì),因此吸引了眾多硬件工程師設(shè)計(jì)并實(shí)現(xiàn)符合各種市場(chǎng)需求的risc-v處理器。同時(shí),也吸引了很多軟件工程師為其開發(fā)高效的編譯器工具鏈,并編譯優(yōu)化客戶的應(yīng)用軟件。
2、在risc-v處理器中,訪存操作(memory?access)是一個(gè)關(guān)鍵的性能瓶頸,尤其是對(duì)于高性能處理器,例如超標(biāo)量亂序處理器。訪存操作相比于其他指令(例如算數(shù)指令)通常需要更多時(shí)鐘周期才能完成。此瓶頸無法通過硬件迭代升級(jí)簡(jiǎn)單解決,因?yàn)閮?nèi)存頻率基本總低于處理器主頻,因此訪存操作總慢于處理器計(jì)算指令速度(且差距逐步拉大),而且處理器的訪存處理單元數(shù)量有限,而程序訪存操作通常在短時(shí)內(nèi)觸發(fā)多次,導(dǎo)致處理單元緊缺,指令執(zhí)行需要排隊(duì)等待,導(dǎo)致程序執(zhí)行效率低,程序占用內(nèi)存大。
技術(shù)實(shí)現(xiàn)思路
1、本發(fā)明要解決的技術(shù)問題是提供一種面向連續(xù)訪存的程序編譯優(yōu)化方法、系統(tǒng)及設(shè)備,能夠減少訪存次數(shù),提高程序執(zhí)行效率以及減小指令體積。
2、一種面向連續(xù)訪存的程序編譯優(yōu)化方法,包括:
3、將已編碼程序進(jìn)行編譯,得到中間代碼;
4、遍歷所述中間代碼,將中間代碼中的訪存指令存入候選指令隊(duì)列;
5、將所述候選指令隊(duì)列中的訪存指令進(jìn)行兩兩組隊(duì),得到訪存指令對(duì),多個(gè)訪存指令對(duì)組成訪存指令對(duì)隊(duì)列;
6、判斷所述訪存指令對(duì)中的低地址偏移量是否大于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍;
7、若所述訪存指令對(duì)中的低地址偏移量大于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍,則添加立即數(shù)指令在所述訪存指令對(duì)內(nèi);
8、基于所述立即數(shù)指令,將所述訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令;
9、若所述訪存指令對(duì)中的低地址偏移量小于或等于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍,則基于低地址偏移量以及基址寄存器,將所述訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令;
10、將所有轉(zhuǎn)化的ldg類訪存指令插入已編碼程序中對(duì)應(yīng)的位置組成新的程序,作為優(yōu)化程序。
11、可選的,所述遍歷所述中間代碼,將中間代碼中的訪存指令存入候選指令隊(duì)列包括:
12、判斷所述中間代碼中的訪存指令存入之前的所述候選指令隊(duì)列是否為空;
13、若所述候選指令隊(duì)列不為空,則基于預(yù)設(shè)規(guī)則確定是否將當(dāng)前訪存指令存入所述候選指令隊(duì)列;
14、若所述候選指令隊(duì)列為空,則將當(dāng)前訪存指令存入所述候選指令隊(duì)列。
15、可選的,所述基于預(yù)設(shè)規(guī)則確定是否將當(dāng)前訪存指令存入所述候選指令隊(duì)列包括:
16、判斷所述當(dāng)前訪存指令的內(nèi)存空間與所述候選指令隊(duì)列中的訪存指令的內(nèi)存空間是否存在重疊,當(dāng)前訪存指令的操作碼與所述候選指令隊(duì)列中的訪存指令的操作碼是否一致,以及當(dāng)前訪存指令的基址寄存器與所述候選指令隊(duì)列中的訪存指令的基址寄存器是否一致;
17、若所述當(dāng)前訪存指令的內(nèi)存空間與所述候選指令隊(duì)列中的訪存指令的內(nèi)存空間不存在重疊、當(dāng)前訪存指令的操作碼與所述候選指令隊(duì)列中的訪存指令的操作碼一致以及當(dāng)前訪存指令的基址寄存器與所述候選指令隊(duì)列中的訪存指令的基址寄存器一致,則將所述當(dāng)前訪存指令存入所述候選指令隊(duì)列。
18、可選的,所述將所述候選指令隊(duì)列中的訪存指令進(jìn)行兩兩組隊(duì),得到訪存指令對(duì)包括:
19、將所述候選指令隊(duì)列中具有相同基址寄存器的訪存指令保存為一個(gè)指令隊(duì)列;
20、根據(jù)所述指令隊(duì)列中的每個(gè)訪存指令的操作碼,判斷所述指令隊(duì)列中的訪存指令是否存在能組成訪存指令對(duì)的訪存指令;
21、若存在能組成訪存指令對(duì)的訪存指令,將所述指令隊(duì)列中能夠組成訪存指令對(duì)的訪存指令進(jìn)行兩兩組隊(duì),得到訪存指令對(duì)。
22、可選的,所述將所述候選指令隊(duì)列中的訪存指令進(jìn)行兩兩組隊(duì),得到訪存指令對(duì)之后包括:
23、判斷所述訪存指令對(duì)是否會(huì)觸發(fā)非對(duì)齊指令異常;
24、若所述訪存指令對(duì)會(huì)觸發(fā)非對(duì)齊指令異常,則將對(duì)應(yīng)的所述訪存指令對(duì)從所述訪存指令隊(duì)列中刪除。
25、可選的,所述ldg類訪存指令組成ldg類訪存指令隊(duì)列,所述將所述訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令之后包括:
26、判斷所述ldg類訪存指令隊(duì)列中相鄰的ldg類訪存指令的地址是否連續(xù);
27、若所述訪存指令隊(duì)列中相鄰的ldg類訪存指令的地址連續(xù),則將地址連續(xù)的ldg類訪存指令作為合并隊(duì)列,并將所述合并隊(duì)列中多余的立即數(shù)指令刪除。
28、可選的,所述ldg類訪存指令立即數(shù)操作數(shù)的取值范圍取決于ldg類指令硬件設(shè)計(jì)規(guī)格。
29、一種面向連續(xù)訪存的程序編譯優(yōu)化系統(tǒng),包括:
30、編譯模塊,用于將已編碼程序進(jìn)行編譯,得到中間代碼;
31、遍歷模塊,用于遍歷所述中間代碼,將中間代碼中的訪存指令存入候選指令隊(duì)列;
32、組隊(duì)模塊,用于將所述候選指令隊(duì)列中的訪存指令進(jìn)行兩兩組隊(duì),得到訪存指令對(duì),多個(gè)訪存指令對(duì)組成訪存指令對(duì)隊(duì)列;
33、判斷模塊,用于判斷所述訪存指令對(duì)中的低地址偏移量是否大于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍;
34、第一執(zhí)行模塊,若所述訪存指令對(duì)中的低地址偏移量大于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍,則第一執(zhí)行模塊用于添加立即數(shù)指令在所述訪存指令對(duì)內(nèi);
35、轉(zhuǎn)化模塊,用于基于所述立即數(shù)指令,將所述訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令;
36、第二執(zhí)行模塊,若所述訪存指令對(duì)中的低地址偏移量小于或等于ldg類訪存指令立即數(shù)操作數(shù)的取值范圍,則第二執(zhí)行模塊用于基于低地址偏移量以及基址寄存器,將所述訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令;
37、合并模塊,用于將所有轉(zhuǎn)化的ldg類訪存指令插入已編碼程序中對(duì)應(yīng)的位置組成新的程序,作為優(yōu)化程序。
38、一種終端設(shè)備,包括存儲(chǔ)器、處理器,所述存儲(chǔ)器儲(chǔ)存有能夠在處理器上運(yùn)行的計(jì)算機(jī)程序,所述處理器加載并執(zhí)行所述計(jì)算機(jī)程序時(shí),采用了一種面向連續(xù)訪存的程序編譯優(yōu)化方法。
39、一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序被處理器加載并執(zhí)行時(shí),采用了一種面向連續(xù)訪存的程序編譯優(yōu)化方法。
40、本發(fā)明的有益效果是:將已編碼好的程序通過編譯器編譯,得到若干中間代碼,然后遍歷中間代碼,將其中的訪存指令篩選出來存入候選指令隊(duì)列,然后將候選指令隊(duì)列兩兩組隊(duì),得到訪存指令對(duì),判斷訪存指令對(duì)中低地址偏移量是否大于n的取值范圍。如果小于或等于,則直接將訪存指令對(duì)轉(zhuǎn)化為ldg類訪存指令,將轉(zhuǎn)化后的ldg類訪存指令組成新的程序作為優(yōu)化程序。如果大于,即超出ldg類訪存偏移硬件設(shè)計(jì)限制,則偏移步進(jìn)填充方法添加立即數(shù)指令,進(jìn)一步增加ldg類訪存指令生成數(shù)量,將兩個(gè)連續(xù)訪存指令替換成一條連續(xù)ldg類訪存指令,提高了程序的運(yùn)行性能以及減少了代碼體積。