搞懂GPU為什么比CPU“快”
近幾年深度學(xué)習(xí)在各領(lǐng)域大顯神威,而”GPU加速"也得到了越來越多的篇幅,似乎任何程序只要放到GPU上運行那速度就是杠杠的。GPU代替CPU計算已成了大勢所趨?我先告訴你結(jié)論”那是不可能滴“,然后咱們再來說說”GPU為什么比CPU快“。
圖形處理,GPU的源起
GPU是顯卡的計算單元,就好比CPU是電腦的計算核心,有時我們直接就把GPU稱為顯卡。顯而易見,GPU從誕生之初就是用來處理圖像的。下面我們講一個簡單的例子來說明下為什么圖像處理需要用到GPU,而CPU的缺點是什么。
我們講一個畫面”立體“,其實講的是畫面中對于光影的運用,下圖就是一個簡單的”圓“。

當(dāng)我們給這個圓加上”光影“之后,它就變成了一個球。我們說球要比圓立體的多,這就是光影的作用。

光影的原理很簡單,你需要想象一個遠處的”光“,然后在畫面上模擬出光照在物體上的明暗變化,計算機中這些明暗變化都是通過”計算“得到的。編程人員只需要輸入光源的距離、亮度、被照體的位置,然后通過逐步計算、光影疊加就能得到圖像中每一個像素應(yīng)該顯示什么顏色、什么亮度,一個立體畫面也就躍然紙上了。
那么現(xiàn)在問題來了,假設(shè)屏幕分辨率為1920*1080,即2073600(207.36萬)個像素,游戲中每個像素都需要根據(jù)光影參數(shù)來計算顯示的顏色和明暗。假設(shè)一個常見的Intel I5 CPU主頻為3.2GHz,即最多每秒可做32億次運算。但這里的一次運算只是做了一次簡單的二進制加減法或數(shù)據(jù)讀取,一個像素的光影計算我們可以假設(shè)需要100次運算(關(guān)于CPU的運算原理可以看這篇文章https://www.mianbaoban.cn/blog/3887969-407226.html),即CPU一秒約處理3200萬次像素運算,大概15張圖片,用專業(yè)點的說法,這個游戲流暢度大概是每秒15幀的樣子。
可見使用CPU全力進行圖形運算是有點吃力的,更何況CPU還要處理很多鍵盤指令、游戲后臺計算等等。是CPU還不夠快嗎?假設(shè)現(xiàn)在速度翻倍,即每秒64億次運算似乎也是不夠的。其實CPU面臨的主要問題是,雖然每一次光影計算都非常簡單,但經(jīng)不住像素太多啦,還都得排隊一個一個做。然后工程師們想到“其實任何一個像素的計算與其他像素的計算結(jié)果關(guān)系不大”,那為啥不多整幾個計算核心“并行”計算呢,于是GPU就出現(xiàn)了。
一個典型的顯卡GTX1060,主頻是1.5GHz大概是Intel I5一半左右,但是它具備1280個計算核心。每個計算核心每秒可做15億次運算,1280個核心每秒就是19200億次運算,那一秒可以處理192億次像素計算,大概925張圖片,是CPU計算能力的61倍!但GPU的特性只能應(yīng)用于圖形計算這種可以并行的任務(wù),若是做普通的串行任務(wù)其速度遠遠不如CPU。
核心越多越好?
通過前面的敘述我們都知道了GPU速度“快于”CPU的奧秘在于它有很多的“核”,那能不能這樣,我們給CPU也裝上1000多個核,那速度豈不是快到飛起?答案是“不得行”。由于制造工藝的原因,CPU內(nèi)核越多其頻率也就越低。其實很容易想到,同步10個人的動作和同步1000個人的動作其難度肯定是不一樣的。其次,電腦中大部分的運算都是串行的,即下一個運算要等到上一個運算完畢才能繼續(xù),這時候單次運算的速度才是最重要的。
所以相當(dāng)長時間以內(nèi),CPU+GPU的搭配才是最佳方案。

?GPU與并行計算
深度學(xué)習(xí)與圖形處理有一些相通的地方,它需要大量的數(shù)據(jù)來“訓(xùn)練”模型。比如一個貓圖識別AI,你需要提供數(shù)以萬計的貓圖供其“學(xué)習(xí)”。而每一張貓圖的學(xué)習(xí)又與其他貓圖沒有先后關(guān)系,即你可以同時并行100、1000張貓圖的學(xué)習(xí),所以GPU在深度學(xué)習(xí)領(lǐng)域大放異彩。