CPU與GPU區(qū)別 通俗易懂

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

  CPU和GPU之所以大不相同,是由于其設(shè)計(jì)目標(biāo)的不同,它們分別針對了兩種不同的應(yīng)用場景。CPU需要很強(qiáng)的通用性來處理各種不同的數(shù)據(jù)類型,同時又要邏輯判斷又會引入大量的分支跳轉(zhuǎn)和中斷的處理。這些都使得CPU的內(nèi)部結(jié)構(gòu)異常復(fù)雜。而GPU面對的則是類型高度統(tǒng)一的、相互無依賴的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈的計(jì)算環(huán)境。

  于是CPU和GPU就呈現(xiàn)出非常不同的架構(gòu)(示意圖):

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

  GPU采用了數(shù)量眾多的計(jì)算單元和超長的流水線,但只有非常簡單的控制邏輯并省去了Cache。而CPU不僅被Cache占據(jù)了大量空間,而且還有有復(fù)雜的控制邏輯和諸多優(yōu)化電路,相比之下計(jì)算能力只是CPU很小的一部分。

  所以與CPU擅長邏輯控制和通用類型數(shù)據(jù)運(yùn)算不同,GPU擅長的是大規(guī)模并發(fā)計(jì)算,這也正是密碼破解等所需要的。所以GPU除了圖像處理,也越來越多的參與到計(jì)算當(dāng)中來。

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

  想要理解GPU與CPU的區(qū)別,需要先明白GPU被設(shè)計(jì)用來做什么?,F(xiàn)代的GPU功能涵蓋了圖形顯示的方方面面,我們只取一個最簡單的方向作為例子。

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


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

  總而言之,CPU和GPU因?yàn)樽畛跤脕硖幚淼娜蝿?wù)就不同,所以設(shè)計(jì)上有不小的區(qū)別。而某些任務(wù)和GPU最初用來解決的問題比較相似,所以用GPU來算了。GPU的運(yùn)算速度取決于雇了多少小學(xué)生,CPU的運(yùn)算速度取決于請了多么厲害的教授。教授處理復(fù)雜任務(wù)的能力是碾壓小學(xué)生的,但是對于沒那么復(fù)雜的任務(wù),還是頂不住人多。當(dāng)然現(xiàn)在的GPU也能做一些稍微復(fù)雜的工作了,相當(dāng)于升級成初中生高中生的水平。但還需要CPU來把數(shù)據(jù)喂到嘴邊才能開始干活,究竟還是靠CPU來管的。

  3、就目前的計(jì)算機(jī)架構(gòu),GPU只能稱作是小眾。GPU作為后來者,出現(xiàn)的太晚了,計(jì)算機(jī)架構(gòu)已經(jīng)定型,不太可能撼動 Intel 的霸主地位,而且Intel 一定會借著先天優(yōu)勢打壓其他競爭對手。 最近bitcoin被媒體炒作的太過了,出現(xiàn)在了公眾的視野中。媒體寫新聞的那群人只要是寫點(diǎn)和技術(shù)沾邊的文章,就能暴露他們的無知,倒霉的還是無辜的群眾。

  筆者簡單提一下為什么GPU只能算作是小眾。在計(jì)算機(jī)上運(yùn)行的程序從性能的角度來說大致可分為三類:(1) I/O intensive; (2) Memory intensive 以及 (3) Compute-intensive。

  (1)I/O intensive的程序其性能瓶頸是I/O,也就是說程序運(yùn)行的大部分時間花在了硬盤讀寫/網(wǎng)絡(luò)通信上,而I/O處在計(jì)算機(jī)體系結(jié)構(gòu)金字塔的最底層,速度非常慢。最近炒的很火的big data 討論的就是這一類應(yīng)用程序。幾百TB 甚至到PB級別的數(shù)據(jù)往哪擱,只能放在硬盤上。一臺機(jī)器容量太小CPU太少怎么辦,搞幾百臺甚至上千臺機(jī)器用網(wǎng)線連起來分布處理。所以這塊全是I/O, 現(xiàn)在大的互聯(lián)網(wǎng)公司不多搞幾個上千節(jié)點(diǎn)的集群肯定撐不住。

  (2)Memory intensive的程序其性能瓶頸在內(nèi)存訪問,程序中有大量的隨機(jī)訪問內(nèi)存的操作,但是基本沒有I/O, 這類程序已經(jīng)比第一類程序快一個數(shù)量級了,但是和寄存器的速度還是沒法比。目前大部分應(yīng)用程序都屬于這類。個人電腦里裝的的各種軟件基本就是這類,如果有點(diǎn)I/O, 立刻就會非常得卡。

以上提到的這兩類程序的應(yīng)用最廣泛,涵蓋了大部分有用的計(jì)算機(jī)軟件,但遺憾的是GPU在這兩塊毫無用處, GPU只有在計(jì)算密集型的程序有些作用。I/O是瓶頸的程序,花在計(jì)算的時間可以忽略不計(jì),再怎么用GPU加速也沒用。 含有大量內(nèi)存隨機(jī)訪問的程序也不適合在GPU上執(zhí)行,大量的隨機(jī)訪問甚至可以使GPU的行為由并行變?yōu)榇小?/p>

  什么類型的程序適合在GPU上運(yùn)行?

 ?。?)計(jì)算密集型的程序。所謂計(jì)算密集型(Compute-intensive)的程序,就是其大部分運(yùn)行時間花在了寄存器運(yùn)算上,寄存器的速度和處理器的速度相當(dāng),從寄存器讀寫數(shù)據(jù)幾乎沒有延時。可以做一下對比,讀內(nèi)存的延遲大概是幾百個時鐘周期;讀硬盤的速度就不說了,即便是SSD, 也實(shí)在是太慢了。

 ?。?)易于并行的程序。GPU其實(shí)是一種SIMD(Single Instruction Multiple Data)架構(gòu), 他有成百上千個核,每一個核在同一時間最好能做同樣的事情。

  滿足以上兩點(diǎn),就可以用GPU做運(yùn)算了。 不過你還得先用CUDA或者Open CL 把能在GPU上運(yùn)行的程序?qū)懗鰜恚?這也是很麻煩的,寫一下就知道了。 而且GPU的架構(gòu)比較特殊,要想寫出高效率的程序,要花很多很多時間。筆者想說寫GPU程序是一件很蛋疼的事情。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容