一種提高OpenCL硬件執(zhí)行效率的方法
【技術(shù)領(lǐng)域】
[000?]本發(fā)明涉及一種提高OpenCL硬件執(zhí)行效率的方法,特指是基于FPGA平臺(tái)上,實(shí)現(xiàn)OpenCL軟件代碼與高效率的FPGA硬件平臺(tái)協(xié)同工作的方法。
【背景技術(shù)】
[0002]0penCL(0pen Computing Language)是第一個(gè)在異構(gòu)系統(tǒng)之間建立統(tǒng)一編程環(huán)境的開(kāi)放式且無(wú)版權(quán)稅的編程框架。OpenCL允許用戶使用基于C的編程語(yǔ)言進(jìn)行跨平臺(tái)的程序開(kāi)發(fā),包括CPUs,GPUs,DSPs以及FPGAs等。它既是一種編程模型,也提供了一種設(shè)計(jì)方法學(xué)。OpenCL基于ANSIC標(biāo)準(zhǔn)(C99),為所面向的異構(gòu)平臺(tái)提供了基于任務(wù)分割和數(shù)據(jù)分割的并行計(jì)算機(jī)制。主機(jī)程序與各個(gè)異構(gòu)平臺(tái)之間通過(guò)應(yīng)用編程接口(API ,Applicat1nProgram Interface)進(jìn)行通信,保證任務(wù)調(diào)度能夠高效而均衡的完成。
[0003]以Altera SDK for OpenCL(AOCL)工具為例,它是一套由Altera公司開(kāi)發(fā)的、面向FPGA硬件平臺(tái)的OpenCL程序開(kāi)發(fā)環(huán)境。AOCL工具提供了 OpenCL編譯器,利用高級(jí)綜合技術(shù)將OpenCL代碼轉(zhuǎn)換為ver i log硬件描述語(yǔ)言,免去了繁重的FPGA硬件設(shè)計(jì)過(guò)程,實(shí)現(xiàn)了由高層描述語(yǔ)言O(shè)penCL到FPGA平臺(tái)的直接映射。
[0004]用戶在AOCL環(huán)境中開(kāi)發(fā)程序時(shí),首先將OpenCL程序分為主機(jī)執(zhí)行部分和硬件平臺(tái)執(zhí)行部分(即kernel),其中主機(jī)執(zhí)行部分由標(biāo)準(zhǔn)的C編程器來(lái)處理,并生成x86平臺(tái)上的可執(zhí)行程序;硬件平臺(tái)執(zhí)行部分由OpenCL編譯器來(lái)處理,使用高級(jí)綜合技術(shù)生成verilog代碼,然而調(diào)用Altera的綜合工具Quartus II來(lái)完成后續(xù)的綜合、布局、布線等步驟,生成可下載的FPGA配置文件,作為參考,附圖2中給出了上述過(guò)程的流程示意圖。
[0005]OpenCL代碼到FPGA平臺(tái)的直接映射,縮短了面向FPGA實(shí)現(xiàn)方案的開(kāi)發(fā)周期,降低了FPGA平臺(tái)的開(kāi)發(fā)難度,極大的便利了軟件工程師對(duì)FPGA的使用,即不需要對(duì)FPGA有深入的了解,也可以實(shí)現(xiàn)面向FPGA的設(shè)計(jì)和編程。但是在獲得便利性的同時(shí)也犧牲了 FPGA的性能。由于對(duì)FPGA編程的verilog代碼是由高級(jí)綜合工具自動(dòng)生成的,在生成的過(guò)程中使用了模板、統(tǒng)一化的接口和保證時(shí)序收斂的緩存邏輯等,所以必然會(huì)浪費(fèi)一定的FPGA資源。而且隨著功能復(fù)雜度的提高,高級(jí)綜合工具的優(yōu)化效果也會(huì)明顯下降,F(xiàn)PGA資源占用過(guò)多,又會(huì)進(jìn)一步降低其工作頻率,所以使用OpenCL實(shí)現(xiàn)的方案,其性能可能會(huì)大幅低于直接使用veri log語(yǔ)言實(shí)現(xiàn)的方案。
[0006]提高OpenCL在FPGA硬件平臺(tái)上執(zhí)行效率的方法有很多種,包括任務(wù)調(diào)度層面,算法結(jié)構(gòu)層面,編譯參數(shù)層面以及硬件邏輯層面等,所述如下:
在任務(wù)調(diào)度方面,開(kāi)發(fā)者可以根據(jù)FPGA所提供的資源類型選擇合適的加速任務(wù),例如邏輯與或運(yùn)算、移位、比較等任務(wù)都是FPGA所擅長(zhǎng)的;根據(jù)FPGA所包含的DSP數(shù)目來(lái)處理適量的定浮點(diǎn)乘加運(yùn)算。
[0007]在算法結(jié)構(gòu)方面,開(kāi)發(fā)者可以充分利用FPGA的特殊資源,比如內(nèi)部存儲(chǔ)單元、DSP、硬浮點(diǎn)單元、移位寄存器等,簡(jiǎn)單高效的處理特定運(yùn)算。
[0008]在編譯參數(shù)方面,開(kāi)發(fā)者可以根據(jù)算法的特點(diǎn)和FPGA的處理能力采用適當(dāng)粒度的并行任務(wù),例如參數(shù)#pragma unro11可以將循環(huán)調(diào)用的任務(wù)展開(kāi)以并行處理,num_(3011^)1^61—_1111;^8和1111111_8;[111(1_'\¥011<_;^61118分別指定了單一kerne I 模塊中計(jì)算單元的數(shù)目和并行工作項(xiàng)的數(shù)目,不同的參數(shù)選擇下,F(xiàn)PGA的并行性能也有所差異。
[0009]在硬件邏輯層面,開(kāi)發(fā)者可以選擇適應(yīng)于加速任務(wù)的器件及外部設(shè)備,例如,實(shí)現(xiàn)矩陣乘法運(yùn)算可以選擇邏輯資源少和DSP數(shù)目多的FPGA類型,類似的外部存儲(chǔ)設(shè)備可以選擇DDR或QDR等。
[0010]以上列出的提高OpenCL在FPGA硬件平臺(tái)上執(zhí)行效率的方法,都是相對(duì)粗粒度的優(yōu)化方式,因?yàn)橛脩魺o(wú)法越過(guò)高級(jí)綜合工具直接干預(yù)底層硬件的實(shí)現(xiàn)方式,所以這些方法都受限于高級(jí)綜合技術(shù)的缺點(diǎn),即自動(dòng)生成的verilog代碼包含一部分的冗余邏輯,使用較多的緩存資源,在工作頻率和資源占用率方面都劣于手工完成的veri log代碼,能夠采用的優(yōu)化手段相對(duì)局限。而且,目前還沒(méi)有OpenCL編譯器能夠支持在kernel模塊中直接調(diào)用RTL形式的模塊,無(wú)法針對(duì)kernel模塊進(jìn)行特定目標(biāo)的邏輯層面的優(yōu)化,沒(méi)有充分發(fā)揮FPGA的硬件效率優(yōu)勢(shì)。
【發(fā)明內(nèi)容】
[0011]本發(fā)明提供了一種提高OpenCL在硬件平臺(tái)上執(zhí)行效率的方法,以實(shí)現(xiàn)OpenCL軟件代碼高效率高質(zhì)量的映射在FPGA硬件平臺(tái)上。
[0012]由于OpenCL編譯器在運(yùn)行的過(guò)程中,會(huì)使用高級(jí)綜合技術(shù)將OpenCL代碼轉(zhuǎn)換為veri log代碼,不同的工具所生成的ver i log代碼具有千差萬(wàn)別的層次結(jié)構(gòu)和編碼風(fēng)格,但是在接口方面都具有一定的規(guī)律性和相似性。kernel模塊訪問(wèn)外部存儲(chǔ)設(shè)備須通過(guò)標(biāo)準(zhǔn)的總線接口;主機(jī)執(zhí)行代碼向kernel模塊傳遞參數(shù)變量時(shí),多采用存儲(chǔ)器讀寫的方式;主機(jī)執(zhí)行代碼與kernel模塊之間還需要負(fù)責(zé)流程控制的信號(hào)。對(duì)于多kernel的模塊,每一個(gè)kerne I都具有上述的若干個(gè)端口。
[0013]基于上述規(guī)律,可以以單個(gè)的kernel模塊作為優(yōu)化單元,在維持接口的信號(hào)、時(shí)序以及功能不變的條件下,通過(guò)對(duì)該kernel的內(nèi)部代碼進(jìn)行有針對(duì)性的修改和優(yōu)化,實(shí)現(xiàn)與自動(dòng)生成的其他代碼和其他kernel模塊進(jìn)行無(wú)縫對(duì)接,并提升該kernel的性能。
[0014]具體方案如下:
一種提高OpenCL硬件執(zhí)行效率的方法,包括以下步驟:
S1:使用編譯器對(duì)以O(shè)penCL語(yǔ)言實(shí)現(xiàn)的kernel模塊進(jìn)行編譯,調(diào)用高級(jí)綜合工具生成相應(yīng)的veri log代碼;
S2:分析生成的、以ver i 1g語(yǔ)言描述的kerne I模塊的接口,記錄所述接口的信號(hào)、時(shí)序和功能,并保證在后續(xù)步驟中上述信號(hào)、時(shí)序和功能保持不變;
S3:根據(jù)性能、占用資源的指標(biāo)要求,對(duì)kernel模塊的veri log代碼進(jìn)行針對(duì)性的優(yōu)化,將優(yōu)化后的verilog代碼備份存檔,以免被后續(xù)的OpenCL編譯過(guò)程覆蓋;
S4:修改OpenCL開(kāi)發(fā)環(huán)境中負(fù)責(zé)流程控制的腳本,在整個(gè)編譯過(guò)程的高級(jí)綜合步驟之后,插入文件替換命令,用優(yōu)化后的verilog代碼替換編譯器自動(dòng)生成的verilog代碼;
S5:重新使用編譯器對(duì)OpenCL語(yǔ)言實(shí)現(xiàn)的kernel模塊進(jìn)行編譯,步驟4中修改的流程控制腳本會(huì)自動(dòng)完成指定文件的替換,即將步驟3中優(yōu)化過(guò)的veri log代碼代替本步驟中自動(dòng)生成的verilog代碼,隨后OpenCL開(kāi)發(fā)環(huán)境自動(dòng)調(diào)用FPGA綜合工具,完成后續(xù)的綜合、布局、布線等步驟,生成最終所需的FPGA配置文件
詳述的,所述對(duì)kernel模塊的veri log代碼進(jìn)行針對(duì)性的優(yōu)化方式包括通過(guò)解析OpenCL編譯環(huán)境的運(yùn)行步驟和分析自動(dòng)生成的veri log代碼的結(jié)構(gòu)與接口,識(shí)別veri log代碼中可被優(yōu)化和改進(jìn)的部分,進(jìn)行有針對(duì)性的修改、手工優(yōu)化、部分替換或是全部替換。
[0015]進(jìn)一步詳述的,所述修改OpenCL開(kāi)發(fā)環(huán)境中負(fù)責(zé)流程控制的腳本的方式包括在腳本中插入監(jiān)控命令和文件替換命令,當(dāng)檢測(cè)到編譯過(guò)程中的高級(jí)綜合步驟完成后,采用優(yōu)化過(guò)的Veri log代碼替換編譯器自動(dòng)生成的Veri log代碼。
[0016]本發(fā)明的有益效果是:
與現(xiàn)有技術(shù)相比,本發(fā)明通過(guò)解析OpenCL編譯環(huán)境的運(yùn)行步驟,分析其自動(dòng)生成的veri log代碼結(jié)構(gòu),記錄了kernel模塊的接口信號(hào)及相關(guān)時(shí)序,針對(duì)高級(jí)綜合工具自動(dòng)生成的verilog代碼中可被優(yōu)化和改進(jìn)的部分,進(jìn)行手工的修改和優(yōu)化、部分替換甚至全部替換。本發(fā)明保留了完整的OpenCL環(huán)境與流程,同時(shí)又極大的提高了kernel模塊的工作效率,包括提高工作時(shí)鐘,實(shí)現(xiàn)更多的功能,充分利用FPGA的硬件資源,如可以使FPGA中的DSP模塊的利用率達(dá)到80%以上,而自動(dòng)生成的verilog代碼是不可能達(dá)到這么高的利用率的,所以本發(fā)明能夠極大的提高FPGA的資源利用率和執(zhí)行效率。
【附圖說(shuō)明】
[0017]圖1為本發(fā)明的方法流程圖;
圖2為AOCL環(huán)境中開(kāi)發(fā)程序流程圖。