FPGA series # 爲什麼使用 FPGA,相比 CPU、GPU、ASIC(專用芯片)有什麼特點?

原標題:如何評價微軟在數據中心使用 FPGA 代替傳統 CPU 的做法?
來源:知乎、AI科技評論 作者:李博傑

衆所周知,通用處理器(CPU)的摩爾定律已入暮年,而機器學習和 Web 服務的規模卻在指數級增長。 人們使用定製硬件來加速常見的計算任務,然而日新月異的行業又要求這些定製的硬件可被重新編程來執行新類型的計算任務。 FPGA (Field Programmable Gate Array) 正是一種硬件可重構的體系結構,常年來被用作專用芯片(ASIC)的小批量替代品,然而近年來在微軟、百度等公司的數據中心大規模部署,以 同時提供強大的計算能力和足夠的靈活性。
0

FPGA 爲什麼快?「都是同行襯托得好」。 CPU、GPU 都屬於馮·諾依曼結構,指令譯碼執行、共享內存。 FPGA 之所以比 CPU 甚至 GPU 能效高,本質上是無指令、無需共享內存的體系結構帶來的福利。
馮氏結構中,由於執行單元(如 CPU 核)可能執行任意指令,就需要有指令存儲器、譯碼器、各種指令的運算器、分支跳轉處理邏輯。由於指令流的控制邏輯複雜,不可能有太多條獨立的指令流,因此 GPU 使用 SIMD(單指令流多數據流)來讓多個執行單元以同樣的步調處理不同的數據,CPU 也支持 SIMD 指令。 而 FPGA 每個邏輯單元的功能在重編程(燒寫)時就已經確定,不需要指令。
馮氏結構中使用內存有兩種作用。一是保存狀態,二是在執行單元間通信。由於內存是共享的,就需要做訪問仲裁;爲了利用訪問局部性,每個執行單元有一個私有的緩存,這就要維持執行部件間緩存的一致性。 對於保存狀態的需求,FPGA 中的寄存器和片上內存(BRAM)是屬於各自的控制邏輯的, 無需不必要的仲裁和緩存。對於通信的需求, FPGA 每個邏輯單元與周圍邏輯單元的連接在重編程(燒寫)時就已經確定, 並不需要通過共享內存來通信。
說了這麼多三千英尺高度的話,FPGA 實際的表現如何呢?我們分別來看計算密集型任務和通信密集型任務。
計算密集型任務 的例子包括矩陣運算、圖像處理、機器學習、壓縮、非對稱加密、Bing 搜索的排序等。這類任務一般是 CPU 把任務卸載(offload)給 FPGA 去執行。對這類任務,目前我們正在用的 Altera(似乎應該叫 Intel 了,我還是習慣叫 Altera……)Stratix V FPGA 的整數乘法運算性能與 20 核的 CPU 基本相當,浮點乘法運算性能與 8 核的 CPU 基本相當,而比 GPU 低一個數量級。我們即將用上的下一代 FPGA,Stratix 10,將配備更多的乘法器和硬件浮點運算部件,從而理論上可達到與現在的頂級 GPU 計算卡旗鼓相當的計算能力。
1

2
在數據中心,FPGA 相比 GPU 的核心優勢在於延遲。 像 Bing 搜索排序這樣的任務,要儘可能快地返回搜索結果,就需要儘可能降低每一步的延遲。如果使用 GPU 來加速,要想充分利用 GPU 的計算能力,batch size 就不能太小,延遲將高達毫秒量級。使用 FPGA 來加速的話,只需要微秒級的 PCIe 延遲(我們現在的 FPGA 是作爲一塊 PCIe 加速卡)。未來 Intel 推出通過 QPI 連接的 Xeon + FPGA 之後,CPU 和 FPGA 之間的延遲更可以降到 100 納秒以下,跟訪問主存沒什麼區別了。
FPGA 爲什麼比 GPU 的延遲低這麼多?這本質上是體系結構的區別。 FPGA 同時擁有流水線並行和數據並行,而 GPU 幾乎只有數據並行(流水線深度受限)。 例如處理一個數據包有 10 個步驟,FPGA 可以搭建一個 10 級流水線,流水線的不同級在處理不同的數據包,每個數據包流經 10 級之後處理完成。每處理完成一個數據包,就能馬上輸出。而 GPU 的數據並行方法是做 10 個計算單元,每個計算單元也在處理不同的數據包,然而所有的計算單元必須按照統一的步調,做相同的事情(SIMD,Single Instruction Multiple Data)。這就要求 10 個數據包必須一起輸入、一起輸出,輸入輸出的延遲增加了。當任務是逐個而非成批到達的時候,流水線並行比數據並行可實現更低的延遲。因此對 流式計算的任務,FPGA 比 GPU 天生有延遲方面的優勢。
3
ASIC 專用芯片在吞吐量、延遲和功耗三方面都無可指摘,但微軟並沒有採用,出於兩個原因:

  • 數據中心的計算任務是靈活多變的,而 ASIC 研發成本高、週期長。好不容易大規模部署了一批某種神經網絡的加速卡,結果另一種神經網絡更火了,錢就白費了。FPGA 只需要幾百毫秒就可以更新邏輯功能。 FPGA 的靈活性可以保護投資,事實上,微軟現在的 FPGA 玩法與最初的設想大不相同。
  • 數據中心是租給不同的租戶使用的,如果有的機器上有神經網絡加速卡,有的機器上有 Bing 搜索加速卡,有的機器上有網絡虛擬化加速卡,任務的調度和服務器的運維會很麻煩。 使用 FPGA 可以保持數據中心的同構性。

接下來看通信密集型任務。相比計算密集型任務,通信密集型任務對每個輸入數據的處理不甚複雜,基本上簡單算算就輸出了,這時通信往往會成爲瓶頸。對稱加密、防火牆、網絡虛擬化都是通信密集型的例子。
4
通信密集型任務,CPU、GPU、FPGA、ASIC 的數量級比較(以 64 字節網絡數據包處理爲例,數字僅爲數量級的估計)

對通信密集型任務,FPGA 相比 CPU、GPU 的優勢就更大了。從吞吐量上講,FPGA 上的收發器可以直接接上 40 Gbps 甚至 100 Gbps 的網線,以線速處理任意大小的數據包;而 CPU 需要從網卡把數據包收上來才能處理,很多網卡是不能線速處理 64 字節的小數據包的。儘管可以通過插多塊網卡來達到高性能,但 CPU 和主板支持的 PCIe 插槽數量往往有限,而且網卡、交換機本身也價格不菲。
從延遲上講,網卡把數據包收到 CPU,CPU 再發給網卡,即使使用 DPDK 這樣高性能的數據包處理框架,延遲也有 4~5 微秒。更嚴重的問題是,通用 CPU 的延遲不夠穩定。例如當負載較高時,轉發延遲可能升到幾十微秒甚至更高(如下圖所示);現代操作系統中的時鐘中斷和任務調度也增加了延遲的不確定性。
5
雖然 GPU 也可以高性能處理數據包,但 GPU 是沒有網口的,意味着需要首先把數據包由網卡收上來,再讓 GPU 去做處理。這樣吞吐量受到 CPU 和/或網卡的限制。GPU 本身的延遲就更不必說了。
那麼爲什麼不把這些網絡功能做進網卡,或者使用可編程交換機呢?ASIC 的靈活性仍然是硬傷。儘管目前有越來越強大的可編程交換機芯片,比如支持 P4 語言的 Tofino,ASIC 仍然不能做複雜的有狀態處理,比如某種自定義的加密算法。
綜上, 在數據中心裏 FPGA 的主要優勢是穩定又極低的延遲,適用於流式的計算密集型任務和通信密集型任務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章