1. 程式人生 > >CPU(中央處理器)和GPU(影象處理器)區別大揭祕

CPU(中央處理器)和GPU(影象處理器)區別大揭祕

有網友在網上提問:“為什麼現在更多需要用的是 GPU 而不是 CPU,比如挖礦甚至破解密碼? ”以下是比較準確靠譜的回答:

  1、現在更多被需要的依然是CPU,只是GPU在大規模併發計算中體現出其一技之長所以應用範圍逐漸變得廣泛,併成為近些年的熱點話題之一。

  為什麼二者會有如此的不同呢?首先要從CPU和GPU的區別說起。

  CPU和GPU之所以大不相同,是由於其設計目標的不同,它們分別針對了兩種不同的應用場景。CPU需要很強的通用性來處理各種不同的資料型別,同時又要邏輯判斷又會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜。而GPU面對的則是型別高度統一的、相互無依賴的大規模資料和不需要被打斷的純淨的計算環境。

  於是CPU和GPU就呈現出非常不同的架構(示意圖):

CPU與GPU區別大揭祕

  圖片來自nVidia CUDA文件。其中綠色的是計算單元,橙紅色的是儲存單元,橙黃色的是控制單元。

  GPU採用了數量眾多的計算單元和超長的流水線,但只有非常簡單的控制邏輯並省去了Cache。而CPU不僅被Cache佔據了大量空間,而且還有有複雜的控制邏輯和諸多優化電路,相比之下計算能力只是CPU很小的一部分。

  所以與CPU擅長邏輯控制和通用型別資料運算不同,GPU擅長的是大規模併發計算,這也正是密碼破解等所需要的。所以GPU除了影象處理,也越來越多的參與到計算當中來。

  2、很久以前,大概2000年那時候,顯示卡還被叫做圖形加速卡。一般叫做加速卡的都不是什麼核心元件,和現在蘋果使用的M7協處理器地位差不多。這種東西就是有了更好,沒有也不是不行,只要有個基本的圖形輸出就可以接顯示器了。在那之前,只有一些高階工作站和家用遊戲機上才能見到這種單獨的圖形處理器。後來隨著PC的普及,遊戲的發展和Windows這樣的市場霸主出現,簡化了圖形硬體廠商的工作量,圖形處理器,或者說顯示卡才逐漸普及起來。

  想要理解GPU與CPU的區別,需要先明白GPU被設計用來做什麼。現代的GPU功能涵蓋了圖形顯示的方方面面,我們只取一個最簡單的方向作為例子。

  大家可能都見過上面這張圖,這是老版本Direct X帶的一項測試,就是一個旋轉的立方體。顯示出一個這樣的立方體要經過好多步驟,我們先考慮簡單的,想象一下他是個線框,沒有側面的“X”影象。再簡化一點,連線都沒有,就是八個點(立方體有八個頂點的)。那麼問題就簡化成如何讓這八個點轉起來。首先,你在創造這個立方體的時候,肯定有八個頂點的座標,座標都是用向量表示的,因而至少也是個三維向量。然後“旋轉”這個變換,線上性代數裡面是用一個矩陣來表示的。向量旋轉,是用向量乘以這個矩陣。把這八個點轉一下,就是進行八次向量與矩陣的乘法而已。這種計算並不複雜,拆開來看無非就是幾次乘積加一起,就是計算量比較大。八個點就要算八次,2000個點就要算2000次。這就是GPU工作的一部分,頂點變換,這也是最簡單的一部分。剩下還有一大堆比這更麻煩的就不說了。

GPU的工作大部分就是這樣,計算量大,但沒什麼技術含量,而且要重複很多很多次。就像你有個工作需要算幾億次一百以內加減乘除一樣,最好的辦法就是僱上幾十個小學生一起算,一人算一部分,反正這些計算也沒什麼技術含量,純粹體力活而已。而CPU就像老教授,積分微分都會算,就是工資高,一個老教授資頂二十個小學生,你要是富士康你僱哪個?GPU就是這樣,用很多簡單的計算單元去完成大量的計算任務,純粹的人海戰術。這種策略基於一個前提,就是小學生A和小學生B的工作沒有什麼依賴性,是互相獨立的。很多涉及到大量計算的問題基本都有這種特性,比如你說的破解密碼,挖礦和很多圖形學的計算。這些計算可以分解為多個相同的簡單小任務,每個任務就可以分給一個小學生去做。但還有一些任務涉及到“流”的問題。比如你去相親,雙方看著順眼才能繼續發展。總不能你這邊還沒見面呢,那邊找人把證都給領了。這種比較複雜的問題都是CPU來做的。

  總而言之,CPU和GPU因為最初用來處理的任務就不同,所以設計上有不小的區別。而某些任務和GPU最初用來解決的問題比較相似,所以用GPU來算了。GPU的運算速度取決於僱了多少小學生,CPU的運算速度取決於請了多麼厲害的教授。教授處理複雜任務的能力是碾壓小學生的,但是對於沒那麼複雜的任務,還是頂不住人多。當然現在的GPU也能做一些稍微複雜的工作了,相當於升級成初中生高中生的水平。但還需要CPU來把資料喂到嘴邊才能開始幹活,究竟還是靠CPU來管的。

  3、就目前的計算機架構,GPU只能稱作是小眾。GPU作為後來者,出現的太晚了,計算機架構已經定型,不太可能撼動 Intel 的霸主地位,而且Intel 一定會藉著先天優勢打壓其他競爭對手。 最近bitcoin被媒體炒作的太過了,出現在了公眾的視野中。媒體寫新聞的那群人只要是寫點和技術沾邊的文章,就能暴露他們的無知,倒黴的還是無辜的群眾。

  筆者簡單提一下為什麼GPU只能算作是小眾。在計算機上執行的程式從效能的角度來說大致可分為三類:(1) I/O intensive; (2) Memory intensive 以及 (3) Compute-intensive。

  (1)I/O intensive的程式其效能瓶頸是I/O,也就是說程式執行的大部分時間花在了硬碟讀寫/網路通訊上,而I/O處在計算機體系結構金字塔的最底層,速度非常慢。最近炒的很火的big data 討論的就是這一類應用程式。幾百TB 甚至到PB級別的資料往哪擱,只能放在硬碟上。一臺機器容量太小CPU太少怎麼辦,搞幾百臺甚至上千臺機器用網線連起來分佈處理。所以這塊全是I/O, 現在大的網際網路公司不多搞幾個上千節點的叢集肯定撐不住。

  (2)Memory intensive的程式其效能瓶頸在記憶體訪問,程式中有大量的隨機訪問記憶體的操作,但是基本沒有I/O, 這類程式已經比第一類程式快一個數量級了,但是和暫存器的速度還是沒法比。目前大部分應用程式都屬於這類。個人電腦裡裝的的各種軟體基本就是這類,如果有點I/O, 立刻就會非常得卡。

以上提到的這兩類程式的應用最廣泛,涵蓋了大部分有用的計算機軟體,但遺憾的是GPU在這兩塊毫無用處, GPU只有在計算密集型的程式有些作用。I/O是瓶頸的程式,花在計算的時間可以忽略不計,再怎麼用GPU加速也沒用。 含有大量記憶體隨機訪問的程式也不適合在GPU上執行,大量的隨機訪問甚至可以使GPU的行為由並行變為序列。

  什麼型別的程式適合在GPU上執行?

  (1)計算密集型的程式。所謂計算密集型(Compute-intensive)的程式,就是其大部分執行時間花在了暫存器運算上,暫存器的速度和處理器的速度相當,從暫存器讀寫資料幾乎沒有延時。可以做一下對比,讀記憶體的延遲大概是幾百個時鐘週期;讀硬碟的速度就不說了,即便是SSD, 也實在是太慢了。

  (2)易於並行的程式。GPU其實是一種SIMD(Single Instruction Multiple Data)架構, 他有成百上千個核,每一個核在同一時間最好能做同樣的事情。

  滿足以上兩點,就可以用GPU做運算了。 不過你還得先用CUDA或者Open CL 把能在GPU上執行的程式寫出來, 這也是很麻煩的,寫一下就知道了。 而且GPU的架構比較特殊,要想寫出高效率的程式,要花很多很多時間。筆者想說寫GPU程式是一件很蛋疼的事情。

  GPU在某些地方很有用,但應用面比較窄,遠遠沒有某公司聲稱的那麼有用。當今還是Intel的天下, 現在計算機的速度已經很快了,計算其實已經不是什麼大問題。I/O才是最需要解決的問題。 記得曾經看過N家的GTC峰會,黃某人吹得神乎其神,連筆者都被感動了,多少多少T FLOPS的計算速度。 程式執行時間從100 秒 變成 1秒 其實沒多重要,你倒杯水的功夫就100秒了。執行時間從100天縮短到1天才是大貢獻。 前者就是GPU做的事情,後者才是我們真正需要的。