2008年,,《三體2:黑暗森林》里寫到:
真的很難,你冬眠后不久,,就有六個新一代超級計(jì)算機(jī)大型研究項(xiàng)目同時開始,,其中三個是傳統(tǒng)結(jié)構(gòu)的,一個是非馮結(jié)構(gòu)的,,另外兩個分別是量子和生物分子計(jì)算機(jī)研究項(xiàng)目,。但兩年后,這六個項(xiàng)目的首席科學(xué)家都對我說,,我們要的計(jì)算能力根本不可能實(shí)現(xiàn),。量子計(jì)算機(jī)項(xiàng)目是最先中斷的,現(xiàn)有的物理理論無法提供足夠的支持,,研究撞到了智子的墻壁上,。緊接著生物分子計(jì)算機(jī)項(xiàng)目也下馬了,他們說這只是一個幻想,。最后停止的是非馮結(jié)構(gòu)計(jì)算機(jī),,這種結(jié)構(gòu)其實(shí)是對人類大腦的模擬,他們說我們這只蛋還沒有形成,,不可能有雞的,。最后只有三個傳統(tǒng)結(jié)構(gòu)計(jì)算機(jī)項(xiàng)目還在運(yùn)作,但很長時間沒有任何進(jìn)展,。
好在我們要的計(jì)算機(jī)還是出現(xiàn)了,,它的性能是你冬眠時最強(qiáng)計(jì)算機(jī)的一萬倍,。傳統(tǒng)結(jié)構(gòu)?傳統(tǒng)結(jié)構(gòu),,能從摩爾定律這個檸檬里又榨出這么多汁來,,計(jì)算機(jī)科學(xué)界都很吃驚。但這次,,親愛的,,這次真的到頭了
那是我讀計(jì)算機(jī)體系結(jié)構(gòu)專業(yè)博士的最后一年,當(dāng)時我對此嗤之以鼻:摩爾定律怎么可能還有那么多油水可以榨,。工藝極限近在眼前,,不用智子出手,摩爾定律就會死翹翹了,;傳統(tǒng)結(jié)構(gòu)更是沒戲,,CPU的架構(gòu)已經(jīng)被研究到頭了,從2000年后,,幾乎沒有搗鼓出啥新東西,。
所以,這個“一萬倍”,,真的是好科幻好科幻啊,。
回顧三體2出版之后的這九年,工藝進(jìn)展步履維艱,,微架構(gòu)亮點(diǎn)寥寥,,CPU的性能每一代都是擠牙膏。一切都好像在印證我悲觀的預(yù)期——計(jì)算機(jī)硬件的性能,,好像真的提升不上去了,。
但是,從去年開始,,“科幻”般的事件相繼降臨:
2016年3月,,AlphaGo戰(zhàn)勝李世石,它使用了1202個CPU和176個GPU
2016年4月,,NVidia發(fā)布Pascal架構(gòu),,峰值性能達(dá)到11TFLOPS/s,黃仁勛在接受新智元專訪時表示,,半導(dǎo)體技術(shù)迭代在放緩,,但GPU Pascal架構(gòu)比上一代性能在兩年內(nèi)提升了近十倍,因此可以說我們正處在一個“超級摩爾定律”時代,。
今年5月11日,,NVidia發(fā)布Volta架構(gòu),峰值性能達(dá)到120TFLOPS/s
今年5月11日,,Google公布TPU二代,,峰值性能達(dá)到180TFLOPS/s,,且可以通過Google Cloud訪問
今年5月23日AlphaGo重出江湖并且毫無懸念地戰(zhàn)勝了柯潔;24日,,DeepMind CEO 哈薩比斯和AlphaGo項(xiàng)目總負(fù)責(zé)人David Silver 在新聞發(fā)布會上接受媒體采訪時表示,AlphaGo實(shí)際上是在谷歌云端的單一一臺機(jī)器上運(yùn)行的,,此機(jī)器建立于二代TPU之上(據(jù)說這臺機(jī)器使用了4塊TPU)
在摩爾定律已經(jīng)嚴(yán)重減速甚至失效的今天,,我們實(shí)實(shí)在在地看到了算力的大幅度提升,而且這場算力的軍備競賽還在繼續(xù),!
而我,,也改變了自己悲觀的預(yù)期,相信在不遠(yuǎn)的將來,,“摩爾定律結(jié)束之后,,性能提升一萬倍”,將不會是科幻,,而是發(fā)生在我們眼前的事實(shí),。
這是不是太瘋狂了?設(shè)計(jì)計(jì)算機(jī)硬件的技術(shù)宅男們,,憑什么做到這一點(diǎn),?憑TPU所代表的技術(shù)路線以及新的商業(yè)模式。且聽我慢慢道來,。
為什么CPU是低效的
在解釋憑什么能做到“摩爾定律之后一萬倍”之前,,我們先聊聊為什么CPU和GPU無法擔(dān)此重任。
如果你問我,,CPU最大的特點(diǎn)是什么,?我會說:它給程序員一個假象,讓你感覺訪問大容量的內(nèi)存任何一個位置的延遲都是相同的,,而且和做一次加法的延遲差不多,,近乎為0。
制造這個假象非常困難,。要知道CPU所采用的Logic生產(chǎn)線,,同內(nèi)存用的Memory生產(chǎn)線,有天壤之別,。簡單地說,,由于某種底層的物理定律,Memory產(chǎn)線無法實(shí)現(xiàn)CPU所需要的高速度,,Logic產(chǎn)線無法實(shí)現(xiàn)內(nèi)存所需要的大容量,。更糟糕的是,Memory制程相對于Logic制程還越來越慢,,從1986年到2000年,,Logic每年提速55%,,而Memory只有10%。
何為“快”“慢”,?口語中的“快”,,可以指延遲小(從開始到結(jié)束間隔的時間短),,也可以指帶寬大(單位時間內(nèi)通過的量大),,說“高鐵快”,指前者,,說“網(wǎng)速快”,,指后者。內(nèi)存的帶寬其實(shí)增長得還湊合,,486時代CPU跑100MHz,,SDRAM內(nèi)存帶寬為100MT/s;如今CPU達(dá)到2GHz~3GHz,,DDR4內(nèi)存帶寬3200MT/s,。雖然內(nèi)存帶寬有了幾十倍的提升,但從發(fā)出讀請求到內(nèi)存條返回?cái)?shù)據(jù)的延遲,,這二十年來只減小了兩倍多,。
且不說外行人,很多初級程序員都不知道內(nèi)存的延遲如此糟糕,,即使是資深程序員,,在大多數(shù)時候,也可以在編碼中忽略它,,為什么,?這都是CPU的功勞。CPU使用了很多復(fù)雜的技術(shù)來隱藏內(nèi)存的延遲,,例如:
CPU使用非常大量的片上存儲來做cache(緩存),,把程序經(jīng)常訪問的數(shù)據(jù)放在片上,這樣就不必訪問內(nèi)存了
CPU用復(fù)雜的技術(shù)猜測程序即將訪問哪些數(shù)據(jù),,用預(yù)取的方式,,提前把這些數(shù)據(jù)從內(nèi)存中搬運(yùn)到片上
當(dāng)某一段程序由于等待內(nèi)存數(shù)據(jù)而卡住無法執(zhí)行時,CPU用亂序的方式,,執(zhí)行接下來的片段
使用超線程技術(shù),,當(dāng)一個程序因?yàn)榈却齼?nèi)存數(shù)據(jù)而卡住時,選擇另外一個程序來執(zhí)行
CPU的硅片上,,絕大多數(shù)面積都是用來制造“內(nèi)存訪問近乎零延遲”這一假象的,,真正用來做運(yùn)算的邏輯,所占面積甚至不到1%——這就是它低效的根源,。
CPU誕生于Logic和Memory的速度差不多的年代,,那個時候,,程序員就已經(jīng)習(xí)慣于假設(shè)“內(nèi)存訪問近乎零延遲”,為了保證對軟件的兼容,,CPU多年來不惜一切代價維持這一假象,。積重難返,時至今日,,軟件已經(jīng)無法通過CPU來充分利用集成電路制造工藝所提供的澎湃動力,。
為什么GPU是低效的
再用一句話來總結(jié)GPU最大的特點(diǎn):它給程序員一個假象,讓你感覺GPU上面有數(shù)十萬個小程序在運(yùn)行,,彼此相安無事,。
GPU的架構(gòu),,簡單地說,,就是把類似CPU超線程的技術(shù)用到極致來隱藏內(nèi)存訪問的超長延遲。GPU里面有數(shù)千個小核心,,每個都可以看成是個小CPU,,與此同時,它同時運(yùn)行最多數(shù)十萬個小程序,,大多數(shù)程序會因?yàn)榈却L存而卡住,,真正在小CPU上執(zhí)行的程序只有數(shù)千個。
因?yàn)橥瑫r在工作的小核心有數(shù)千個,,GPU比起CPU,,單位時間內(nèi)完成的運(yùn)算量大多了。但它也有軟肋,,那就是:這數(shù)十萬個小程序,,彼此之間根本不可能相安無事,它們會搶存儲帶寬,,搶得很兇,。GPU要付出的管理代價相當(dāng)高:
要做復(fù)雜的緩存,以備一塊從顯存取來的數(shù)據(jù)被很多小核心使用
訪存接口只有8個,,能發(fā)出訪存請求的小核心確有數(shù)千個,,必須分析它們發(fā)出的請求,把訪問相鄰地址的請求捏在一起作為一個請求送給顯存
訪存帶寬必須做得遠(yuǎn)高于CPU,,才能喂飽數(shù)千個小核心
數(shù)千個小核心上,,每個時鐘周期所運(yùn)行的小程序都可能不一樣,每個小程序的上下文都要保留,,以備將來喚醒,。為了存儲上下文所付出的片上Memory的面積,堪比CPU上的龐大緩存
相對于CPU,,GPU制造假象的能力稍遜一籌,,稍有經(jīng)驗(yàn)的GPU程序員,,都明白要盡可能讓GPU上并行跑的數(shù)十萬小程序在訪存時呈現(xiàn)一定的規(guī)律,否則GPU的效率會大打折扣,。
GPU的定位,,不單單是圖形加速,而是所有的有海量數(shù)據(jù)并行運(yùn)算的應(yīng)用,,因此它必須非常通用,,不能對其上運(yùn)行的數(shù)十萬個小程序做限制。事實(shí)上,,這數(shù)十萬的小程序每個都可以任意訪問到顯存的所有位置,,而且訪問的位置各不相同,在這種情況下,,GPU也要保證功能的正確性,,哪怕跑得慢些。管理和組織這數(shù)十萬個不受限制的小程序所付出的硅片面積代價和內(nèi)存帶寬的代價,,是GPU低效的根源,。
為什么FPGA只是過渡方案
CPU和GPU的架構(gòu)都有非常沉重的歷史包袱,體現(xiàn)在:
它們都有很強(qiáng)的通用性,,不能僅僅只針對某個領(lǐng)域做優(yōu)化
它們都有很強(qiáng)的兼容性,,過去編寫的程序必須能夠運(yùn)行
它們都有穩(wěn)定而龐大的程序員隊(duì)伍,這些程序員的思維方式不加改變的話,,它們就不能放棄提供那些“假象”
這些也是非常偉大而甜蜜的包袱,,正因?yàn)楸池?fù)著它們,CPU和GPU廠商才能在它們既有的市場里呼風(fēng)喚雨,,并且把競爭者擋在門外,。
如果扔掉這些包袱,設(shè)計(jì)全新的架構(gòu),,就可以做到:
僅僅針對某個領(lǐng)域做優(yōu)化
不考慮對過去軟件的兼容
用全新的方式對其編程,,不拘泥于之前的思維定勢
這樣設(shè)計(jì)出的架構(gòu),對其目標(biāo)領(lǐng)域,,性能指標(biāo)會大幅度超越CPU和GPU這類通用架構(gòu),。原因非常淺顯易懂,通用性和最優(yōu)化無法兩全,。歷史上已有先例,,當(dāng)計(jì)算化學(xué)領(lǐng)域和天體物理領(lǐng)域?qū)τ?jì)算性能的需求無法被滿足時,分別有科學(xué)家們?yōu)樗鼈冮_發(fā)出了專用的Anton和Grape-DR計(jì)算機(jī),。只不過它們的專業(yè)性太強(qiáng),,不為大眾所知。
如今,當(dāng)CPU和GPU的架構(gòu)已經(jīng)無法滿足人工智能應(yīng)用對速度,、功耗和成本的需求時,,尋找新的架構(gòu)成為了大家共同的選擇。在尋找新架構(gòu)的過程中,,F(xiàn)PGA起到了開路先鋒的作用,。
FPGA是什么?如果說CPU和GPU是在架構(gòu)級別做到“通用”的話,,F(xiàn)PGA就是在更低一級的電路級做到了“通用”,。通過硬件描述語言對FPGA編程后,它可以模擬任何一種芯片的架構(gòu),,包括CPU和GPU的架構(gòu),,通俗地說,F(xiàn)PGA是一種可編程的“萬能芯片”,。它非常適合探索性的,、小批量的產(chǎn)品。
我們已經(jīng)看到了很多的FPGA方案,,實(shí)現(xiàn)了比GPU更好的速度,、功耗或成本的指標(biāo),。但是,,F(xiàn)PGA依然無法擺脫“通用就無法最優(yōu)”這一規(guī)律的制約。它之所以還能體現(xiàn)出相當(dāng)?shù)膬?yōu)勢,,是因?yàn)樵谝粋€軟硬件系統(tǒng)中,,算法的影響遠(yuǎn)大于硬件架構(gòu),而硬件架構(gòu)的影響又遠(yuǎn)大于電路——在電路級別做“通用”付出的代價,,比起在架構(gòu)級別做“通用”的代價,,還是小得多了。
一旦FPGA給某個專用架構(gòu)趟出路來之后,,它就會退居幕后,,讓位給更專用的ASIC。
TPU代表了未來的方向
這次同柯潔對陣的AlphaGo,,采用了Google自研的第二代TPU,。TPU的特點(diǎn)是:
僅僅針對線性代數(shù)做優(yōu)化
不兼容CPU或GPU的程序
用全新的方式對其編程
用ASIC而非FPGA的方式來實(shí)現(xiàn)
深度學(xué)習(xí)所使用算法,,絕大多數(shù)可以被映射為底層的線性代數(shù)運(yùn)算,。TPU(Tensor Processing Unit)中的Tensor,就是線性代數(shù)中的基本數(shù)據(jù)類型,。線性代數(shù)運(yùn)算有兩大特點(diǎn):Tensor的流動非常規(guī)整且可預(yù)期,;計(jì)算密度很高,即每個數(shù)據(jù)都會歷經(jīng)非常多次的計(jì)算。這兩大特點(diǎn)使得線性代數(shù)運(yùn)算特別適合做硬件加速——所有用來制造“假象”的邏輯都不再必要,,每個晶體管都可以用做有意義的運(yùn)算或存儲,。
TPU上無法運(yùn)行CPU上跑的Java或C++程序,也無法運(yùn)行GPU上的CUDA程序,。雖然尚未有公開信息,,但它的編程方式非常可能是這樣:TensorFlow把神經(jīng)網(wǎng)絡(luò)用一種中間格式表示出來,,然后這種中間格式被編譯器轉(zhuǎn)換為TPU上獨(dú)特的程序,。這種中間格式被稱為TensorFlow XLA,它也將是TensorFlow支持其它線性代數(shù)加速器的工具,。
Google之所以選擇ASIC而非FPGA,,與其說是它的眼光好,不如說是它的魄力強(qiáng),。內(nèi)行人都知道ASIC效能遠(yuǎn)超F(xiàn)PGA,,但仍然有很多人不敢選擇ASIC,為什么,?自己做ASIC的風(fēng)險(xiǎn)太大:周期長,,投入多,門檻高,。一旦芯片做錯,,就和石頭無異,落個血本無歸,。當(dāng)年Apple決定自己做芯片時,,并沒有直接組建隊(duì)伍,而是收購了P.A. Semi,;這么多年后,,成果赫赫,但依然不敢在Mac電腦中使用自研的CPU來淘汰Intel的芯片,。而Google在短短幾年內(nèi),,組建了隊(duì)伍,設(shè)計(jì)了合理的架構(gòu),,做出了能work的芯片,,并且敢于在自己的云上部署自己的產(chǎn)品,只能說一聲“服,!”
Google是一家偉大的公司,,在它發(fā)布MapReduce、GFS和BigTable的論文之前,,這些東西被普遍認(rèn)為是不可能完成的,。相信很多人在看到裝備TPU的AlphaGo戰(zhàn)勝柯潔之前,也會認(rèn)為TPU是不可能完成的。歷史證明,,Google能做的事情,,別人起碼可以模仿個七八分。現(xiàn)在大家應(yīng)該相信,,在一個足夠重要應(yīng)用領(lǐng)域中,,完全可以把優(yōu)化和定制做到晶體管級別,而不是只做到某種現(xiàn)成的芯片架構(gòu)的級別,。這不但可行,,而且必要,因?yàn)槟悴贿@么做,,競爭對手也會這么做,。
硬件的開源時代
摩爾定律的通俗表示是:每一美元所能買到的電腦性能,將每隔18-24個月翻一倍以上,。過去三十年,,拜摩爾定律所賜,我們見證了超過百萬倍的性價比提升,。未來我們所能看到的這一萬倍,,也應(yīng)該按照“單位成本所能買到的電腦性能”來計(jì)算。
CPU和GPU這種通用架構(gòu),,它們的歷史包袱不僅僅導(dǎo)致了優(yōu)化難以開展,,還導(dǎo)致了:一、壟斷導(dǎo)致的超額利潤,;二,、過度復(fù)雜所帶來的研發(fā)成本上升,。于是,,芯片的價格居高不下。
未來,,當(dāng)特定領(lǐng)域的定制芯片大行其道時,,這些芯片的價格也將顯著降低。原因在于:一,、不再有壟斷,;二、沒有歷史包袱所帶來的研發(fā)成本,;三,、開源所帶來的研發(fā)成本降低。
硬件開源過去有過嘗試,,但無大成,,原因是多種多樣的。但從長遠(yuǎn)角度看,所有的基礎(chǔ)設(shè)施,,被廣大廠商共享的,,最終都會走向開源的路子。如果說Intel的CPU是大地(所有的優(yōu)化不能做到比它更加底層),,那么Linux,、Python和PHP就是大地之上最底層的基礎(chǔ)設(shè)施,它們是開源的,;如果說GPU+CUDA是大地,,那么各種深度學(xué)習(xí)的框架就是最底層的基礎(chǔ)設(shè)施,它們也都是開源的,。如果未來晶體管是大地,,那么毫無疑問芯片的架構(gòu)也會出現(xiàn)各種開源方案。
這一切才剛剛開始,。這個月NVidia做了兩件有趣的事:贊助了開源CPU架構(gòu)RISCV在上海舉辦的workshop,;宣布Xavier自動駕駛芯片中的針對線性代數(shù)的硬件加速模塊DLA將開源,。大廠支持開源,,絕不是搞慈善,而是為了扼殺競爭對手,,贏得業(yè)界事實(shí)標(biāo)準(zhǔn)的控制權(quán),。但開源的后果,必然是降低設(shè)計(jì)門檻,,降低整個行業(yè)的研發(fā)成本,。
我們的星辰大海:從應(yīng)用到晶體管的全棧優(yōu)化
對于從事計(jì)算機(jī)體系結(jié)構(gòu)專業(yè)的同仁而言,,這是最好的時代,,半導(dǎo)體制造的先進(jìn)工藝進(jìn)展緩慢,,但軟件的各種應(yīng)用需求還在不斷涌現(xiàn),,軟硬件接口逐漸模糊,成熟工藝的成本不斷下降,。為了優(yōu)化特定應(yīng)用,做深入到晶體管級的全棧優(yōu)化成為一個現(xiàn)實(shí)的選項(xiàng),。只要正確地設(shè)計(jì)專用架構(gòu),,使用成熟工藝也可以輕松超越GPU和CPU這種通用架構(gòu),哪怕它們采用最先進(jìn)的制造工藝,。
這是一個全新的世界,,以往的利益格局和設(shè)計(jì)思想都將被打破,,誰也無法預(yù)知將會發(fā)生怎樣的興衰變遷,。但這就是我們的星辰大海,,一起來探索和歷險(xiǎn)吧!