專用芯片ASIC的開發(fā)流程是:設(shè)計(jì)、驗(yàn)證、流片、封裝、測試;
而FPGA已經(jīng)是做好的芯片,所以不需要流片、封裝、測試。這樣,可以至少節(jié)省四個(gè)月的時(shí)間。
另外ASIC還有可能多次流片才能成功,同步的軟件開發(fā)也需要芯片做好才能完成大部分功能,這些也是時(shí)間成本。
在量小的時(shí)候,F(xiàn)PGA的成本低,量大了之后,ASIC的成本低。
FPGA的功耗比ASIC高,因?yàn)橛泻芏喽嘤嗟倪壿?,不過比CPU省電,畢竟CPU的多余邏輯更多。
相比ASIC,F(xiàn)PGA的調(diào)試比較方便,可以直接燒到FPGA執(zhí)行,也可以用調(diào)試工具抓取芯片里面的信號查看狀態(tài)。
FPGA需要跑多快?
跟Intel CPU相比,F(xiàn)PGA的主頻差一個(gè)數(shù)量級,一般FPGA芯片時(shí)鐘頻率300MHz左右,而Intel CPU可以到3GHz,就是說CPU 1秒能做30億次計(jì)算,而FPGA只能做3億次,差了10倍。
另外FPGA用作可重構(gòu)計(jì)算是來加速CPU的,如果和CPU跑一樣快就沒意思了,所以一般要比CPU快5倍才行。
FPGA的開發(fā)周期是比較久的,1年甚至2年很正常,在這個(gè)過程中,CPU上的軟件算法還在不斷升級,所以有可能FPGA算法設(shè)計(jì)的比CPU快,等開發(fā)完,卻發(fā)現(xiàn)CPU上的軟件算法快速迭代,已經(jīng)超過FPGA算法了。這種事還是比較常見的,不只是軟件算法升級,CPU自己也會升級,這些都有可能讓FPGA加速器做了無用功。比如用FPGA做一個(gè)數(shù)據(jù)壓縮卡,可是CPU可能就自己帶了一個(gè)數(shù)據(jù)壓縮功能,成本還比FPGA卡低,開發(fā)FPGA的人白干一場。阿呆以前就遇到過這種問題,在FPGA里面做了一個(gè)AI算法,架構(gòu)設(shè)計(jì)的牛逼了點(diǎn),大家又干的慢了點(diǎn),兩年完工,再去跟做AI的人一交流,發(fā)現(xiàn)這套算法已經(jīng)是舊的框架了。。。
所以,正常來說,F(xiàn)PGA算法加速性能設(shè)計(jì)的時(shí)候要比CPU快5-10倍才能保證最終做出來的產(chǎn)品是可以實(shí)現(xiàn)硬件加速的目標(biāo)。
影響FPGA計(jì)算性能的幾大因素
1. 數(shù)據(jù)并行性
對FPGA計(jì)算來說,同時(shí)處理大量的數(shù)據(jù),同時(shí)數(shù)據(jù)之間沒有相互依賴是最好的。這樣,可以有幾百上千個(gè)并行計(jì)算單元獨(dú)立處理幾百上千個(gè)數(shù)據(jù),如果數(shù)據(jù)之間有依賴,比如有很多的if else,就并發(fā)不起來,A必須要等B完成才能執(zhí)行。就跟步騎兵混合軍團(tuán)出征,如果將軍下令大家要同步進(jìn)軍,步兵要和騎兵一起沖,騎兵不能跑太快,要等步兵一起走,那這個(gè)仗就沒法打了,只能被敵人包餃子。
2. 數(shù)據(jù)大小和計(jì)算復(fù)雜度
FPGA并行計(jì)算是很多個(gè)計(jì)算并行執(zhí)行,如果每個(gè)計(jì)算單元要處理的數(shù)據(jù)太多,同時(shí)計(jì)算邏輯太復(fù)雜,那么占用的FPGA計(jì)算資源就變多了,這樣總的并行單元數(shù)量相應(yīng)減少,性能下降。而且,老司機(jī)都知道,計(jì)算邏輯太復(fù)雜,在電路上消耗的時(shí)間變多,還會導(dǎo)致每個(gè)模塊的延遲變長,這樣時(shí)鐘頻率也會下降,也會影響到性能。
3. 流水線
計(jì)算復(fù)雜的時(shí)候,延遲會變長,如果要求計(jì)算任務(wù)在一個(gè)時(shí)鐘周期里完成,那么時(shí)鐘周期就變長了,相應(yīng)的頻率降低,性能下降。所以為了提高時(shí)鐘頻率,F(xiàn)PGA會采用流水線技術(shù),把復(fù)雜的計(jì)算分解成幾段,放到幾個(gè)時(shí)鐘周期里完成。這樣做的后果就是,計(jì)算需要的時(shí)間變長了,但是總的性能卻提高了。為什么?阿呆來舉例說明。
蛋蛋本來1個(gè)小時(shí)造1個(gè)玩具,一天8小時(shí)造8個(gè)。后來造玩具改成蛋蛋、小蛋蛋、蛋媽三個(gè)人干,任務(wù)分解成三段,每人半小時(shí),1個(gè)半小時(shí)才能造出玩具,看起來造玩具的時(shí)間變長了。可是三個(gè)人一天工作總時(shí)間3*8=24小時(shí),一天生產(chǎn)24/1.5=16個(gè)玩具,產(chǎn)量翻番了。
這就叫三個(gè)臭皮匠,賽過一個(gè)諸葛亮。
4. 靜態(tài)控制邏輯
我們寫軟件程序的時(shí)候,習(xí)慣了給函數(shù)很多參數(shù)作為條件,根據(jù)參數(shù)內(nèi)容執(zhí)行函數(shù)的操作。FPGA做計(jì)算就不希望靠參數(shù)內(nèi)容確定怎么計(jì)算,而是希望一開始就定好。比如在軟件里面,算個(gè)位數(shù)的平方和二位數(shù)的平方差不多,可是到FPGA里面,個(gè)位數(shù)需要的計(jì)算資源少,二位數(shù)占用的多,一個(gè)計(jì)算單元要同時(shí)支持個(gè)位數(shù)和二位數(shù)平方計(jì)算就會很占資源,最好是一開始就確定好算哪一種,不要動態(tài)確定。
存儲和計(jì)算的關(guān)系
1. 數(shù)據(jù)密集型和計(jì)算密集型
我們的計(jì)算有數(shù)據(jù)密集型和計(jì)算密集型兩種,如果計(jì)算的次數(shù)多,就是計(jì)算密集型,反之,就是IO密集型。比如n×n矩陣乘法,每個(gè)數(shù)據(jù)讀和寫都認(rèn)為是一次IO,讀兩個(gè)矩陣的數(shù)據(jù),寫入結(jié)果矩陣的數(shù)據(jù),需要3n2次IO,而計(jì)算的次數(shù)是n3,所以是計(jì)算密集型。但是n×n矩陣加法,同樣需要3n2次IO,不過計(jì)算的的次數(shù)只有n2,屬于IO密集型。
2. 脈動陣列結(jié)構(gòu)
AI的計(jì)算往往涉及到矩陣乘法和向量乘法等,所以IO這邊的存儲往往成了性能瓶頸,我們經(jīng)常會看到,為了解決“存儲墻”問題,AI芯片里面(例如Google TPU)會采用脈動陣列結(jié)構(gòu),盡量做到IO進(jìn)來的數(shù)據(jù)重用,把IO密集型轉(zhuǎn)化為計(jì)算密集型。如下圖,左側(cè)和上方都有數(shù)據(jù)進(jìn)來,就跟心跳一樣,不斷有血液流進(jìn)來,但是內(nèi)部有計(jì)算陣列,不會浪費(fèi)中間產(chǎn)生的數(shù)據(jù),所有的計(jì)算單元都在并行工作,產(chǎn)生可怕的計(jì)算性能。
3. AI計(jì)算的“存儲墻”問題
AI計(jì)算需要讀大量的數(shù)據(jù),如果依賴于AI芯片外部的存儲器,比如DDR DRAM等,延遲和性能都會受到影響,DDR占用管腳多,能耗高,只能接一兩個(gè),最多4個(gè),沒辦法滿足很多并行計(jì)算單元的IO需求。所以,需要預(yù)先在芯片里面放置大量的SRAM和寄存器等作為片內(nèi)高速緩存,通過很多個(gè)小容量片內(nèi)RAM,實(shí)現(xiàn)大量的并發(fā)IO,提供給成百上千個(gè)并行計(jì)算引擎。
為了解決存儲墻問題,有兩種路徑:
(1) 基于HBM(High-bandwidth Memory)技術(shù)的3D堆疊,很多存儲芯片和AI芯片封裝在一起。AMD和NVIDIA的Vega和Volta GPU都集成了16GB的HBM2。而其他公司的一些最新的AI芯片架構(gòu),也都集成了3D堆疊存儲,比如Intel Nervana也用3D HBM,而Wave Computing用的是美光(Micron)的HMC,另外一種形式的3D堆疊存儲。Google的TPU 2.0也是每個(gè)核用了8GB的HBM。
(2) 計(jì)算存儲一體化。用RRAM等新型掉電不丟失數(shù)據(jù)的存儲介質(zhì)和AI計(jì)算引擎集成在一顆芯片內(nèi),數(shù)據(jù)一直存在AI芯片里面,不需要從外部加載,減少了數(shù)據(jù)搬移,效率和性能都很高。例如加州大學(xué)謝源教授團(tuán)隊(duì)把神經(jīng)網(wǎng)絡(luò)計(jì)算和RRAM放到一顆芯片里面,功耗可以降低20倍,速度提高50倍。IBM在《自然》也發(fā)了一篇文章,宣布在相變存儲器上實(shí)現(xiàn)了同樣的針對AI應(yīng)用的神經(jīng)網(wǎng)絡(luò)計(jì)算。
我們用FPGA做計(jì)算,有一個(gè)很重要的概念,叫做Domain Specific Computing,是UCLA的叢京生教授提出來的,就是針對某一個(gè)領(lǐng)域的計(jì)算任務(wù),在硬件算法上做特殊優(yōu)化,主要是性能提升和算法壓縮,實(shí)現(xiàn)高性能、低成本。
FPGA做計(jì)算第一板斧:化動為靜
前面說過,F(xiàn)PGA如果按照某個(gè)參數(shù)去執(zhí)行不同的計(jì)算任務(wù),就很浪費(fèi)資源,因?yàn)槊恳环N計(jì)算引擎都要用硬件計(jì)算資源實(shí)現(xiàn),等用戶來用。如果我們知道一段時(shí)間里面計(jì)算任務(wù)是固定的,就可以把FPGA配置成只有某一個(gè)計(jì)算任務(wù),節(jié)省資源,增強(qiáng)計(jì)算能力。
另一種情況叫做常數(shù)折疊,如果我們發(fā)現(xiàn)一段時(shí)間內(nèi)某個(gè)變量其實(shí)不會變化,就可以當(dāng)成常數(shù),不用占用計(jì)算邏輯。如下圖,本來是兩個(gè)4bit數(shù)a和b比較器,但是已知b是1011,就可以直接用a來輸出結(jié)果了,省了4個(gè)邏輯門。
FPGA做計(jì)算第二板斧:實(shí)時(shí)重配置
現(xiàn)在的FPGA支持里面的計(jì)算邏輯實(shí)時(shí)重配置,可以整個(gè)FPGA重新配置成新邏輯,比如上一毫秒是aPU,下一毫秒配成bPU。更實(shí)用的是部分邏輯實(shí)時(shí)重配置,因?yàn)镕PGA里面很多邏輯是控制用的,不需要經(jīng)常改,但是計(jì)算的那部分要根據(jù)使用情況經(jīng)常換,所以支持某個(gè)分區(qū)的實(shí)時(shí)重配置。
FPGA做計(jì)算第三板斧:位寬壓縮
我們寫軟件程序,習(xí)慣了兩個(gè)32位或64位變量加減乘除,因?yàn)榇蠹夜蚕硪粋€(gè)CPU計(jì)算單元,不浪費(fèi)資源。可是到FPGA里面,是一種并行計(jì)算,每一個(gè)程序都是占用計(jì)算資源的,所以能省則省。比如,兩個(gè)32位數(shù)相乘,如果我們已經(jīng)知道某個(gè)數(shù)只會有兩個(gè)bit是有效數(shù)據(jù),就只需要用2個(gè)bit表示它,然后最后的結(jié)果做個(gè)移位就可以了。
歸根結(jié)底,我們只要明白FPGA計(jì)算快的兩大優(yōu)點(diǎn)就是并行和流水線,但是必須時(shí)刻有并行計(jì)算的思想,盡量壓縮算法占用的資源,這樣才能用有限的FPGA計(jì)算資源實(shí)現(xiàn)最強(qiáng)大的并行計(jì)算能力。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21777瀏覽量
604766 -
cpu
+關(guān)注
關(guān)注
68文章
10891瀏覽量
212446 -
加速器
+關(guān)注
關(guān)注
2文章
804瀏覽量
37980
原文標(biāo)題:阿呆讀可重構(gòu)計(jì)算3:FPGA做AI三板斧
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論