本發(fā)明涉及高層次綜合(High Level Synthesis,HLS)工具優(yōu)化技術(shù),具體涉及一種基于代碼轉(zhuǎn)換的高級綜合優(yōu)化方法。
背景技術(shù):
隨著IC設(shè)計(jì)規(guī)模及應(yīng)用復(fù)雜行不斷提升,EDA(Electronic Design Automation)的自動(dòng)化抽象層次越來越趨向于高層,高級綜合工具變得越來越重要。高層次綜合是一種將高層次語言有效地轉(zhuǎn)化為滿足設(shè)計(jì)約束的寄存器傳輸級(Register Transfer Level,RTL)描述的工具。HLS提高了硬件設(shè)計(jì)的抽象層次,具有以下突出優(yōu)點(diǎn),文獻(xiàn)[1]及[2]表明:(1)硬件工程師可以減少設(shè)計(jì)時(shí)間,縮短產(chǎn)品上市周期;(2)軟件工程師能完成硬件系統(tǒng)設(shè)計(jì);(3)溝通了軟件設(shè)計(jì)和硬件設(shè)計(jì)兩個(gè)領(lǐng)域,展現(xiàn)了一種軟硬件聯(lián)合設(shè)計(jì)的方法,HLS被認(rèn)為是下一代半導(dǎo)體工業(yè)中的核心角色,在企業(yè)界和學(xué)術(shù)界受到越來越多的關(guān)注。
現(xiàn)在的HLS工具在編譯過程中可以采用不同的優(yōu)化策略,如:操作鏈接,循環(huán)流水線化和循環(huán)展開等。這些現(xiàn)有工具通常只針對特定的代碼結(jié)構(gòu)執(zhí)行優(yōu)化策略,并且對輸入代碼有一定要求。一個(gè)適合HLS優(yōu)化的代碼結(jié)構(gòu)能夠產(chǎn)生性能優(yōu)良的電路,并且只需要更少的電路資源,相反,不適合HLS優(yōu)化的代碼結(jié)構(gòu)不僅綜合后的電路性能差,而且還會(huì)使用大量的電路資源。
軟件工程師在利用高層次語言C,C++進(jìn)行開發(fā)與硬件工程師利用RTL設(shè)計(jì)語言設(shè)計(jì)電路的背景知識(shí)存在一定的差距。通常情況下,軟件工程師在算法開發(fā)時(shí)并不會(huì)考慮數(shù)據(jù)依賴性,操作并行性和流水線處理等問題。所以軟件工程師利用高層次語言設(shè)計(jì)的代碼在經(jīng)過HLS工具綜合時(shí),往往無法保證綜合得到性能優(yōu)異的電路,需要對原始高級算法進(jìn)行代碼修改和優(yōu)化。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的不足,提出了對設(shè)計(jì)者的代碼進(jìn)行修改轉(zhuǎn)化為HLS工具能夠識(shí)別的特定結(jié)構(gòu),提高HLS工具的效率;通過去除數(shù)據(jù)間的依賴性提高并行性優(yōu)化技術(shù),提高電路性能,縮短方案開發(fā)時(shí)間,并綜合考慮資源使用與性能的平衡。
本發(fā)明的技術(shù)方案:一種基于代碼轉(zhuǎn)換的高級綜合優(yōu)化方法,具體包括以下步驟:
(1)、檢查數(shù)據(jù)依賴關(guān)系;
(2)、重新定義數(shù)據(jù);
(3)、利用數(shù)據(jù)交換的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)函數(shù)并行。
所述步驟(1)數(shù)據(jù)依賴性指的是不同的函數(shù)共同操作一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)多為數(shù)組類型。
所述步驟(2)重新定義后的數(shù)據(jù)類型完全一樣,分別用來存儲(chǔ)不同數(shù)據(jù)。
所述步驟(3)利用數(shù)據(jù)交換的結(jié)構(gòu)來對代碼結(jié)構(gòu)進(jìn)行修改,實(shí)現(xiàn)多個(gè)函數(shù)并行。
本發(fā)明相對于現(xiàn)有技術(shù)有以下有益效果:
1、本發(fā)明提出了利用代碼轉(zhuǎn)換的方法來提高HLS工具對輸入設(shè)計(jì)的優(yōu)化效率,提高并行性。
2、本發(fā)明通用性強(qiáng),適用于不同的C/C++設(shè)計(jì)方案。
3、本發(fā)明提高電路性能,縮短方案開發(fā)時(shí)間,并綜合平衡資源使用與性能。
附圖說明
圖1本發(fā)明方法流程圖。
圖2本發(fā)明實(shí)施例中的函數(shù)之間的數(shù)據(jù)依賴性。
圖3本發(fā)明實(shí)施例中的數(shù)據(jù)交換的結(jié)構(gòu)偽代碼。
具體實(shí)施方式
下面通過具體實(shí)施例和附圖對本發(fā)明作進(jìn)一步的說明。本發(fā)明的實(shí)施例是為了更好地使本領(lǐng)域的技術(shù)人員更好地理解本發(fā)明,并不對本發(fā)明作任何的限制。
如圖1所示,一種基于代碼轉(zhuǎn)換的高級綜合優(yōu)化方法,具體包括以下步驟:
(1)、檢查數(shù)據(jù)依賴關(guān)系:數(shù)據(jù)依賴性指的是不同的函數(shù)共同操作一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)多為數(shù)組類型。
(2)、重新定義數(shù)據(jù):重新定義后的數(shù)據(jù)類型完全一樣,分別用來存儲(chǔ)不同數(shù)據(jù)。
(3)、利用數(shù)據(jù)交換的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)函數(shù)并行。
實(shí)施1:
本發(fā)明選擇了一個(gè)在高級綜合工具綜合過程中經(jīng)常出現(xiàn)但是無法優(yōu)化的代碼結(jié)構(gòu)進(jìn)行了代碼轉(zhuǎn)換,轉(zhuǎn)換為高級綜合工具能夠識(shí)別的結(jié)構(gòu)。下面詳細(xì)闡述本發(fā)明中的優(yōu)化方法,具體包括以下步驟:
(1)、檢查數(shù)據(jù)依賴關(guān)系:
數(shù)據(jù)之間的依賴性指的是不同的函數(shù)共同操作一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)多為數(shù)組類型。如圖2所示,當(dāng)兩個(gè)函數(shù)之間共同訪問一個(gè)數(shù)據(jù),彼此之間對數(shù)據(jù)的操作分別是讀寫關(guān)系時(shí),即:當(dāng)讀函數(shù)讀取完數(shù)據(jù)之后,寫函數(shù)會(huì)更新數(shù)據(jù)內(nèi)容,然后讀函數(shù)再次讀取數(shù)據(jù)內(nèi)容,以此反復(fù)。
在這種情況下,高級綜合之后,這兩個(gè)函數(shù)模塊是順序執(zhí)行的,即:Readfun函數(shù)讀完數(shù)據(jù)A之后,Writefun函數(shù)才能寫入A數(shù)據(jù)。如果這個(gè)數(shù)據(jù)很大,讀取處理時(shí)間和寫入更新時(shí)間就會(huì)變得很長,整個(gè)設(shè)計(jì)的時(shí)間就會(huì)變長,影響了整個(gè)設(shè)計(jì)速度性能。
(2)、重新定義數(shù)據(jù);
當(dāng)找到圖2的函數(shù)與數(shù)據(jù)關(guān)系后,需要重新定義數(shù)據(jù)A。由于兩個(gè)函數(shù)都對一個(gè)數(shù)據(jù)A進(jìn)行操作,這在任何高級綜合工具中都是不可優(yōu)化的,本發(fā)明中提出的方法就是定義兩組數(shù)據(jù)A1和A2,這兩組數(shù)據(jù)類型完全一樣,用來存儲(chǔ)不同的數(shù)據(jù),Readfun函數(shù)和Writefun函數(shù)分別訪問不同的數(shù)據(jù)。這樣,才有可以將兩個(gè)函數(shù)的數(shù)據(jù)依賴性去除掉。去除掉兩個(gè)函數(shù)的數(shù)據(jù)依賴性之后,還需要一個(gè)特定的代碼結(jié)構(gòu)才能實(shí)現(xiàn)綜合后函數(shù)的并行。
(3)、利用數(shù)據(jù)交換的結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)函數(shù)并行:
在定義了兩組數(shù)據(jù)之后,還需要將圖2中的代碼結(jié)構(gòu)改寫才能實(shí)現(xiàn)綜合后函數(shù)的并行。本發(fā)明利用數(shù)據(jù)交換的結(jié)構(gòu)來對圖2中的代碼結(jié)構(gòu)進(jìn)行修改,該結(jié)構(gòu)的主要實(shí)現(xiàn)方法是:當(dāng)Readfun函數(shù)讀取A1時(shí),Writefun將寫入A2,之后,交換操作數(shù)據(jù),Readfun函數(shù)讀取已經(jīng)寫好的A2,而Writefun將寫入讀取完成的A1。那么Readfun和Writefun將分別操作不同的數(shù)據(jù)。該結(jié)構(gòu)的偽代碼如圖3所示。
經(jīng)過上面的三個(gè)步驟之后,得到圖3中的代碼結(jié)構(gòu),這個(gè)代碼結(jié)構(gòu)已經(jīng)完全去除數(shù)據(jù)依賴性,而且高級綜合工具會(huì)將兩個(gè)函數(shù)實(shí)現(xiàn)為兩個(gè)模塊,由于操作不同的數(shù)據(jù),這兩個(gè)模塊是可以同時(shí)啟動(dòng)運(yùn)行的。
實(shí)施例2:
本發(fā)明提供了一種基于代碼轉(zhuǎn)換的高級綜合優(yōu)化方法,提高了HLS工具對代碼的優(yōu)化效率,以一個(gè)人工下棋AI為例,當(dāng)數(shù)據(jù)A為一個(gè)棋盤,存儲(chǔ)這棋盤的當(dāng)前數(shù)據(jù),Readfun為評估函數(shù),評估當(dāng)前的局勢,Writefun函數(shù)為寫函數(shù),將一種可能的走法寫入棋盤。在這種情況下,Readfun函數(shù)和Writefun函數(shù)是圖1的數(shù)據(jù)依賴形式,當(dāng)經(jīng)過高級綜合之后是不可以實(shí)現(xiàn)并行的。
根據(jù)本發(fā)明中提出的方法,定義兩個(gè)完全一樣的數(shù)據(jù)類型的A1和A2,A1和A2都是當(dāng)前的棋盤局勢,當(dāng)Readfun讀取A1時(shí),此時(shí)一種可能的走法由Writefun將寫入A2,此時(shí),A2內(nèi)存儲(chǔ)的是沒有經(jīng)過評估的第一種走法,之后,交換操作數(shù)據(jù),Readfun讀取存儲(chǔ)第一種走法的A2,然后,Writefun函數(shù)將第二種走法寫入A1。這樣Readfun和Writefun將分別操作不同的數(shù)據(jù),在經(jīng)過HLS工具綜合之后,Readfun和Writefun將被綜合成兩個(gè)模塊,這兩個(gè)模塊由于訪問不同的數(shù)據(jù),模塊之間沒有數(shù)據(jù)依賴性,所以就可以被HLS工具自動(dòng)優(yōu)化為并行執(zhí)行,提高了設(shè)計(jì)的并行度,減小了數(shù)據(jù)讀寫的操作周期數(shù),提高了電路性能。另外,本發(fā)明提供優(yōu)化方法對于不同的C/C++設(shè)計(jì)方案都可以提供良好的優(yōu)化結(jié)果。
應(yīng)當(dāng)理解的是,這里所討論的實(shí)施方案及實(shí)例只是為了說明,對本領(lǐng)域技術(shù)人員來說,可以加以改進(jìn)或變換,而所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。
相關(guān)文獻(xiàn):
[1]Coussy P,Gajski D D,Meredith M,et al.An introduction to high-level synthesis[J].IEEE Design&Test of Computers,2009,26(4):8-17.
[2]黨宏社,王黎,王曉倩.基于Vivado HLS的FPGA開發(fā)與應(yīng)用研究[J].陜西科技大學(xué)學(xué)報(bào),2015,33(1):155-159.