一、異構計算ABC
簡單的介紹幾個概念,同道中人可以忽略這一段。云計算取代傳統IT基礎設施已經基本成為業界共識和不可阻擋的趨勢。云計算離不開數據中心,數據中心離不開服務器,而服務器則離不開CPU。當然,世事無絕對,上述三個“離不開”自然是針對當下以及并不久遠的未來而言。而異構計算的“異構”指的是“不同于”CPU的指令集。
異構計算聽起來是一個高大上兼不明覺厲的概念,實際上,我們大致可以用“加速協處理器”的概念來替代異構計算,這樣理解起來也許就容易多了。云計算在最開始指的就是基于CPU的計算,異構計算異軍突起之后,云計算就分成了基于CPU的通用計算和基于CPU+FPGA、CPU+GPU的異構計算。
可能有的讀者說:CPU+ASIC難道不是異構計算么?當然算,只不過,拋開ASIC的優點(高性能、大批量前提下的低成本)不說,ASIC的高開發成本(進入10nm工藝時代,流一次片可能動輒幾百萬乃至數千萬美元)和長上市時間(從立項到上市最少也要一到兩年的時間)是兩個非常不利的因素。因為目前異構計算所針對的垂直行業都具有快速變化、快速迭代的特點,是ASIC完全沒有辦法滿足的。所以到目前為止,基于ASIC的異構計算占比極少,基本可以忽略不計。
本文聚焦于討論基于FPGA的異構計算,為了行文方便起見,下文中提到異構計算就是指FPGA異構計算。
下面的圖、表對CPU、GPU、FPGA和ASIC各自的優劣勢進行了簡單的比較:
表1:CPU、ASIC、GPU、FPGA特性簡單對比
圖1:CPU、ASIC、GPU、FPGA能效與靈活性對比
圖2:計算密集型任務,CPU、GPU、FPGA、ASIC的數量級比較(16位整數乘法)
二、為什么要異構計算
異構計算為什么會異軍突起?其實假如CPU一直很牛很牛,可以完全滿足客戶對于“計算”的海量需求,那就沒有FPGA什么事兒了。當然了,CPU一直在摩爾定律的驅動下變的越來越牛,可是一來客戶的需求變的比CPU的能力更牛,二來隨著芯片工藝的推進,摩爾定律漸有失效的跡象,CPU越來越需要一位具備“專業”加速能力的伙伴了。
縱觀CPU的演進歷史,我們可以看到為了跟上摩爾定律的步伐,業界可謂是出了渾身解數。第一板斧就是通過不斷的提升工作的主時鐘頻率來提高效率:時鐘頻率越高,意味著單位時間內可以執行的指令越多,從而提升了效率。但是時鐘頻率不可能無限提高,因為CPU本質上也是一種ASIC,也是由一個個的晶體管、一個個的邏輯門組成的,而晶體管、邏輯門都需要特定的充放電時間來完成“0”、“1”狀態的轉換。這個特定的充放電時間就決定了CPU工作時鐘的時鐘周期,也就決定了時鐘頻率。
提升時鐘頻率遇到了天花板,業界又想出了第二板斧:“多任務、多線程”,讓CPU可以“同時”做兩件乃至更多件事情,如同周伯通的“一心二用”,從而可以“左右互搏”,這當然是神話。CPU終究是一個“分時復用”的東東,再牛叉的CPU,同一時刻也只能跑一條指令。多任務多線程的實質不過是充分利用CPU執行某個任務時的“空閑”時間來干點別的活兒,假如某個任務長期100%霸占CPU,那么再多的任務和線程也沒什么用,只能乖乖等著。
緊接著第三板斧又來了:多核。就是在一個package里面封裝多個物理核,理論上多核CPU就相當于之前同等數量的單核CPU。但是這些核之間是需要通信協同的,這就導致了性能的降低,比如一顆雙核CPU的效能大致等同于1.8顆單核CPU。而且由于散熱、封裝等因素的限制,也不可能在一個package里塞下幾百上千個核,盡管Intel已經推出了96核的CPU。多核還面臨DarkSilicon的問題,依靠增加核數來提升CPU性能之路已經走到盡頭。關于什么是DarkSilicon,簡單的說就是由于功耗的限制,多核CPU中可以同時以最高性能工作的核數是非常有限的,其他的核都處于閑置狀態。如果想進一步了解可以參考如下網頁:https://zhuanlan.zhihu.com/p/20833753。
除了上述三板斧,業界暫時沒有再找到可以大幅提升CPU計算力的辦法,而在某些特定領域,對CPU算力的需求簡直是貪得無厭、無窮無盡的,比如深度學習、圖像和視頻轉碼等,這時候FPGA的“空間”計算力就可以大顯身手了。
其實異構計算的興起要感謝AI和GPU。AI離不開各種xNN,也就是神經網絡,CPU算起來真是力不從心,而GPU則似乎天生適合干這個活兒(訓練)。因此,隨著過去兩三年AI的炙手可熱,GPU異構計算也風生水起,nVidia的股價居然在一年時間內暴漲三倍(當然不全是異構計算導致的顯卡需求暴增,還有數字貨幣帶動的挖礦產業)。
所以,歸納起來,異構計算之所以會興起,就是因為在某些特定行業或者特定應用場景,采用CPU作為算力解決方案的性價比是不高的。而根據這些不同的行業或者場景來選用CPU+GPU或者CPU+FPGA做解決方案的性價比則是很高的。CPU、GPU和FPGA各自“天生”的特性決定了它們都有各自最擅長(或者說性價比最高)的應用領域,在這些領域里,CPU+GPU或者CPU+FPGA的組合而不是純CPU組合,是最優的解決方案。從純技術的角度來爭論CPU、GPU和FPGA孰優孰劣不是一件很有意義的事情,一定要從解決方案和商業的角度來做對比才更有說服力。
三、FPGA異構計算的錢景
馬老師說了,每天做著可以改變世界的事情,就會打滿雞血,充滿激情。我斗膽替馬老師接一句:做好了這些改變世界的事情,wholebunchofmoney就是自然而然的結果。我一直的觀點是:技術是為商業服務的,技術只是手段,商業成功才是目的。因此見客戶一定要先談錢:使用阿里云的FPGA加速解決方案,既能幫您掙錢,又能幫您省錢,這樣客戶才會開開心心的掏錢。然后再談情懷,談詩和遠方,光跟客戶談詩和遠方,會被客戶轟出來的。
基于上面的分析,我們來看看FPGA異構計算的錢景如何。先看下圖(預測數據來自前瞻產業研究院):
圖3:2017-2022年中國數據中心市場規模預測(單位:億元)
可以看到2020年中國數據中心市場規模可達近2500億元人民幣,約400億美元。按照阿里云占據一半市場份額來計算,則為200億美元。根據Intel發布的白皮書預測,到2020年,通用計算市場與異構計算市場會是一個7:3的比例,至于這三成的異構計算市場里面GPU和FPGA的占比如何,要看各自所適合的垂直行業的發展情況。我們姑且認為GPU和FPGA各占15%,那么FPGA異構計算市場規模為30億美元,對比整個阿里云2017年全年營收133億人民幣(預計2020年超800億,屆時異構計算可能占比三成,達到240億人民幣),可見FPGA異構計算的市場錢景是相當可觀的。
我個人堅定的看好FPGA異構計算的未來(學習博士當年堅持搞阿里云的精神和不達目的不罷休的勁頭:nottobelievebecauseIseebuttoseebecauseIbelieve)。隨著云計算逐步變成和水電煤氣一樣的基礎設施,整個市場容量要以萬億乃至數十萬億美元來計算。FPGA異構計算即使只占10%,那也是千億美元的大市場。
在未來的云計算、數據中心市場,純CPU、CPU+GPU和CPU+FPGA的解決方案將長期并存下去,中、短期看,是一個CPU+GPU/CPU+FPGA方案不斷蠶食純CPU方案的過程。在這個過程中,CPU廠商、FPGA廠商也會為了鞏固自己的地盤兼搶奪別人的地盤,基于各自的優勢,選擇提供一攬子芯片解決方案。比如CPU廠商會推出內嵌FPGA/GPU的超級CPU;而可編程邏輯器件廠商則會在FPGA器件中嵌入CPU和GPU硬核。
對于提供FPGAasaService(FaaS)的云服務提供商來說,FPGA異構計算能否成功的關鍵則在于IP生態的建設。IP解決方案齊全的云服務提供商,未來可以像搭樂高積木一樣,迅速的為客戶“量身定做”出性價比最高的解決方案,并通過自己的FaaS平臺向客戶輸出,而缺乏IP生態的廠商則很難得到客戶的青睞。
四、HLS與RTL—從菜刀到小李飛刀
在FPGA設計領域,HLS是HighLevelSynthesis(高層次綜合)的縮寫,RTL是RegisterTransferLevel(寄存器傳輸級)的縮寫。順便吐槽一下,從事ICT行業,就要不斷的面對各種各樣的縮寫,很煩人,但是呢,表達效率確實很高。漢語也有類似縮寫:比如喜大普奔、不明覺厲、男默女淚、火鉗劉明,等等,等等。
1998年,作為新鮮出爐的大菜鳥一只,我加入了一家通信公司,職責是開發一塊單板。就是畫PCB、寫單板軟件、設計FPGA乃至到最后的焊板子等等全部自己搞定。那時候根本不知道硬件描述語言為何物,只能向當時的老鳥學習使用74系列集成電路來做FPGA設計。雖說不是一個邏輯門一個邏輯門的來搭電路,其實也差不多了。可想而知,這樣做的效率能高到哪里去。但是這樣做也有好處:你對整個電路了然于胸,可以清楚的知道到哪個時鐘節拍哪個門該反轉、哪個三八譯碼器該輸出什么碼、哪個移位寄存器的輸出應該是什么。況且,那時候的FPGA和CPLD的容量都小,所以這么做效率上也沒啥違和感。
等到了1999、2000年左右,XILINX開始推出Virtex系列時,這個辦法就不太靈了:FPGA的電路規模已經太大,再畫圖設計的話,周期可能要兩年乃至三年,完全抹殺了FPGA靈活可編程、上市時間短的優勢。被逼無奈之下,自己開始學習VerilogHDL,摸索如何使用第三方綜合工具來綜合(那時候XILINX的ISE和Altera的Quartus綜合和仿真功能都很弱)、使用第三方工具來做仿真。也要感謝當時同一個小團隊的另一只老鳥(老鳥姓魯,對我真是傾囊相授),給了我很多指點,非常無私的那種。我樸素的認為一花獨放不是春、大家好才是真的好,于是就開始寫各種教程、制定大規模FPGA的整套開發流程、寫課件給同事講課。事情越鬧騰越大,引起了上層的注意,就把我跟另一個部門做FPGA的幾個老鳥給抓到了一起,封閉了半年之久,整天啃各種各樣的“工程類”的書籍。最終我們輸出了“XX公司邏輯設計LCMM流程1.0”。LCMM就是LogicCMM,因為當時CMM很流行,各家軟件公司都標榜自己是CMM3/4/5,我們就無恥的蹭了一下CMM的流量。
Verilog和VDHL都是基于RTL層級的硬件描述語言(HDL)。相對而言,Verilog靈活性高一些,而VHDL語法更嚴謹一些。綜合工具很容易把HDL的描述映射成相應的硬件電路,所以綜合工具把精力放在如何更高效上:比如綜合時間盡可能短、綜合效率盡量高(占用面積低、時鐘運行頻率高)。HDL相比畫電路圖,在“電路”效率上可能要低一些,因為畢竟多了一層抽象;但是在開發效率上,那可是高了不止一個數量級。而且隨著綜合工具的進步,“電路效率”的差異逐漸被抹平了。
HDL已經如此之“完美”,為什么又會冒出HLS呢?一方面,人類追求真善美是無止境的(這是一句雞湯,不喜歡的就不用看了),真正重要的是:隨著FPGA規模的增大,驗證FPGA的功能仿真階段在整個開發過程中的占比越來越高。2000年之前,可能設計電路和驗證功能(功能仿真)時間占比可能是8比2,到后來逐漸的7比3,再到現在差不多4比6了。也就是說,超過一多半的時間花在了功能驗證上了。這一多半時間中的一半又花在哪里了呢?設計和編寫testbench了。testbench是個神馬東東呢?講白了就是一個數據發生器兼接收器兼鑒別器:把數據(不管是否合法)灌進FPGA、從FPGA接收反饋、然后根據預設的需求規格來判定FPGA反饋的對還是不對。
用HDL做設計,必須要考慮功能、可綜合、效率、時鐘樹、功耗、IO、布局布線等等N多因素。可是用HDL寫testbench完全沒必要考慮那么多。一個顯而易見的推論就是:使用更高層次的抽象語言顯然可以大幅度提高testbench的建模和設計效率,從而就從整體上大幅縮短了FPGA的開發周期。在經歷了SystemVerilog、SystemC、C、C++、OpenCL等諸多嘗試之后,使用更高抽象層次的設計語言來設計FPGA就變成了眾望所歸(用中文來說就是變成了剛需),就有了今天的HLS。
那么問題來了:HDL和HLS相比,到底哪個更好?Well,回答這個問題還是需要一定的水平的,不然結局要么友誼的小船說翻就翻,要么就跳進人家給你挖的坑里了。如同前面介紹通用計算和異構計算時比較CPU、GPU和FPGA,要看面對的具體應用場景。回答這個問題也要看針對FPGA設計的哪個方面說。從電路效率角度,HDL肯定秒殺HLS;而從仿真建模效率角度,HLS肯定秒殺HDL。HLS當下最大的短板就是“電路效率”太低。簡單說:同樣一個功能,用HLS不但會占用面積大,而且能跑的時鐘頻率低。這個短板完全是HLS的高度抽象所帶來的,也就是說,高度抽象既是HLS仿真建模的最大優勢,又是設計綜合的最大劣勢。舉個簡單的例子(例子不一定實際可以驗證,只是為了更簡潔的說明問題):用HLS寫了一段代碼(不管是C/C++還是OpenCL),你期望綜合出的電路就是一塊可以做異步FIFO的RAM。但是由于HLS的高度抽象,對于(智商令人捉急的)綜合工具來說,可以綜合成RAM,也可以綜合成組合邏輯,或許還有第三、第四種解讀…也就是說,綜合工具暫時沒能力綜合一個最高效的電路出來。
簡而言之,在當下以及不那么久遠的將來,使用HDL進行設計而使用HLS進行建模和驗證,將是最佳的設計模式:取得了電路效率和驗證效率的最佳平衡。隨著EDA工具的不斷進步(智商余額不斷提高),將來我們可以期待HLS既可以設計代碼,也可以建模驗證。菜刀也就終于進化成了無堅不摧的小李飛刀。
圖4:同樣的功能,使用HLS和使用RTL分別來描述的對比
審核編輯:劉清
評論