最后談一點(diǎn)我個(gè)人對(duì) FPGA 在云計(jì)算中角色的思考。作為三年級(jí)博士生,我在微軟亞洲研究院的研究試圖回答兩個(gè)問(wèn)題:
FPGA 在云規(guī)模的網(wǎng)絡(luò)互連系統(tǒng)中應(yīng)當(dāng)充當(dāng)怎樣的角色?
如何高效、可擴(kuò)放地對(duì) FPGA + CPU 的異構(gòu)系統(tǒng)進(jìn)行編程?
我對(duì) FPGA 業(yè)界主要的遺憾是,F(xiàn)PGA 在數(shù)據(jù)中心的主流用法,從除微軟外的互聯(lián)網(wǎng)巨頭,到兩大 FPGA 廠商,再到學(xué)術(shù)界,大多是把 FPGA 當(dāng)作跟 GPU 一樣的計(jì)算密集型任務(wù)的加速卡。然而 FPGA 真的很適合做 GPU 的事情嗎?前面講過(guò),F(xiàn)PGA 和 GPU 最大的區(qū)別在于體系結(jié)構(gòu),F(xiàn)PGA 更適合做需要低延遲的流式處理,GPU 更適合做大批量同構(gòu)數(shù)據(jù)的處理。
由于很多人打算把 FPGA 當(dāng)作計(jì)算加速卡來(lái)用,兩大 FPGA 廠商推出的高層次編程模型也是基于 OpenCL,模仿 GPU 基于共享內(nèi)存的批處理模式。CPU 要交給 FPGA 做一件事,需要先放進(jìn) FPGA 板上的 DRAM,然后告訴 FPGA 開始執(zhí)行,F(xiàn)PGA 把執(zhí)行結(jié)果放回 DRAM,再通知 CPU 去取回。CPU 和 FPGA 之間本來(lái)可以通過(guò) PCIe 高效通信,為什么要到板上的 DRAM 繞一圈?也許是工
程實(shí)現(xiàn)的問(wèn)題,我們發(fā)現(xiàn)通過(guò) OpenCL 寫 DRAM、啟動(dòng) kernel、讀 DRAM 一個(gè)來(lái)回,需要 1.8 毫秒。而通過(guò) PCIe DMA 來(lái)通信,卻只要 1~2 微秒。
PCIe I/O channel 與 OpenCL 的性能比較。縱坐標(biāo)為對(duì)數(shù)坐標(biāo)。來(lái)源:[5]
OpenCL 里面多個(gè) kernel 之間的通信就更夸張了,默認(rèn)的方式也是通過(guò)共享內(nèi)存。本文開篇就講,F(xiàn)PGA 比 CPU 和 GPU 能效高,體系結(jié)構(gòu)上的根本優(yōu)勢(shì)是無(wú)指令、無(wú)需共享內(nèi)存。使用共享內(nèi)存在多個(gè) kernel 之間通信,在順序通信(FIFO)的情況下是毫無(wú)必要的。況且 FPGA 上的 DRAM 一般比 GPU 上的 DRAM 慢很多。
因此我們提出了 ClickNP 網(wǎng)絡(luò)編程框架 [5],使用管道(channel)而非共享內(nèi)存來(lái)在執(zhí)行單元(element/kernel)間、執(zhí)行單元和主機(jī)軟件間進(jìn)行通信。需要共享內(nèi)存的應(yīng)用,也可以在管道的基礎(chǔ)上實(shí)現(xiàn),畢竟 CSP(Communicating Sequential Process)和共享內(nèi)存理論上是等價(jià)的嘛。ClickNP 目前還是在 OpenCL 基礎(chǔ)上的一個(gè)框架,受到 C 語(yǔ)言描述硬件的局限性(當(dāng)然 HLS 比 Verilog 的開發(fā)效率確實(shí)高多了)。理想的硬件描述語(yǔ)言,大概不會(huì)是 C 語(yǔ)言吧。
ClickNP 使用 channel 在 FPGA 和 CPU 間通信,來(lái)源:[5]
低延遲的流式處理,需要最多的地方就是通信。然而 CPU 由于并行性的限制和操作系統(tǒng)的調(diào)度,做通信效率不高,延遲也不穩(wěn)定。此外,通信就必然涉及到調(diào)度和仲裁,CPU 由于單核性能的局限和核間通信的低效,調(diào)度、仲裁性能受限,硬件則很適合做這種重復(fù)工作。因此我的博士研究把 FPGA 定義為通信的「大管家」,不管是服務(wù)器跟服務(wù)器之間的通信,虛擬機(jī)跟虛擬機(jī)之間的通信,進(jìn)程跟進(jìn)程之間的通信,CPU 跟存儲(chǔ)設(shè)備之間的通信,都可以用 FPGA 來(lái)加速。
成也蕭何,敗也蕭何。缺少指令同時(shí)是 FPGA 的優(yōu)勢(shì)和軟肋。每做一點(diǎn)不同的事情,就要占用一定的 FPGA 邏輯資源。如果要做的事情復(fù)雜、重復(fù)性不強(qiáng),就會(huì)占用大量的邏輯資源,其中的大部分處于閑置狀態(tài)。這時(shí)就不如用馮·諾依曼結(jié)構(gòu)的處理器。數(shù)據(jù)中心里的很多任務(wù)有很強(qiáng)的局部性和重復(fù)性:一部分是虛擬化平臺(tái)需要做的網(wǎng)絡(luò)和存儲(chǔ),這些都屬于通信;另一部分是客戶計(jì)算任務(wù)里的,比如機(jī)器學(xué)習(xí)、加密解密。我們首先把 FPGA 用于它最擅長(zhǎng)的通信,日后也許也會(huì)像 AWS 那樣把 FPGA 作為計(jì)算加速卡租給客戶。
不管通信還是機(jī)器學(xué)習(xí)、加密解密,算法都是很復(fù)雜的,如果試圖用 FPGA 完全取代 CPU,勢(shì)必會(huì)帶來(lái) FPGA 邏輯資源極大的浪費(fèi),也會(huì)提高 FPGA 程序的開發(fā)成本。更實(shí)用的做法是 FPGA 和 CPU 協(xié)同工作,局部性和重復(fù)性強(qiáng)的歸 FPGA,復(fù)雜的歸 CPU。
當(dāng)我們用 FPGA 加速了必應(yīng)搜索、深度學(xué)習(xí)等越來(lái)越多的服務(wù);當(dāng)網(wǎng)絡(luò)虛擬化、存儲(chǔ)虛擬化等基礎(chǔ)組件的數(shù)據(jù)平面被 FPGA 把持;當(dāng) FPGA 組成的「數(shù)據(jù)中心加速平面」成為網(wǎng)絡(luò)和服務(wù)器之間的天塹……似乎有種感覺,F(xiàn)PGA 將掌控全局,CPU 上的計(jì)算任務(wù)反而變得碎片化,受 FPGA 的驅(qū)使。以往我們是 CPU 為主,把重復(fù)的計(jì)算任務(wù)卸載(offload)到 FPGA 上;以后會(huì)不會(huì)變成 FPGA 為主,把復(fù)雜的計(jì)算任務(wù)卸載到 CPU 上呢?隨著 Xeon + FPGA 的問(wèn)世,古老的 SoC 會(huì)不會(huì)在數(shù)據(jù)中心煥發(fā)新生?
「跨越內(nèi)存墻,走向可編程世界」(Across the memory wall and reach a fully programmable world.)
參考文獻(xiàn):
[1] Large-Scale Reconfigurable Computing in a Microsoft Datacenterhttps://www.microsoft.com/en-us/research/wp-content/uploads/2014/06/HC26.12.520-Recon-Fabric-Pulnam-Microsoft-Catapult.pdf
[2] A Reconfigurable Fabric for Accelerating Large-Scale Datacenter Services, ISCA'14https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/Catapult_ISCA_2014.pdf
[3] Microsoft Has a Whole New Kind of Computer Chip—and It’ll Change Everything
[4] A Cloud-Scale Acceleration Architecture, MICRO'16 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf
[5] ClickNP: Highly Flexible and High-performance Network Processing with Reconfigurable Hardware - Microsoft Research
[6] Daniel Firestone, SmartNIC: Accelerating Azure's Network with. FPGAs on OCS servers.
作者:李博杰 微軟亞洲研究院的實(shí)習(xí)生