當前位置:首頁 > > ZYNQ

HLS (high-level synthesis)稱為高級綜合, 它的主要功能是用 C/C++為FPGA開發(fā)算法。這將提升FPGA 算法開發(fā)的生產(chǎn)力。

  Xilinx最新的HLS是Vitis HLS。在Vivado 2020版本中替代原先的Vivado HLS, 功能略有差異。


HLS 的機理

   簡單地講,HLS采樣類似C語言來設(shè)計FPGA 邏輯。但是要實現(xiàn)這個目標,還是不容易的。畢竟軟件和硬件的功能實現(xiàn)存在非常大的差別。軟件主要針對順序程序執(zhí)行。即便是平行程序執(zhí)行,也是通過OS 的任務(wù)調(diào)度CPU 的資源。宏觀上是并發(fā)執(zhí)行,而微觀上仍然是順序占用CPU 執(zhí)行的。另一方面,基于FPGA 硬件邏輯,如果沒有上下文關(guān)聯(lián),完全可以并行運行。在沒有特別語法規(guī)則下,講C語言程序轉(zhuǎn)換成為硬件邏輯,并且盡量實現(xiàn)硬件的并行執(zhí)行是有難度的。人們?yōu)榇搜芯苛藢⒔?0年。

   在這個領(lǐng)域的主要貢獻者是康奈爾大學(xué)的張志如博士,他是康奈爾大學(xué)ECE學(xué)院助理教授,計算機系統(tǒng)實驗室成員。他目前的研究重點是異構(gòu)計算的高級設(shè)計自動化。他的作品獲得了 TODAES 的最佳論文獎和 ICCAD 的最佳論文提名。2006 年,他與人共同創(chuàng)立了 AutoESL Design Technologies, Inc.,將他關(guān)于高層次綜合的博士論文研究商業(yè)化。AutoESL 于 2011 年被 Xilinx 收購,收購后 AutoESL 工具更名為 Vivado HLS。

 了解了HLS 的實現(xiàn)機理,有助于編寫出高效率的HLS 邏輯。

   軟件編譯器講高級語言翻譯成為機器語言。主要關(guān)注的語言的語法轉(zhuǎn)換規(guī)則,相比之下,HLS 的翻譯難度更大一些,模塊中的語句形式上是前后順序排列。但是HLS盡力轉(zhuǎn)換成為并行執(zhí)執(zhí)行的硬件邏輯。并且通過數(shù)據(jù)流,管道等技術(shù)實現(xiàn)硬件優(yōu)化。筆者看來,HLS 的編譯技術(shù)是非常了不起的。

   HLS的目標是根據(jù)用戶提供的輸入和限制自動替用戶做出很多決定,HLS自動完成以下曾經(jīng)需要手動完成的工作。

  • HLS自動分析并利用一個算法中潛在的并發(fā)性

  • HLS自動在需要的路徑上插入寄存器,并自動選擇最理想的時鐘

  • HLS自動產(chǎn)生控制數(shù)據(jù)在一個路徑上出入方向的邏輯

  • HLS自動完成設(shè)計的部分與系統(tǒng)中其他部分的接口

  • HLS自動映射數(shù)據(jù)到儲存單位以平衡資源使用與帶寬

  • HLS自動將程序中計算的部分對應(yīng)到邏輯單位,在實現(xiàn)等效計算的前提下自動選取最有效的實施方式。


下面是一個簡單的例子


從圖可見,為了在時鐘脈沖下控制程序的執(zhí)行,在轉(zhuǎn)換后,添加了一個有限狀態(tài)機

下面是循環(huán)的機制:


由兩個狀態(tài)控制一個循環(huán)。

HLS 對循環(huán)語句實現(xiàn)多種優(yōu)化

  • unroll

  • pipeline


看出缺省方式和PIPELINE的差比,速度提高了一倍。

任務(wù)的并行執(zhí)行(Task Parallelism with HLS)

   HLS 中將每一個語句看作為一個任務(wù),它們可能是一個語句,或者是一個函數(shù)調(diào)用。例如一個函數(shù)中調(diào)用4個函數(shù),A,B,C,D 。在C語言中,A,B,C,D是依次執(zhí)行的。但是在HLS 的實現(xiàn)中,如果A,B,C,D四個模塊沒有數(shù)據(jù)的依賴關(guān)系的話,它們完全可以并行地執(zhí)行。

    我們假設(shè), A 在兩個不同的數(shù)組中為 B 和 C 生成數(shù)據(jù),而 D 使用數(shù)據(jù)來自 B 和 C 生成的兩個不同數(shù)組。讓我們假設(shè)這種“鉆石”通信模式將運行兩次(兩次調(diào)用),并且這兩次運行是獨立的。

void diamond (data_t vecIn[N],data_t vecOut[N]) { data_t c1[N],c2[N],c3[N],c4[N]; funcA(vecIn,c1,c2); funcB(c1,c3); funcC(c2,c4); funcD(c3,c4,vecOut); }

這是一種所謂“鉆石”形鏈接(“diamond” shape connectivity.)。

全順序執(zhí)行對應(yīng)于圖 1 中的圖,其中圓圈表示用于實現(xiàn)序列化的某種形式的同步。

  在菱形示例中,B 和 C 是完全獨立的:它們不通信,不訪問共享內(nèi)存資源,如果不需要共享計算資源,則可以期望它們并行執(zhí)行。這導(dǎo)致了圖 2 中的圖表,在一次運行中具有一種 fork-join 并行性形式:B 和 C 在 A 結(jié)束后并行執(zhí)行,D 等待 B 和 C,但下一次運行仍然是序列化的。

   讓我們走得更遠一點。到目前為止,之前的執(zhí)行模式在調(diào)用中利用了任務(wù)級并行性。重疊連續(xù)運行呢?如果它們是真正獨立的,但如果每個函數(shù)(即 A、B、C 或 D)重用與之前運行相同的計算硬件,我們可能仍希望執(zhí)行,例如,并行執(zhí)行 A 的第二次調(diào)用B 和 C 的第一次調(diào)用。這是一種跨調(diào)用的任務(wù)級流水線形式,導(dǎo)致如圖 3 所示的圖表。吞吐量現(xiàn)在得到了提高,因為它受到所有任務(wù)之間的最大延遲的限制,而不是它們的延遲之和。每次運行的延遲不變,但多次運行的總延遲減少了。


這些看起來好復(fù)雜的樣子,但是HLS 為我們實現(xiàn)了細節(jié)。我們只需了解這些機理就可以了。

C語言與硬件組件的區(qū)別

HLS 采用了C語言描述邏輯,它們的對應(yīng)關(guān)系如下:


但是,HLS 對C語言又做出了一些限制:

  • 不使用動態(tài)內(nèi)存分配(不使用malloc(),free(),new和delete())

  • 減少使用指針對指針的操作

  • 不使用系統(tǒng)調(diào)用(例如abort(),exit(),printf()),我們可以在其他代碼例如測試平臺上使用這些指令,但是綜合的時候這些指令會被無視(或直接刪掉)

  • 減少使用其他標準庫里的內(nèi)容(支持math.h里常用的內(nèi)容,但還是有一些不兼容)

  • 減少使用C++中的函數(shù)指針和虛擬函數(shù)

  • 不使用遞歸方程

  • 精準的表達我們的交互接口

結(jié)束語

HLS 采用C語言來描述FPGA 邏輯,這將全面提升FPGA 設(shè)計的生產(chǎn)力。但是HLS 的代碼生成與C語言基于語法的編譯要復(fù)雜的多。HLS 盡力實現(xiàn)并行操作和優(yōu)化。不然就只是一個玩具。

 盡管HLS 實現(xiàn)機制極為復(fù)雜,但是對于FPGA 算法設(shè)計者而言,了解內(nèi)部機理就可以了,并不需要了解更多細節(jié),這就是HLS的高級之處。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉