CPU與GPU區(qū)別大揭秘

有網(wǎng)友在網(wǎng)上提問(wèn):“為什么現(xiàn)在更多需要用的是 GPU 而不是 CPU,比如挖礦甚至破解密碼? ”以下是比較準(zhǔn)確靠譜的回答:
  1、現(xiàn)在更多被需要的依然是CPU,只是GPU在大規(guī)模并發(fā)計(jì)算中體現(xiàn)出其一技之長(zhǎng)所以應(yīng)用范圍逐漸變得廣泛,并成為近些年的熱點(diǎn)話(huà)題之一。
  為什么二者會(huì)有如此的不同呢?首先要從CPU和GPU的區(qū)別說(shuō)起。
  CPU和GPU之所以大不相同,是由于其設(shè)計(jì)目標(biāo)的不同,它們分別針對(duì)了兩種不同的應(yīng)用場(chǎng)景。CPU需要很強(qiáng)的通用性來(lái)處理各種不同的數(shù)據(jù)類(lèi)型,同時(shí)又要邏輯判斷又會(huì)引入大量的分支跳轉(zhuǎn)和中斷的處理。這些都使得CPU的內(nèi)部結(jié)構(gòu)異常復(fù)雜。而GPU面對(duì)的則是類(lèi)型高度統(tǒng)一的、相互無(wú)依賴(lài)的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈的計(jì)算環(huán)境。
  于是CPU和GPU就呈現(xiàn)出非常不同的架構(gòu)(示意圖):


CPU與GPU區(qū)別大揭秘

圖片來(lái)自nVidia CUDA文檔。其中綠色的是計(jì)算單元,橙紅色的是存儲(chǔ)單元,橙黃色的是控制單元。
  GPU采用了數(shù)量眾多的計(jì)算單元和超長(zhǎng)的流水線(xiàn),但只有非常簡(jiǎn)單的控制邏輯并省去了Cache。而CPU不僅被Cache占據(jù)了大量空間,而且還有有復(fù)雜的控制邏輯和諸多優(yōu)化電路,相比之下計(jì)算能力只是CPU很小的一部分。
  所以與CPU擅長(zhǎng)邏輯控制和通用類(lèi)型數(shù)據(jù)運(yùn)算不同,GPU擅長(zhǎng)的是大規(guī)模并發(fā)計(jì)算,這也正是密碼破解等所需要的。所以GPU除了圖像處理,也越來(lái)越多的參與到計(jì)算當(dāng)中來(lái)。
  2、很久以前,大概2000年那時(shí)候,顯卡還被叫做圖形加速卡。一般叫做加速卡的都不是什么核心組件,和現(xiàn)在蘋(píng)果使用的M7協(xié)處理器地位差不多。這種東西就是有了更好,沒(méi)有也不是不行,只要有個(gè)基本的圖形輸出就可以接顯示器了。在那之前,只有一些高端工作站和家用游戲機(jī)上才能見(jiàn)到這種單獨(dú)的圖形處理器。后來(lái)隨著PC的普及,游戲的發(fā)展和Windows這樣的市場(chǎng)霸主出現(xiàn),簡(jiǎn)化了圖形硬件廠(chǎng)商的工作量,圖形處理器,或者說(shuō)顯卡才逐漸普及起來(lái)。
  想要理解GPU與CPU的區(qū)別,需要先明白GPU被設(shè)計(jì)用來(lái)做什么?,F(xiàn)代的GPU功能涵蓋了圖形顯示的方方面面,我們只取一個(gè)最簡(jiǎn)單的方向作為例子。
  大家可能都見(jiàn)過(guò)上面這張圖,這是老版本Direct X帶的一項(xiàng)測(cè)試,就是一個(gè)旋轉(zhuǎn)的立方體。顯示出一個(gè)這樣的立方體要經(jīng)過(guò)好多步驟,我們先考慮簡(jiǎn)單的,想象一下他是個(gè)線(xiàn)框,沒(méi)有側(cè)面的“X”圖像。再簡(jiǎn)化一點(diǎn),連線(xiàn)都沒(méi)有,就是八個(gè)點(diǎn)(立方體有八個(gè)頂點(diǎn)的)。那么問(wèn)題就簡(jiǎn)化成如何讓這八個(gè)點(diǎn)轉(zhuǎn)起來(lái)。首先,你在創(chuàng)造這個(gè)立方體的時(shí)候,肯定有八個(gè)頂點(diǎn)的坐標(biāo),坐標(biāo)都是用向量表示的,因而至少也是個(gè)三維向量。然后“旋轉(zhuǎn)”這個(gè)變換,在線(xiàn)性代數(shù)里面是用一個(gè)矩陣來(lái)表示的。向量旋轉(zhuǎn),是用向量乘以這個(gè)矩陣。把這八個(gè)點(diǎn)轉(zhuǎn)一下,就是進(jìn)行八次向量與矩陣的乘法而已。這種計(jì)算并不復(fù)雜,拆開(kāi)來(lái)看無(wú)非就是幾次乘積加一起,就是計(jì)算量比較大。八個(gè)點(diǎn)就要算八次,2000個(gè)點(diǎn)就要算2000次。這就是GPU工作的一部分,頂點(diǎn)變換,這也是最簡(jiǎn)單的一部分。剩下還有一大堆比這更麻煩的就不說(shuō)了。

GPU的工作大部分就是這樣,計(jì)算量大,但沒(méi)什么技術(shù)含量,而且要重復(fù)很多很多次。就像你有個(gè)工作需要算幾億次一百以?xún)?nèi)加減乘除一樣,最好的辦法就是雇上幾十個(gè)小學(xué)生一起算,一人算一部分,反正這些計(jì)算也沒(méi)什么技術(shù)含量,純粹體力活而已。而CPU就像老教授,積分微分都會(huì)算,就是工資高,一個(gè)老教授資頂二十個(gè)小學(xué)生,你要是富士康你雇哪個(gè)?GPU就是這樣,用很多簡(jiǎn)單的計(jì)算單元去完成大量的計(jì)算任務(wù),純粹的人海戰(zhàn)術(shù)。這種策略基于一個(gè)前提,就是小學(xué)生A和小學(xué)生B的工作沒(méi)有什么依賴(lài)性,是互相獨(dú)立的。很多涉及到大量計(jì)算的問(wèn)題基本都有這種特性,比如你說(shuō)的破解密碼,挖礦和很多圖形學(xué)的計(jì)算。這些計(jì)算可以分解為多個(gè)相同的簡(jiǎn)單小任務(wù),每個(gè)任務(wù)就可以分給一個(gè)小學(xué)生去做。但還有一些任務(wù)涉及到“流”的問(wèn)題。比如你去相親,雙方看著順眼才能繼續(xù)發(fā)展。總不能你這邊還沒(méi)見(jiàn)面呢,那邊找人把證都給領(lǐng)了。這種比較復(fù)雜的問(wèn)題都是CPU來(lái)做的。
  總而言之,CPU和GPU因?yàn)樽畛跤脕?lái)處理的任務(wù)就不同,所以設(shè)計(jì)上有不小的區(qū)別。而某些任務(wù)和GPU最初用來(lái)解決的問(wèn)題比較相似,所以用GPU來(lái)算了。GPU的運(yùn)算速度取決于雇了多少小學(xué)生,CPU的運(yùn)算速度取決于請(qǐng)了多么厲害的教授。教授處理復(fù)雜任務(wù)的能力是碾壓小學(xué)生的,但是對(duì)于沒(méi)那么復(fù)雜的任務(wù),還是頂不住人多。當(dāng)然現(xiàn)在的GPU也能做一些稍微復(fù)雜的工作了,相當(dāng)于升級(jí)成初中生高中生的水平。但還需要CPU來(lái)把數(shù)據(jù)喂到嘴邊才能開(kāi)始干活,究竟還是靠CPU來(lái)管的。
  3、就目前的計(jì)算機(jī)架構(gòu),GPU只能稱(chēng)作是小眾。GPU作為后來(lái)者,出現(xiàn)的太晚了,計(jì)算機(jī)架構(gòu)已經(jīng)定型,不太可能撼動(dòng) Intel 的霸主地位,而且Intel 一定會(huì)借著先天優(yōu)勢(shì)打壓其他競(jìng)爭(zhēng)對(duì)手。 最近bitcoin被媒體炒作的太過(guò)了,出現(xiàn)在了公眾的視野中。媒體寫(xiě)新聞的那群人只要是寫(xiě)點(diǎn)和技術(shù)沾邊的文章,就能暴露他們的無(wú)知,倒霉的還是無(wú)辜的群眾。
  筆者簡(jiǎn)單提一下為什么GPU只能算作是小眾。在計(jì)算機(jī)上運(yùn)行的程序從性能的角度來(lái)說(shuō)大致可分為三類(lèi):(1) I/O intensive; (2) Memory intensive 以及 (3) Compute-intensive。
  (1)I/O intensive的程序其性能瓶頸是I/O,也就是說(shuō)程序運(yùn)行的大部分時(shí)間花在了硬盤(pán)讀寫(xiě)/網(wǎng)絡(luò)通信上,而I/O處在計(jì)算機(jī)體系結(jié)構(gòu)金字塔的最底層,速度非常慢。最近炒的很火的big data 討論的就是這一類(lèi)應(yīng)用程序。幾百TB 甚至到PB級(jí)別的數(shù)據(jù)往哪擱,只能放在硬盤(pán)上。一臺(tái)機(jī)器容量太小CPU太少怎么辦,搞幾百臺(tái)甚至上千臺(tái)機(jī)器用網(wǎng)線(xiàn)連起來(lái)分布處理。所以這塊全是I/O, 現(xiàn)在大的互聯(lián)網(wǎng)公司不多搞幾個(gè)上千節(jié)點(diǎn)的集群肯定撐不住。
  (2)Memory intensive的程序其性能瓶頸在內(nèi)存訪(fǎng)問(wèn),程序中有大量的隨機(jī)訪(fǎng)問(wèn)內(nèi)存的操作,但是基本沒(méi)有I/O, 這類(lèi)程序已經(jīng)比第一類(lèi)程序快一個(gè)數(shù)量級(jí)了,但是和寄存器的速度還是沒(méi)法比。目前大部分應(yīng)用程序都屬于這類(lèi)。個(gè)人電腦里裝的的各種軟件基本就是這類(lèi),如果有點(diǎn)I/O, 立刻就會(huì)非常得卡。
以上提到的這兩類(lèi)程序的應(yīng)用最廣泛,涵蓋了大部分有用的計(jì)算機(jī)軟件,但遺憾的是GPU在這兩塊毫無(wú)用處, GPU只有在計(jì)算密集型的程序有些作用。I/O是瓶頸的程序,花在計(jì)算的時(shí)間可以忽略不計(jì),再怎么用GPU加速也沒(méi)用。 含有大量?jī)?nèi)存隨機(jī)訪(fǎng)問(wèn)的程序也不適合在GPU上執(zhí)行,大量的隨機(jī)訪(fǎng)問(wèn)甚至可以使GPU的行為由并行變?yōu)榇小?br>   什么類(lèi)型的程序適合在GPU上運(yùn)行?
 ?。?)計(jì)算密集型的程序。所謂計(jì)算密集型(Compute-intensive)的程序,就是其大部分運(yùn)行時(shí)間花在了寄存器運(yùn)算上,寄存器的速度和處理器的速度相當(dāng),從寄存器讀寫(xiě)數(shù)據(jù)幾乎沒(méi)有延時(shí)??梢宰鲆幌聦?duì)比,讀內(nèi)存的延遲大概是幾百個(gè)時(shí)鐘周期;讀硬盤(pán)的速度就不說(shuō)了,即便是SSD, 也實(shí)在是太慢了。
  (2)易于并行的程序。GPU其實(shí)是一種SIMD(Single Instruction Multiple Data)架構(gòu), 他有成百上千個(gè)核,每一個(gè)核在同一時(shí)間最好能做同樣的事情。
  滿(mǎn)足以上兩點(diǎn),就可以用GPU做運(yùn)算了。 不過(guò)你還得先用CUDA或者Open CL 把能在GPU上運(yùn)行的程序?qū)懗鰜?lái), 這也是很麻煩的,寫(xiě)一下就知道了。 而且GPU的架構(gòu)比較特殊,要想寫(xiě)出高效率的程序,要花很多很多時(shí)間。筆者想說(shuō)寫(xiě)GPU程序是一件很蛋疼的事情。
  GPU在某些地方很有用,但應(yīng)用面比較窄,遠(yuǎn)遠(yuǎn)沒(méi)有某公司聲稱(chēng)的那么有用。當(dāng)今還是Intel的天下, 現(xiàn)在計(jì)算機(jī)的速度已經(jīng)很快了,計(jì)算其實(shí)已經(jīng)不是什么大問(wèn)題。I/O才是最需要解決的問(wèn)題。 記得曾經(jīng)看過(guò)N家的GTC峰會(huì),黃某人吹得神乎其神,連筆者都被感動(dòng)了,多少多少T FLOPS的計(jì)算速度。 程序運(yùn)行時(shí)間從100 秒 變成 1秒 其實(shí)沒(méi)多重要,你倒杯水的功夫就100秒了。運(yùn)行時(shí)間從100天縮短到1天才是大貢獻(xiàn)。 前者就是GPU做的事情,后者才是我們真正需要的。

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

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

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