天天看點

CPU和GPU雙低效,摩爾定律之後一萬倍 ——寫于TPU版AlphaGo重出江湖之際

2008年,《三體2:黑暗森林》裡寫到:

真的很難,你冬眠後不久,就有六個新一代超級計算機大型研究項目同時開始,其中三個是傳統結構的,一個是非馮結構的,另外兩個分别是量子和生物分子計算機研究項目。但兩年後,這六個項目的首席科學家都對我說,我們要的計算能力根本不可能實作。量子計算機項目是最先中斷的,現有的實體理論無法提供足夠的支援,研究撞到了智子的牆壁上。緊接着生物分子計算機項目也下馬了,他們說這隻是一個幻想。最後停止的是非馮結構計算機,這種結構其實是對人類大腦的模拟,他們說我們這隻蛋還沒有形成,不可能有雞的。最後隻有三個傳統結構計算機項目還在運作,但很長時間沒有任何進展。 好在我們要的計算機還是出現了,它的性能是你冬眠時最強計算機的一萬倍。傳統結構?傳統結構,能從摩爾定律這個檸檬裡又榨出這麼多汁來,計算機科學界都很吃驚。但這次,親愛的,這次真的到頭了

那是我讀計算機體系結構專業博士的最後一年,當時我對此嗤之以鼻:摩爾定律怎麼可能還有那麼多油水可以榨。工藝極限近在眼前,不用智子出手,摩爾定律就會死翹翹了;傳統結構更是沒戲,cpu的架構已經被研究到頭了,從2000年後,幾乎沒有搗鼓出啥新東西。

是以,這個“一萬倍”,真的是好科幻好科幻啊。

回顧三體2出版之後的這九年,工藝進展步履維艱,微架構亮點寥寥,cpu的性能每一代都是擠牙膏。一切都好像在印證我悲觀的預期——計算機硬體的性能,好像真的提升不上去了。

但是,從去年開始,“科幻”般的事件相繼降臨:

2016年3月,alphago戰勝李世石,它使用了1202個cpu和176個gpu

2016年4月,nvidia釋出pascal架構,峰值性能達到11tflops/s,黃仁勳在接受新智元專訪時表示,半導體技術疊代在放緩,但gpu pascal架構比上一代性能在兩年内提升了近十倍,是以可以說我們正處在一個“超級摩爾定律”時代。

今年5月11日,nvidia釋出volta架構,峰值性能達到120tflops/s

今年5月11日,google公布tpu二代,峰值性能達到180tflops/s,且可以通過google cloud通路

今年5月23日alphago重出江湖并且毫無懸念地戰勝了柯潔;24日,deepmind ceo 哈薩比斯和alphago項目總負責人david silver 在新聞釋出會上接受媒體采訪時表示,alphago實際上是在谷歌雲端的單一一台機器上運作的,此機器建立于二代tpu之上(據說這台機器使用了4塊tpu)

在摩爾定律已經嚴重減速甚至失效的今天,我們實實在在地看到了算力的大幅度提升,而且這場算力的軍備競賽還在繼續!

而我,也改變了自己悲觀的預期,相信在不遠的将來,“摩爾定律結束之後,性能提升一萬倍”,将不會是科幻,而是發生在我們眼前的事實。

這是不是太瘋狂了?設計計算機硬體的技術宅男們,憑什麼做到這一點?憑tpu所代表的技術路線以及新的商業模式。且聽我慢慢道來。

為什麼cpu是低效的

在解釋憑什麼能做到“摩爾定律之後一萬倍”之前,我們先聊聊為什麼cpu和gpu無法擔此重任。

如果你問我,cpu最大的特點是什麼?我會說:它給程式員一個假象,讓你感覺通路大容量的記憶體任何一個位置的延遲都是相同的,而且和做一次加法的延遲差不多,近乎為0。

制造這個假象非常困難。要知道cpu所采用的logic生産線,同記憶體用的memory生産線,有天壤之别。簡單地說,由于某種底層的實體定律,memory産線無法實作cpu所需要的高速度,logic産線無法實作記憶體所需要的大容量。更糟糕的是,memory制程相對于logic制程還越來越慢,從1986年到2000年,logic每年提速55%,而memory隻有10%。

何為“快”“慢”?口語中的“快”,可以指延遲小(從開始到結束間隔的時間短),也可以指帶寬大(機關時間内通過的量大),說“高鐵快”,指前者,說“網速快”,指後者。記憶體的帶寬其實增長得還湊合,486時代cpu跑100mhz,sdram記憶體帶寬為100mt/s;如今cpu達到2ghz~3ghz,ddr4記憶體帶寬3200mt/s。雖然記憶體帶寬有了幾十倍的提升,但從發出讀請求到記憶體條傳回資料的延遲,這二十年來隻減小了兩倍多。

且不說外行人,很多初級程式員都不知道記憶體的延遲如此糟糕,即使是資深程式員,在大多數時候,也可以在編碼中忽略它,為什麼?這都是cpu的功勞。cpu使用了很多複雜的技術來隐藏記憶體的延遲,例如:

cpu使用非常大量的片上存儲來做cache(緩存),把程式經常通路的資料放在片上,這樣就不必通路記憶體了

cpu用複雜的技術猜測程式即将通路哪些資料,用預取的方式,提前把這些資料從記憶體中搬運到片上

當某一段程式由于等待記憶體資料而卡住無法執行時,cpu用亂序的方式,執行接下來的片段

使用超線程技術,當一個程式因為等待記憶體資料而卡住時,選擇另外一個程式來執行

cpu的矽片上,絕大多數面積都是用來制造“記憶體通路近乎零延遲”這一假象的,真正用來做運算的邏輯,所占面積甚至不到1%——這就是它低效的根源。

cpu誕生于logic和memory的速度差不多的年代,那個時候,程式員就已經習慣于假設“記憶體通路近乎零延遲”,為了保證對軟體的相容,cpu多年來不惜一切代價維持這一假象。積重難返,時至今日,軟體已經無法通過cpu來充分利用內建電路制造技術所提供的澎湃動力。

為什麼gpu是低效的

再用一句話來總結gpu最大的特點:它給程式員一個假象,讓你感覺gpu上面有數十萬個小程式在運作,彼此相安無事。

gpu的架構,簡單地說,就是把類似cpu超線程的技術用到極緻來隐藏記憶體通路的超長延遲。gpu裡面有數千個小核心,每個都可以看成是個小cpu,與此同時,它同時運作最多數十萬個小程式,大多數程式會因為等待訪存而卡住,真正在小cpu上執行的程式隻有數千個。

因為同時在工作的小核心有數千個,gpu比起cpu,機關時間内完成的運算量大多了。但它也有軟肋,那就是:這數十萬個小程式,彼此之間根本不可能相安無事,它們會搶存儲帶寬,搶得很兇。gpu要付出的管理代價相當高:

要做複雜的緩存,以備一塊從顯存取來的資料被很多小核心使用

訪存接口隻有8個,能發出訪存請求的小核心确有數千個,必須分析它們發出的請求,把通路相鄰位址的請求捏在一起作為一個請求送給顯存

訪存帶寬必須做得遠高于cpu,才能喂飽數千個小核心

數千個小核心上,每個時鐘周期所運作的小程式都可能不一樣,每個小程式的上下文都要保留,以備将來喚醒。為了存儲上下文所付出的片上memory的面積,堪比cpu上的龐大緩存

相對于cpu,gpu制造假象的能力稍遜一籌,稍有經驗的gpu程式員,都明白要盡可能讓gpu上并行跑的數十萬小程式在訪存時呈現一定的規律,否則gpu的效率會大打折扣。

gpu的定位,不單單是圖形加速,而是所有的有海量資料并行運算的應用,是以它必須非常通用,不能對其上運作的數十萬個小程式做限制。事實上,這數十萬的小程式每個都可以任意通路到顯存的所有位置,而且通路的位置各不相同,在這種情況下,gpu也要保證功能的正确性,哪怕跑得慢些。管理群組織這數十萬個不受限制的小程式所付出的矽片面積代價和記憶體帶寬的代價,是gpu低效的根源。

為什麼fpga隻是過渡方案

cpu和gpu的架構都有非常沉重的曆史包袱,展現在:

它們都有很強的通用性,不能僅僅隻針對某個領域做優化

它們都有很強的相容性,過去編寫的程式必須能夠運作

它們都有穩定而龐大的程式員隊伍,這些程式員的思維方式不加改變的話,它們就不能放棄提供那些“假象”

這些也是非常偉大而甜蜜的包袱,正因為背負着它們,cpu和gpu廠商才能在它們既有的市場裡呼風喚雨,并且把競争者擋在門外。

如果扔掉這些包袱,設計全新的架構,就可以做到:

僅僅針對某個領域做優化

不考慮對過去軟體的相容

用全新的方式對其程式設計,不拘泥于之前的思維定勢

這樣設計出的架構,對其目标領域,性能名額會大幅度超越cpu和gpu這類通用架構。原因非常淺顯易懂,通用性和最優化無法兩全。曆史上已有先例,當計算化學領域和天體實體領域對計算性能的需求無法被滿足時,分别有科學家們為它們開發出了專用的anton和grape-dr計算機。隻不過它們的專業性太強,不為大衆所知。

如今,當cpu和gpu的架構已經無法滿足人工智能應用對速度、功耗和成本的需求時,尋找新的架構成為了大家共同的選擇。在尋找新架構的過程中,fpga起到了開路先鋒的作用。

fpga是什麼?如果說cpu和gpu是在架構級别做到“通用”的話,fpga就是在更低一級的電路級做到了“通用”。通過硬體描述語言對fpga程式設計後,它可以模拟任何一種晶片的架構,包括cpu和gpu的架構,通俗地說,fpga是一種可程式設計的“萬能晶片”。它非常适合探索性的、小批量的産品。

我們已經看到了很多的fpga方案,實作了比gpu更好的速度、功耗或成本的名額。但是,fpga依然無法擺脫“通用就無法最優”這一規律的制約。它之是以還能展現出相當的優勢,是因為在一個軟硬體系統中,算法的影響遠大于硬體架構,而硬體架構的影響又遠大于電路——在電路級别做“通用”付出的代價,比起在架構級别做“通用”的代價,還是小得多了。

一旦fpga給某個專用架構趟出路來之後,它就會退居幕後,讓位給更專用的asic。

tpu代表了未來的方向

這次同柯潔對陣的alphago,采用了google自研的第二代tpu。tpu的特點是:

僅僅針對線性代數做優化

不相容cpu或gpu的程式

用全新的方式對其程式設計

用asic而非fpga的方式來實作

深度學習所使用算法,絕大多數可以被映射為底層的線性代數運算。tpu(tensor processing unit)中的tensor,就是線性代數中的基本資料類型。線性代數運算有兩大特點:tensor的流動非正常整且可預期;計算密度很高,即每個資料都會曆經非常多次的計算。這兩大特點使得線性代數運算特别适合做硬體加速——所有用來制造“假象”的邏輯都不再必要,每個半導體都可以用做有意義的運算或存儲。

tpu上無法運作cpu上跑的java或c++程式,也無法運作gpu上的cuda程式。雖然尚未有公開資訊,但它的程式設計方式非常可能是這樣:tensorflow把神經網絡用一種中間格式表示出來,然後這種中間格式被編譯器轉換為tpu上獨特的程式。這種中間格式被稱為tensorflow xla,它也将是tensorflow支援其它線性代數加速器的工具。

google之是以選擇asic而非fpga,與其說是它的眼光好,不如說是它的魄力強。内行人都知道asic效能遠超fpga,但仍然有很多人不敢選擇asic,為什麼?自己做asic的風險太大:周期長,投入多,門檻高。一旦晶片做錯,就和石頭無異,落個血本無歸。當年apple決定自己做晶片時,并沒有直接組建隊伍,而是收購了p.a. semi;這麼多年後,成果赫赫,但依然不敢在mac電腦中使用自研的cpu來淘汰intel的晶片。而google在短短幾年内,組建了隊伍,設計了合理的架構,做出了能work的晶片,并且敢于在自己的雲上部署自己的産品,隻能說一聲“服!”

google是一家偉大的公司,在它釋出mapreduce、gfs和bigtable的論文之前,這些東西被普遍認為是不可能完成的。相信很多人在看到裝備tpu的alphago戰勝柯潔之前,也會認為tpu是不可能完成的。曆史證明,google能做的事情,别人起碼可以模仿個七八分。現在大家應該相信,在一個足夠重要應用領域中,完全可以把優化和定制做到半導體級别,而不是隻做到某種現成的晶片架構的級别。這不但可行,而且必要,因為你不這麼做,競争對手也會這麼做。

硬體的開源時代

摩爾定律的通俗表示是:每一美元所能買到的電腦性能,将每隔18-24個月翻一倍以上。過去三十年,拜摩爾定律所賜,我們見證了超過百萬倍的成本效益提升。未來我們所能看到的這一萬倍,也應該按照“機關成本所能買到的電腦性能”來計算。

cpu和gpu這種通用架構,它們的曆史包袱不僅僅導緻了優化難以開展,還導緻了:一、壟斷導緻的超額利潤;二、過度複雜所帶來的研發成本上升。于是,晶片的價格居高不下。

未來,當特定領域的定制晶片大行其道時,這些晶片的價格也将顯著降低。原因在于:一、不再有壟斷;二、沒有曆史包袱所帶來的研發成本;三、開源所帶來的研發成本降低。

硬體開源過去有過嘗試,但無大成,原因是多種多樣的。但從長遠角度看,所有的基礎設施,被廣大廠商共享的,最終都會走向開源的路子。如果說intel的cpu是大地(所有的優化不能做到比它更加底層),那麼linux、python和php就是大地之上最底層的基礎設施,它們是開源的;如果說gpu+cuda是大地,那麼各種深度學習的架構就是最底層的基礎設施,它們也都是開源的。如果未來半導體是大地,那麼毫無疑問晶片的架構也會出現各種開源方案。

這一切才剛剛開始。這個月nvidia做了兩件有趣的事:贊助了開源cpu架構riscv在上海舉辦的workshop;宣布xavier自動駕駛晶片中的針對線性代數的硬體加速子產品dla将開源。大廠支援開源,絕不是搞慈善,而是為了扼殺競争對手,赢得業界事實标準的控制權。但開源的後果,必然是降低設計門檻,降低整個行業的研發成本。

我們的星辰大海:從應用到半導體的全棧優化

對于從事計算機體系結構專業的同仁而言,這是最好的時代,半導體制造的先進工藝進展緩慢,但軟體的各種應用需求還在不斷湧現,軟硬體接口逐漸模糊,成熟工藝的成本不斷下降。為了優化特定應用,做深入到半導體級的全棧優化成為一個現實的選項。隻要正确地設計專用架構,使用成熟工藝也可以輕松超越gpu和cpu這種通用架構,哪怕它們采用最先進的制造技術。

這是一個全新的世界,以往的利益格局和設計思想都将被打破,誰也無法預知将會發生怎樣的興衰變遷。但這就是我們的星辰大海,一起來探索和曆險吧!

繼續閱讀