為何使用FPGA取代CPU和GPU?
近日,英特爾收購了Altera 這一全球最大FPGA製造商之一,為此支付167億美元,這也成了迄今為止英特爾最大手筆的一次收購。此外還有其他新聞表示,微軟開始在自己的資料中心內使用FPGA ,亞馬遜也開始提供 FPGA驅動的雲服務。原本FPGA主要應用於電子工程領域,軟體工程方面鮮少有人使用。這是否意味著FPGA已經開始迎來新的發展勢頭,成為CPU和GPU之外的另一個重要選擇?
FPGA到底是什麼?
如果需要計算一些資料,最常用的方法是針對CPU或GPU這樣基於指令的架構編寫計算所需的軟體。或者採取一種更麻煩的辦法,專門針對特定的計算需求設計出一套專用電路,而非面向CPU和GPU這樣的通用電路編寫指令。
在設計出自己的電路後,還要設法實現所需設計,以便真正開始計算。此時可以考慮的一種方式,需要非常深厚的技術能力,你需要真正創建出能實現所需設計的電路(這種方式也叫做ASIC,即專用積體電路)。
但此時還有一種更簡單的方法,這也是本文的重點:使用現場可程式設計門陣列(Field Programmable Gate Array,FPGA)這種可重構的積體電路來實現自己的電路設計。我們可以將FPGA配置為自己需要的任何電路(只要FPGA能夠容納下)。這與很多程式員已經熟悉的,基於CPU、GPU指令的硬體程式設計方式有著很大差異。基於指令的硬體是通過軟體配置的,而FPGA是通過指定所需硬體電路配置的。
FPGA的優劣
為何要用FPGA來完成計算任務,而非選擇更通用的CPU或GPU?這種方式與CPU和GPU的差異主要體現在下列幾方面:
- 延遲 :完成計算工作需要多久? → FPGA在這方面更勝一籌。
- 連線性 :可以連線哪些輸入/輸出,頻寬如何? → FPGA可以直接連線至輸入,提供非常高的頻寬。
- 工程成本 :為了表達所需計算,需要付出多少精力? → FPGA的工程成本通常遠高於基於指令的架構,那麼選擇這種方式,肯定是因為其他方面的優勢值得這樣做。
- 能效 :計算過程能耗如何? → 這往往是FPGA最大的優勢,但FPGA是否真的能勝過CPU或GPU,這主要取決於具體應用。
下文將深入探討上述這幾個差異。
低延遲
如果需要為噴氣式戰鬥機的無人駕駛功能計算資料,或開發高頻演算法交易引擎,低延遲肯定是必須的,此時需要讓輸入資料和得出結果之間的等待時間儘可能短。這些領域中FPGA遠遠勝過CPU(或GPU,因為GPU也需要通過CPU進行通訊)。
FPGA很容易可以實現1毫秒左右,甚至低於1毫秒的延遲,而就算表現最好的CPU,其延遲通常也在50毫秒左右。更重要的是,FPGA的延遲往往是確定的。能實現如此低的延遲,主要原因之一在於FPGA通常專用性更強:無需依賴通用作業系統,也無需通過通用匯流排(例如USB或PCIe)通訊。
(也許)正在天上飛翔的FPGA
連線性
我們可以藉助FPGA將任何資料來源,例如網路介面或感測器直接連線到晶片。而CPU和GPU的做法與此大為不同,它們必須通過標準化匯流排(如USB或PCIe)與資料來源建立連線,並依賴作業系統嚮應用程式提供資料。與晶片直接連線可獲得更高頻寬(以及更低延遲)。
有些場合中,這樣的高頻寬是必不可少的,例如LOFAR 和SKA 這樣的射電天文學應用程式。此類應用場景需要在現場部署大量專用感測器,併產生海量資料。但為了提高整個系統的可管理性,必須大幅減少感測器生成的資料量,隨後傳遞給應用程式進行處理。因此荷蘭射電天文研究所ASTRON 設計了Uniboard² ,這是一種包含四塊FPGA晶片的基板,其每秒可處理的資料量甚至超過了位於阿姆斯特丹的網際網路交換中心!
這些看似小巧的射電天線會生成海量資料。(圖源:Svenlafe ,en.wikipedia )
工程成本
在深入討論能效問題前,先來看看FPGA一個最大的劣勢:相比基於指令的架構(如CPU和GPU),它們的程式設計/配置工作實在是太難了!一般來說,這些硬體電路是通過硬體描述語言(Hardware Description Languages,HDL)描述的,如VHDL和Verilog,而軟體則可通過各種程式語言,例如Java、C和Python程式設計而來。
從理論角度來看,硬體描述語言和程式語言都可用於表達任何計算(這兩者都是圖靈完備的),但工程方面的細節卻存在極大差異。
該領域目前有一個新趨勢:高階合成(High Level Synthesis,HLS),這是指使用諸如OpenCL或C++等常規程式語言為FPGA程式設計,藉此也可實現更高階的抽象。然而就算使用此類程式語言,FPGA程式設計的困難程度依然要比為基於指令的系統程式設計高出一個數量級。
FPGA程式設計最困難的部分在於漫長的編譯過程。例如在使用英特爾OpenCL編譯器的情況下,典型的FPGA程式編譯通常需要4-12小時,這是因為要進行繁瑣的“佈局和佈線(Place-and-route)”操作,將我們需要的自定義電路對映到FPGA資源,同時確保以儘可能短的路徑實現所需結果。這是一種非常複雜的優化問題,整個過程需要投入巨大的運算能力。雖然英特爾提供了一種模擬器,讓我們可以用較短時間測試最終結果的正確性,但確定並優化效能的過程依然要經歷冗長的編譯過程。
FPGA編譯過程為你的偷懶提供了一個好藉口(圖源:XKCD )。
能效
在對外交流中,英特爾始終將能效視作FPGA的一大顯著優勢。然而實際情況並不那麼明顯,浮點計算方面尤其如此。不過我們首先還是來看看FPGA在能效方面遠遠勝過CPU和GPU的應用場景。
FPGA的高能效主要體現在邏輯計算和固定精度計算領域(而非浮點計算領域)。在密碼學貨幣(如比特幣)挖礦方面,這一特點讓FPGA呈現出巨大優勢。時至今日,幾乎每個人都已經習慣於通過FPGA挖礦了。
順帶一提,目前幾乎所有人在挖礦時都會使用ASIC(專用積體電路),這就是一種針對某種具體應用專門設計的特殊積體電路。ASIC是一種能效更高的解決方案,但前期需要付出更多投資來設計晶片,同時晶片的產量必須足夠大才能分攤高昂成本。接著還是繼續說回FPGA吧。
FPGA在能效方面的另一個優勢在於,FPGA基板無需主機即可直接通電執行,它有自己的輸入/輸出,因此還可以在主機方面節約能耗和資金。這一點與GPU計算完全不同,GPU需要藉助PCIe或NVLink與主機系統通訊,因此必須裝在主機中方能執行。(不過也有一個例外,NVidia Jetson 無需主機即可執行,但這並不是什麼高階GPU。)
浮點運算能效 —— FPGA vs GPU
諸如深度學習等很多高效能運算用例中,通常需要依賴浮點演算法,這是GPU最擅長的領域之一。以前,FPGA浮點運算效能非常低,因為必須通過邏輯塊組裝浮點單元,這一過程會耗費大量資源。
一些新型FPGA,例如Arria 10 和Stratix 10 在FPGA構造中直接內建了浮點單元,浮點運算能力有了顯著提升。額外增加的浮點運算單元是否可以改善FPGA的浮點計算能效?是否能比GPU能效更高?
那我們就用最先進的GPU和FPGA對比看看吧。目前市面上最先進的專業級GPU就是Tesla V100 了,理論上最大運算速度可達15 TFLOPS(萬億次浮點運算/秒,一種衡量浮點運算能力的標準單位),該GPU功耗約250瓦特。而目前市面上最先進的FPGA應該是Nallatech 520C ,其中搭載了Altera/英特爾聯合研發的Statix 10晶片 ,該基板的理論最大運算速度為9.2 TFLOPS,功耗約為225瓦特。
如果從能效角度對比這兩個裝置,GPU的能效無疑更高,理論上可實現56 GFLOP/W(十億次浮點運算/瓦特,這是一種衡量浮點運算能效的標準單位),而FPGA僅為40.9 GFLOP/W。因此如果你目前就需要購買新的浮點運算硬體裝置,並且需要配合主機使用,GPU貌似會是更好的選擇,至少從上述這種粗糙的對比中可以得出這樣的結論。
然而兩者的差距並不大,並且後續釋出的新款FPGA,例如這塊即將釋出的 基於Stratix 10的FPGA在浮點運算方面很可能會實現比Volta(譯註:Tesla V100的開發代號)更高能效。更重要的是,上述對比涉及的兩種產品本身也有本質差異,畢竟Tesla V100使用了12納米制程,而Stratix 10使用了更古老的14納米制程。
根據上述對比,如果需要能效更高的浮點運算裝置,那麼現階段依然有必要繼續堅持選擇GPU,但這個對比並不能證明GPU在浮點運算方面能效始終更出色。浮點運算能效這場戰役,目前的勝者是GPU,但不久的將來戰果可能會有所變化。
FPGA的能耗標籤:取決於具體應用(圖片版權:歐盟)。
如果主機並非必須,那麼就有必要對使用高階GPU的主機,和完全不使用主機的高階FPGA進行一下對比了。如果繼續沿用上述對比中使用的資料,對於裝備GPU的主機和不裝備主機的FPGA,只有主機功耗為116.7瓦特(如果是多GPU主機,則為每顆GPU對應的主機功耗)時,兩者的能效才能維持相同。通常,現代化主機的功耗介於50-250瓦特之間,這樣看來FPGA的優勢就比較大了。
綜述和展望
FPGA在某些領域是必不可少的。例如軍事領域的導彈導航系統中,使用FPGA主要是看中了低延遲的特性。射電天文學領域,FPGA的專用輸入/輸出是順利處理海量資料的關鍵。在密碼學貨幣挖礦應用中,高能效固定精度計算和邏輯計算也是FPGA的一大優勢。
藝術家對在建的SKA射電天文望遠鏡的構想圖(圖源:SKA Organisation/Swinburne Astronomy Productions)
然而英特爾斥資167億美元收購Altera可不僅僅是為了涉足這種利基市場,他們還有更遠大的目標。據猜測,他們的目標在於高效能運算和雲端計算這兩個市場(例如被用於亞馬遜那樣的資料中心)。
面向高效能運算的FPGA
依個人拙見,我覺得未來幾年內,FPGA都不會在高效能運算市場引起太大轟動。就算FPGA在能效方面比GPU出色些,FPGA的軟體開發依然要比GPU開發困難很多。HPC社群已經習慣於使用GPU,讓大家從GPU改為使用FPGA明顯需要更大的動力。著眼於更長遠的未來,例如未來5年以上,屆時FPGA也許可以提供足夠大的收益和動力,而這可能恰恰就是英特爾所希望的。
面向雲提供商的FPGA
雲提供商也是個巨大的市場。在英特爾的願景中,他們希望看到使用FPGA,或混合使用CPU和FPGA的雲伺服器。這種想法的目的在於將某些計算任務分攤給FPGA,並且/或者使用FPGA提供定製化的網路拓撲。
微軟毫無疑問會與英特爾密切合作,他們正在實現使用FPGA的資料中心 ,並且已經搭建了包含100000塊FPGA的網路。藉此,微軟的必應搜尋引擎已經在效能和靈活性方面獲得了巨大收益,現在一部分必應搜尋的計算工作已經交由FPGA處理。亞馬遜也在廣受歡迎的EC2平臺上提供了FPGA節點。這趨勢是否會成為潮流?我們拭目以待吧。
展望
原本較為“小眾”的FPGA能否成為主流?個人而言我很懷疑。我認為,FPGA如果要真正普遍起來,需要滿足兩個條件:
- 必須簡化程式設計 工作,尤其是縮短編譯時間。
- 執行浮點計算時,必須實現更高能效 。
英特爾正在努力解決這些問題,只不過擺在他們前方的障礙還有很多。
作者:Atze van der Ploeg ,閱讀英文原文:Why use an FPGA instead of a CPU or GPU?
感謝蔡芳芳對本文的審校。