現在打算使用FPGA給卷積神經網路(CNN)做加速,但是電路設計基礎比較薄弱,並沒有Verilog/VHDL的開發經驗。請問是否真的能以一個軟體工程師的角度直接使用HLS這種C-to-FPGA的工具來做硬體實現嗎,還是說必須要從硬體描述語言入手,對電路設計有了一定的理解之後才能用好HLS工具?


原理上說可以,但是以以前的經驗以及最近和xilinx的溝通(現在不具體寫代碼了),如果要實現效果好,又想調試不那麼麻煩,不要這樣做。


我之前學校的組就在搞 CNN

用 HLS 到 ASIC 工藝忘了

其他不知道你成功了之後發 paper 肯定能中個好會


之前本科畢設用HLS在zynq上做CNN加速。學過數電和Verilog,用HLS的時候就會一直想,某一段用C語言寫出來,到底生成怎樣的邏輯?HLS生成的Verilog代碼可讀性非常差,基本沒法看。有一種感覺就是HLS能實現功能,但是資源和時序是不像Verilog那樣可以完全按照我想的來,所以會很糾結,也有可能是因為我對文檔看的還不透徹。而且感覺HLS非常不方便調試。Verilog可以寫各種各樣的Test

前兩天問之前在海思的學長,大概意思是說工業界沒有見過在用HLS的,用HLS實現一下小演算法還可以試試,大點的工程有調HLS的時間,Verilog早就寫出來了,而且性能還更好。

我覺得HLS面向的還是沒有學過Verilog、數電的軟體開發者對一些邏輯不太複雜的演算法進行加速,基本上可以隨便寫,也不用糾結到底綜合成啥樣,功能跑通,加一些編譯優化,確實速度會提高不少。反正我真不想再碰HLS了...


首先,HLS從概念上來說是個好東西,但到目前為止,並沒有一個廣泛使用並且評價很高的產品。

其次,你要做的是硬體,不會HDL沒有什麼影響,但如果不知道自己的C代碼最終會生成什麼樣的東西,怎麼下手寫呢?可以先看看Xilinx的Tutorial,或者Bluebook,瞭解下應該怎麼寫可以綜合的C代碼。

@王天祺 大神曾經總結過怎麼用FPGA來實現CNN,你可以去讀一下,瞭解如何中規中矩的實現。至於發文章,就可能需要些tricky的東西了,比如架構上怎麼降低片上memory的使用量,怎麼減少計算量和功耗,或者從演算法上去做優化,比如prunning或者quantization,畢竟現在太多太多的人在做這些了


根據之前和xilinx聊天的信息,hls性能在上限上就是不如rtl開發的。非要說的話可以算節約了軟體人員一部分的學習成本,但是本身語法和代碼風格也提出了新的要求,必然要對邏輯實現有一定的基本認知。

此外還有兩點,一個是hls不適合所有的演算法開發,對一些複雜或者嵌套很深的演算法實現性能非常糟。以及它其實就是將一個函數編譯為一個邏輯model,軟硬體交互這塊並不能實現。

目前的HLS都不是特別成熟,工具軟體生成的電路沒有Verilog/VHDL高效,最終電路的性能、功耗、資源利用率等指標肯定比不過Verilog/VHDL。當前要設計出最優質的FPGA邏輯電路,建議還是用Verilog/VHDL。而且即使是HLS變成比現在更成熟了,要想把FPGA用好,還是需要知道FPGA硬體特點的,才能物盡其用;就像要優化GPU,除了要對CUDA熟悉,還得熟悉GPU的硬體架構。

PS:我最近在xilinx的VU9P上評估實現GoogLeNet V1,用verilog實現,大致性能是3000張/S,性能比高端的GPU要強一點,功耗也要低一些。


如果以純軟體角度寫出的HLS在硬體上肯定能跑,但是隻是性能非常差。如果想要優化到一個比較好的性能,就需要硬體的背景了,本人從verilog過渡到HLS就比較自然,把HLS當成一種更加高層次的HDL會比較合適。

如果一定想實現,Xilinx現在的PYNQ做的已經挺成熟的了,甚至一些比較普遍的NN應用已經有綜合好的bitfile(overlay)了,直接用python調用現有的overlay就可以了,還挺方便的。推薦直接去GitHub找Xilinx PYNQ相關的repo以及PYNQ官網相關文檔。


hls 就是個效率低下驗證演算法的東西,講真
推薦閱讀:
查看原文 >>
相關文章