GPU的工作原理
GPU的起源可以追溯到個(gè)人電腦開始普及的80年代咆课,此時(shí)用戶開始有了游戲的需求厅须。為了更好的用戶體驗(yàn)枉氮,各游戲公司紛紛推出3D游戲碰纬。而圖形渲染在3D游戲中起到至關(guān)重要的作用允粤,因此GPU應(yīng)運(yùn)而生崭倘。GPU的產(chǎn)生是為了在計(jì)算機(jī)屏幕上更快地、顯示更多的特效效果类垫。
例如司光,在設(shè)計(jì)一個(gè)游戲人物的時(shí)候,我們希望他的膚色悉患、頭發(fā)能夠盡可能的逼真飘庄。這樣的效果在80年代的時(shí)候還做不到,那個(gè)時(shí)候顯示效果還很粗糙购撼。但是在最近的電影《魔幻森林》里面跪削,除了主角小男孩是真實(shí)的,其余動(dòng)物以及布景都是計(jì)算機(jī)生成的迂求。
可以說現(xiàn)在的圖像處理技術(shù)已經(jīng)能夠達(dá)到很好的效果了碾盐,但是還有很大的發(fā)展空間。因?yàn)槿搜蹖ι实母兄軌蜻_(dá)到浮點(diǎn)數(shù)級揩局,而不是指數(shù)級毫玖,成像能力極高,所以將來可能還需要更加逼真的顯存效果凌盯。
又比如游戲付枫,游戲的場景是動(dòng)態(tài)的,人物每向前走一步驰怎,就需要生成新的場景阐滩。這個(gè)場景通過實(shí)時(shí)渲染得來。通常情況下像素點(diǎn)的渲染是按照并行的方式進(jìn)行處理的县忌,所以GPU天生擁有很多很小的內(nèi)核來并行處理像素點(diǎn)掂榔。那么GPU的工作原理如何?它是如何產(chǎn)生圖像的呢症杏?
GPU做圖形處理的時(shí)候装获,是以圖形流水線(Graphics pipeline )的模式工作的。GPU從CPU那里得到很多的三角網(wǎng)格(如下圖所示)厉颤,這些三角網(wǎng)格被用來近似地表示物體的曲面穴豫。
比如,現(xiàn)在我們要顯示一個(gè)拳頭逼友,因?yàn)樵谟?jì)算機(jī)上很難表征任意曲面精肃,因此計(jì)算機(jī)會(huì)將這個(gè)拳頭切成一個(gè)三角網(wǎng)絡(luò)潘鲫,曲率比較小的地方用相對大一些的三角形,曲率比較大的地方就用小一點(diǎn)的三角形肋杖。這些三角形在空間中存在著某種鄰接關(guān)系溉仑。 只要對三角網(wǎng)絡(luò)的劃分足夠細(xì),就可以模擬出這個(gè)拳頭的形狀状植。
GPU從CPU那里得到這個(gè)三角網(wǎng)絡(luò)之后浊竟,簡單來說會(huì)進(jìn)行兩個(gè)步驟的處理:
第一步:Vertex級的處理
Vertex級的處理為頂點(diǎn)級的處理:
取三角網(wǎng)格中的頂點(diǎn)進(jìn)行光照處理。對頂點(diǎn)進(jìn)行光照處理后津畸,頂點(diǎn)與定點(diǎn)之間會(huì)互相產(chǎn)生影響振定。
對每一個(gè)三角形,做從三維空間到二維平面上的投影肉拓。
頂點(diǎn)級處理之后后频,三維空間里的物體就被映射到二維平面上了。
第二步: Fragment級的處理
投影到二維平面上之后暖途,這個(gè)拳頭依然是由很多鄰接三角形所表征的卑惜,我們需要將這些三角形轉(zhuǎn)化為像素,最后要顯示在屏幕上的是一個(gè)一個(gè)的像素點(diǎn)驻售。
首先露久,我們將每一個(gè)三角形用一組Fragment取代,F(xiàn)ragment和像素大小相等欺栗,你可以把Fragment理解成像素的草稿毫痕。
接下來,我們要對Fragment進(jìn)行渲染迟几,渲染涉及到這一組Fragment的顏色消请、光照、材質(zhì)等等类腮。比如杯子可能是陶瓷材質(zhì)臊泰、桌子可能是木頭材質(zhì)。材質(zhì)是提前確定好的存哲,但是光照是實(shí)時(shí)的因宇,在陽光下和陰影中七婴,同樣材質(zhì)的物體表現(xiàn)出的狀態(tài)也是不同的祟偷。這個(gè)時(shí)候,我們需要用到一個(gè)渲染公式來計(jì)算這一組像素點(diǎn)的顏色打厘。
最后修肠,將這些Fragment的前后順序進(jìn)行排列,因?yàn)橛行〧ragment是會(huì)被遮擋的户盯,將排在最前面的Fragment選出來嵌施,就得到了最后要顯示在計(jì)算機(jī)屏幕上的像素饲化。
當(dāng)然剛才提到的處理過程是經(jīng)過簡化的,實(shí)際情況是非常復(fù)雜的吗伤。比如說水的效果吃靠,斯坦福就有學(xué)者專門研究如何仿真水的效果,涉及到流體方程足淆,是一個(gè)交叉學(xué)科巢块;又比如頭發(fā),比如動(dòng)物的皮毛巧号,比如人物穿了一件毛衣族奢,在走路的時(shí)候會(huì)有什么樣的效果,這些都是很復(fù)雜的丹鸿。
從GPU到GPGPU
到2004年左右越走,因?yàn)椴⑿械木壒剩珿PU的單核計(jì)算能力開始超過CPU靠欢。這里的計(jì)算能力指的是峰值能力廊敌。如何計(jì)算峰值能力?最簡單的辦法就是门怪,讓CPU和GPU同時(shí)做1+1的運(yùn)算庭敦,比較他們分別一秒鐘計(jì)算的次數(shù)。
此時(shí)GPU的計(jì)算能力開始超過CPU薪缆,這引起了科學(xué)家們的注意秧廉,科學(xué)計(jì)算主要追求峰值的計(jì)算能力。其實(shí)沒有任何應(yīng)用能夠達(dá)到峰值拣帽,但是有些應(yīng)用會(huì)接近峰值疼电,比如矩陣計(jì)算的的速度可以達(dá)到峰值的70%到80%。有些科學(xué)家研究大氣减拭、大海蔽豺,這樣的學(xué)科永遠(yuǎn)需要更強(qiáng)大的計(jì)算能力來計(jì)算龐大的數(shù)據(jù),這個(gè)時(shí)候GPU就派上用場了拧粪。在最近很熱的機(jī)器學(xué)習(xí)中修陡,深度神經(jīng)網(wǎng)絡(luò)模型中需要做大量的矩陣計(jì)算,GPU正好很擅長可霎,因此又火了一把魄鸦。
但是傳統(tǒng)的GPU是用來做圖形計(jì)算的,所用的編程模型是OpenGL癣朗。如果想用GPU做通用的計(jì)算拾因,就要有更通用的編程工具。為此,NVIDIA推出了一種計(jì)算架構(gòu)绢记,叫CUDA(Compute Unified Device Architecture)扁达,又稱統(tǒng)一計(jì)算架構(gòu)。CUDA上有很多工具可以用來為通用計(jì)算編程蠢熄。
下圖為CUDA生態(tài)系統(tǒng)跪解,截圖自NVIDIA官網(wǎng)。
在被用做通用計(jì)算的初期签孔,GPU的內(nèi)部結(jié)構(gòu)還是非常不規(guī)范的惠遏。上文說到,為了顯示圖像骏啰,GPU會(huì)進(jìn)行兩個(gè)步驟的處理节吮。因此GPU內(nèi)部也存在兩種處理器,Vertex級處理器以及Fragment級處理器判耕。 除了上述兩種處理器之外透绩,還有一些像素級的處理單元。這些處理器壁熄、處理單元都放在一個(gè)芯片上帚豪,不同的處理單元采用不同的程序編程。由于編程相對容易草丧,最初進(jìn)行科學(xué)計(jì)算的時(shí)候狸臣,普遍用的是Fragment級處理器。但這種策略帶來的問題是昌执,Vertex級處理器以及其它處理單元沒有被有效利用烛亦。
到2008年的時(shí)候,NVIDIA在GPU的芯片設(shè)計(jì)方面做出了很大的改進(jìn)懂拾,設(shè)計(jì)出了統(tǒng)一處理器(Unified Processor )煤禽。Vertex級的處理和Fragment級的處理都可以在統(tǒng)一處理器上實(shí)現(xiàn),大大提高了通用計(jì)算時(shí)的資源利用率岖赋。
除此之外檬果,為了支持通用計(jì)算,GPU還增加了緩存唐断。緩存的作用是為了平衡處理器與存儲(chǔ)器之間速度的差異选脊。做圖形計(jì)算的時(shí)候,GPU不需要緩存脸甘,因?yàn)閳D形計(jì)算的存儲(chǔ)訪問完全是可預(yù)期的恳啥。在刷新屏幕的時(shí)候,一定是從左上角的第一個(gè)像素開始逐行刷新斤程。而且每一個(gè)像素點(diǎn)刷新結(jié)束后角寸,不需要再進(jìn)行訪問菩混。但是通用計(jì)算不同忿墅,為了適應(yīng)通用計(jì)算扁藕,GPU有了緩存,而且緩存越來越大疚脐,到現(xiàn)在已經(jīng)能夠達(dá)到幾兆的量級亿柑。此前GPU和CPU的一個(gè)本質(zhì)的區(qū)別,就是CPU有緩存而GPU沒有棍弄,現(xiàn)在這個(gè)區(qū)別也不大了望薄。
有了這些改進(jìn)之后,現(xiàn)在GPU的運(yùn)算能力普遍已經(jīng)達(dá)到3T Flops左右呼畸,即每秒鐘能夠進(jìn)行3萬億次浮點(diǎn)運(yùn)算痕支。CPU的運(yùn)算能力可能是GPU的幾十分之一,到一百分之一蛮原。但是卧须,當(dāng)談到GPU能否吸取CPU的優(yōu)點(diǎn),進(jìn)而替代CPU的時(shí)候儒陨,鄧教授是持否定態(tài)度的花嘶。原因在于CPU和GPU的設(shè)計(jì)思想不同,CPU天生就被設(shè)計(jì)成一個(gè)全面手蹦漠,能夠處理非常復(fù)雜的任務(wù)椭员。比如用Word編輯文檔的過程涉及到的字處理,其控制流程非常復(fù)雜笛园,但是計(jì)算量不是很大隘击。
GPU被設(shè)計(jì)用來完成很清晰的任務(wù),比如矩陣的計(jì)算研铆。當(dāng)計(jì)算100萬行和100萬列的矩陣相乘的時(shí)候闸度,我們可以將計(jì)算過程很清晰地劃分出很多并行的模塊,類似這種任務(wù)GPU很擅長蚜印。
CPU的設(shè)計(jì)在于幾個(gè)超強(qiáng)的核莺禁,每一個(gè)核能夠單獨(dú)處理很復(fù)雜的事情。而GPU的設(shè)計(jì)側(cè)重于幾千個(gè)很小很弱的核窄赋,每個(gè)核做很小很弱的事情哟冬。如果強(qiáng)迫GPU去吸取CPU的優(yōu)點(diǎn),那它也要有很復(fù)雜的核忆绰,因此就很難保證核的數(shù)量浩峡。但現(xiàn)在也有一些公司,比如Intel错敢、AMD翰灾,在做融合處理器缕粹。在同一個(gè)芯片上既有CPU內(nèi)核,也有若干個(gè)GPU內(nèi)核纸淮,但目前還做不到讓CPU和GPU使用同一種內(nèi)核平斩。
GPU及CPU行業(yè)的發(fā)展歷程
雖然GPU在80年代就已經(jīng)出現(xiàn),但是直到90年代才開始有GPU的叫法咽块。說起GPU绘面,一定要談NVIDIA。NVIDIA于1993年成立侈沪,當(dāng)時(shí)的GPU市場呈雙雄并立的局面揭璃,一家是NVIDIA,另一家是ATI亭罪。這兩家公司的創(chuàng)始人都是華人瘦馍,NVIDIA的創(chuàng)始人黃仁勛從小在美國長大,ATI的創(chuàng)始人來自臺(tái)灣应役。
當(dāng)時(shí)NVIDIA和ATI的競爭非常激烈情组,在摩爾定律尚且成立的年代,電路規(guī)模每18個(gè)月翻一番扛吞、性能提高一倍呻惕。然而當(dāng)時(shí)NVIDIA和ATI每半年發(fā)布一款新產(chǎn)品,其成長速度遠(yuǎn)高于摩爾定律滥比,這也切實(shí)促進(jìn)了GPU行業(yè)的發(fā)展亚脆。
雙雄并立的局面持續(xù)到2000年代初期,ATI在某些動(dòng)作方面略顯遲鈍盲泛,最終因資金周轉(zhuǎn)問題被AMD收購濒持。
AMD和Intel并稱CPU雙雄。AMD多年來一直被Intel打壓寺滚,或許因?yàn)榉磯艛喾ǖ脑蚋逃琁ntel一直保留著這個(gè)競爭對手,并且時(shí)刻小心村视,不讓自己被AMD超過官套。當(dāng)時(shí)AMD為了和Intel競爭,拓展市場蚁孔,收購了AMD奶赔。所以現(xiàn)在GPU行業(yè)內(nèi),NVDIA的主要競爭對手已經(jīng)變成AMD杠氢。大部分時(shí)候NVIDIA比AMD在市場份額上略強(qiáng)一些站刑。
Intel也生產(chǎn)GPU,但主要生產(chǎn)比較低端的GPU鼻百,比如筆記本自帶的GPU一般出自Intel绞旅。若你是游戲愛好者摆尝,自己另行配置的顯卡上的GPU一般出自NVIDIA或者AMD。
談及中國的芯片市場因悲,鄧教授表示:“我們中國也有自己的處理器堕汞,中國科學(xué)院研制的,叫龍芯囤捻。但是龍芯真正所占的市場份額很少臼朗。中國的半導(dǎo)體行業(yè)進(jìn)步很快邻寿,但仍然不能在主戰(zhàn)場和國外的公司競爭蝎土。國內(nèi)目前還有一些針對移動(dòng)應(yīng)用的圖形處理器公司,一般規(guī)模很小绣否。不過我們還是應(yīng)該抱有平常心誊涯,畢竟全世界只有一家Intel、一家AMD蒜撮、一家NVIDIA暴构。”