1. 程式人生 > >異構計算

異構計算

十歲的小男孩

  本文淺顯的講解下X-PU之間的區別,CPU、GPU、TPU、NPU、BPU、DPU。  

CPU  

  CPU( Central Processing Unit, 中央處理器)就是機器的“大腦”,也是佈局謀略、發號施令、控制行動的“總司令官”。 

  CPU的結構主要包括運算器(ALU, Arithmetic and Logic Unit)、控制單元(CU, Control Unit)、暫存器(Register)、快取記憶體器(Cache)和它們之間通訊的資料、控制及狀態的匯流排。 

  簡單來說就是:計算單元、控制單元和儲存單元,架構如下圖所示:

  從字面上我們也很好理解,計算單元主要執行算術運算、移位等操作以及地址運算和轉換;儲存單元主要用於儲存運算中產生的資料以及指令等;控制單元則對指令譯碼,並且發出為完成每條指令所要執行的各個操作的控制訊號。 

  所以一條指令在CPU中執行的過程是這樣的:讀取到指令後,通過指令匯流排送到控制器(黃色區域)中進行譯碼,併發出相應的操作控制訊號;然後運算器(綠色區域)按照操作指令對資料進行計算,並通過資料匯流排將得到的資料存入資料快取器(大塊橙色區域)。過程如下圖所示:

 

  是不是有點兒複雜?沒關係,這張圖完全不用記住,我們只需要知道,CPU遵循的是馮諾依曼架構

,其核心就是:儲存程式,順序執行。

  講到這裡,有沒有看出問題,沒錯——在這個結構圖中,責計算的綠色區域佔的面積似乎太小了,而橙色區域的快取Cache和黃色區域的控制單元佔據了大量空間。

  高中化學有句老生常談的話叫:結構決定性質,放在這裡也非常適用。

  因為CPU的架構中需要大量的空間去放置儲存單元(橙色部分)控制單元(黃色部分),相比之下計算單元(綠色部分)只佔據了很小的一部分,所以它在大規模平行計算能力上極受限制,而更擅長於邏輯控制。

  另外,因為遵循馮諾依曼架構(儲存程式,順序執行),CPU就像是個一板一眼的管家,人們吩咐的事情它總是一步一步來做。但是隨著人們對更大規模與更快處理速度的需求的增加,這位管家漸漸變得有些力不從心。

  於是,大家就想,能不能把多個處理器放在同一塊晶片上,讓它們一起來做事,這樣效率不就提高了嗎?

  沒錯,GPU便由此誕生了。

GPU

  在正式講解GPU之前,我們先來講講上文中提到的一個概念——平行計算。

  平行計算(Parallel Computing)是指同時使用多種計算資源解決計算問題的過程,是提高計算機系統計算速度和處理能力的一種有效手段。它的基本思想是用多個處理器來共同求解同一問題,即將被求解的問題分解成若干個部分,各部分均由一個獨立的處理機來平行計算。

  平行計算可分為時間上的並行空間上的並行

  時間上的並行是指流水線技術,比如說工廠生產食品的時候分為四步:清洗-消毒-切割-包裝。

  如果不採用流水線,一個食品完成上述四個步驟後,下一個食品才進行處理,耗時且影響效率。但是採用流水線技術,就可以同時處理四個食品。這就是並行演算法中的時間並行,在同一時間啟動兩個或兩個以上的操作,大大提高計算效能。

  空間上的並行是指多個處理機併發的執行計算,即通過網路將兩個以上的處理機連線起來,達到同時計算同一個任務的不同部分,或者單個處理機無法解決的大型問題。

  比如小李準備在植樹節種三棵樹,如果小李1個人需要6個小時才能完成任務,植樹節當天他叫來了好朋友小紅、小王,三個人同時開始挖坑植樹,2個小時後每個人都完成了一顆植樹任務,這就是並行演算法中的空間並行,將一個大任務分割成多個相同的子任務,來加快問題解決速度。

  所以說,如果讓CPU來執行這個種樹任務的話,它就會一棵一棵的種,花上6個小時的時間,但是讓GPU來種樹,就相當於好幾個人同時在種。

  GPU全稱為Graphics Processing Unit,中文為圖形處理器,就如它的名字一樣,GPU最初是用在個人電腦、工作站、遊戲機和一些移動裝置(如平板電腦、智慧手機等)上執行繪圖運算工作的微處理器。

  為什麼GPU特別擅長處理影象資料呢?這是因為影象上的每一個畫素點都有被處理的需要,而且每個畫素點處理的過程和方式都十分相似,也就成了GPU的天然溫床。

  GPU簡單架構如下圖所示:

  從架構圖我們就能很明顯的看出,GPU的構成相對簡單,有數量眾多的計算單元和超長的流水線,特別適合處理大量的型別統一的資料。

  但GPU無法單獨工作,必須由CPU進行控制呼叫才能工作。CPU可單獨作用,處理複雜的邏輯運算和不同的資料型別,但當需要大量的處理型別統一的資料時,則可呼叫GPU進行平行計算。

  注:GPU中有很多的運算器ALU和很少的快取cache,快取的目的不是儲存後面需要訪問的資料的,這點和CPU不同,而是為執行緒thread提高服務的。如果有很多執行緒需要訪問同一個相同的資料,快取會合並這些訪問,然後再去訪問dram。

  再把CPU和GPU兩者放在一張圖上看下對比,就非常一目瞭然了。

  GPU的工作大部分都計算量大,但沒什麼技術含量,而且要重複很多很多次。

  借用知乎上某大神的說法,就像你有個工作需要計算幾億次一百以內加減乘除一樣,最好的辦法就是僱上幾十個小學生一起算,一人算一部分,反正這些計算也沒什麼技術含量,純粹體力活而已;而CPU就像老教授,積分微分都會算,就是工資高,一個老教授資頂二十個小學生,你要是富士康你僱哪個?

  GPU就是用很多簡單的計算單元去完成大量的計算任務,純粹的人海戰術。這種策略基於一個前提,就是小學生A和小學生B的工作沒有什麼依賴性,是互相獨立的。

  但有一點需要強調,雖然GPU是為了影象處理而生的,但是我們通過前面的介紹可以發現,它在結構上並沒有專門為影象服務的部件,只是對CPU的結構進行了優化與調整,所以現在GPU不僅可以在影象處理領域大顯身手,它還被用來科學計算、密碼破解、數值分析,海量資料處理(排序,Map-Reduce等),金融分析等需要大規模平行計算的領域。

  所以GPU也可以認為是一種較通用的晶片。

TPU

  按照上文所述,CPU和GPU都是較為通用的晶片,但是有句老話說得好:萬能工具的效率永遠比不上專用工具。

  隨著人們的計算需求越來越專業化,人們希望有晶片可以更加符合自己的專業需求,這時,便產生了ASIC(專用積體電路)的概念。

  ASIC是指依產品需求不同而定製化的特殊規格積體電路,由特定使用者要求和特定電子系統的需要而設計、製造。當然這概念不用記,簡單來說就是定製化晶片。

  因為ASIC很“專一”,只做一件事,所以它就會比CPU、GPU等能做很多件事的晶片在某件事上做的更好,實現更高的處理速度和更低的能耗。但相應的,ASIC的生產成本也非常高。

  而TPU(Tensor Processing Unit, 張量處理器)就是谷歌專門為加速深層神經網路運算能力而研發的一款晶片,其實也是一款ASIC。

  更重要的原因是谷歌提供的很多服務,包括谷歌影象搜尋、谷歌照片、谷歌雲視覺API、谷歌翻譯等產品和服務都需要用到深度神經網路。基於谷歌自身龐大的體量,開發一種專門的晶片開始具備規模化應用(大量分攤研發成本)的可能。

  如此看來,TPU登上歷史舞臺也順理成章了。

  原來很多的機器學習以及影象處理演算法大部分都跑在GPU與FPGA(半定製化晶片)上面,但這兩種晶片都還是一種通用性晶片,所以在效能與功耗上還是不能更緊密的適配機器學習演算法,而且Google一直堅信偉大的軟體將在偉大的硬體的幫助下更加大放異彩,所以Google便想,我們可不可以做出一款專用機機器學習演算法的專用晶片,TPU便誕生了。 

  據稱,TPU與同期的CPU和GPU相比,可以提供15-30倍的效能提升,以及30-80倍的效率(效能/瓦特)提升。初代的TPU只能做推理,要依靠Google雲來實時收集資料併產生結果,而訓練過程還需要額外的資源;而第二代TPU既可以用於訓練神經網路,又可以用於推理。

  看到這裡你可能會問了,為什麼TPU會在效能上這麼牛逼呢?

  嗯,谷歌寫了好幾篇論文和博文來說明這一原因,所以僅在這裡拋磚引玉一下。

  如上圖所示,TPU在晶片上使用了高達24MB的區域性記憶體,6MB的累加器記憶體以及用於與主控處理器進行對接的記憶體,總共佔芯片面積的37%(圖中藍色部分)。

  這表示谷歌充分意識到了片外記憶體訪問是GPU能效比低的罪魁禍首,因此不惜成本的在晶片上放了巨大的記憶體。相比之下,英偉達同時期的K80只有8MB的片上記憶體,因此需要不斷地去訪問片外DRAM。

  另外,TPU的高效能還來源於對於低運算精度的容忍。研究結果表明,低精度運算帶來的演算法準確率損失很小,但是在硬體實現上卻可以帶來巨大的便利,包括功耗更低、速度更快、佔芯片面積更小的運算單元、更小的記憶體頻寬需求等...TPU採用了8位元的低精度運算。

  其它更多的資訊可以去翻翻谷歌的論文。

  到目前為止,TPU其實已經幹了很多事情了,例如機器學習人工智慧系統RankBrain,它是用來幫助Google處理搜尋結果併為使用者提供更加相關搜尋結果的;還有街景Street View,用來提高地圖與導航的準確性的;當然還有下圍棋的計算機程式AlphaGo!

NPU

  講到這裡,相信大家對這些所謂的“XPU”的套路已經有了一定了解,我們接著來。

  所謂NPU(Neural network Processing Unit), 即神經網路處理器。顧名思義,這傢伙是想用電路模擬人類的神經元和突觸結構啊!

  怎麼模仿?那就得先來看看人類的神經結構——生物的神經網路由若干人工神經元結點互聯而成,神經元之間通過突觸兩兩連線,突觸記錄了神經元之間的聯絡。

  如果想用電路模仿人類的神經元,就得把每個神經元抽象為一個激勵函式,該函式的輸入由與其相連的神經元的輸出以及連線神經元的突觸共同決定。

  為了表達特定的知識,使用者通常需要(通過某些特定的演算法)調整人工神經網路中突觸的取值、網路的拓撲結構等。該過程稱為“學習”。

  在學習之後,人工神經網路可通過習得的知識來解決特定的問題。

  這時不知道大家有沒有發現問題——原來,由於深度學習的基本操作是神經元和突觸的處理,而傳統的處理器指令集(包括x86和ARM等)是為了進行通用計算髮展起來的,其基本操作為算術操作(加減乘除)和邏輯操作(與或非),往往需要數百甚至上千條指令才能完成一個神經元的處理,深度學習的處理效率不高。

  這時就必須另闢蹊徑——突破經典的馮·諾伊曼結構!

  神經網路中儲存和處理是一體化的,都是通過突觸權重來體現。 而馮·諾伊曼結構中,儲存和處理是分離的,分別由儲存器和運算器來實現,二者之間存在巨大的差異。當用現有的基於馮·諾伊曼結構的經典計算機(如X86處理器和英偉達GPU)來跑神經網路應用時,就不可避免地受到儲存和處理分離式結構的制約,因而影響效率。這也就是專門針對人工智慧的專業晶片能夠對傳統晶片有一定先天優勢的原因之一。

  NPU的典型代表有國內的寒武紀晶片和IBM的TrueNorth。以中國的寒武紀為例,DianNaoYu指令直接面對大規模神經元和突觸的處理,一條指令即可完成一組神經元的處理,並對神經元和突觸資料在晶片上的傳輸提供了一系列專門的支援。

  用數字來說話,CPU、GPU與NPU相比,會有百倍以上的效能或能耗比差距——以寒武紀團隊過去和Inria聯合發表的DianNao論文為例——DianNao為單核處理器,主頻為0.98GHz,峰值效能達每秒4520億次神經網路基本運算,65nm工藝下功耗為0.485W,面積3.02平方毫米mm。

BPU

  BPU(Brain Processing Unit,大腦處理器)是由地平線科技提出的嵌入式人工智慧處理器架構。第一代是高斯架構,第二代是伯努利架構,第三代是貝葉斯架構。目前地平線已經設計出了第一代高斯架構,並與英特爾在2017年CES展會上聯合推出了ADAS系統(高階駕駛輔助系統)。

DPU

  DPU(Deep learning Processing Unit, 即深度學習處理器)最早由國內深鑑科技提出,基於Xilinx可重構特性的FPGA晶片,設計專用的深度學習處理單元(可基於已有的邏輯單元,設計並行高效的乘法器及邏輯電路,屬於IP範疇),且抽象出定制化的指令集和編譯器(而非使用OpenCL),從而實現快速的開發與產品迭代。事實上,深鑑提出的DPU屬於半定製化的FPGA。

參考:

(ISCA 2016) EIE: Efficient Inference Engine on Compressed Deep Neural Network 
感謝博思Ponder的分享

知識應該是開源的,歡迎斧正。[email protected]