李旻昊
摘 要:本文先介紹了CPU和GPU的相關(guān)知識(shí),包括他們的歷史、架構(gòu)、以及目前發(fā)展的現(xiàn)狀。然后來(lái)闡述兩者在使用上的區(qū)別以及使用場(chǎng)景的不同。最后也是本文的重點(diǎn),講述如何使用GPU來(lái)加快程序的運(yùn)算速度,尤其是在大數(shù)據(jù)的處理這一方面,并且介紹NVIDIA公司所推出的CUDA運(yùn)算平臺(tái)。
關(guān)鍵詞:CPU;GPU;大數(shù)據(jù)
中圖分類號(hào):TP338 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1671-2064(2017)09-0029-02
CPU與GPU是每一臺(tái)電腦中都必不可少的部件。簡(jiǎn)單來(lái)說(shuō),CPU就是一臺(tái)電腦中的“大腦”,能夠協(xié)調(diào)電腦中各個(gè)部件的運(yùn)作。相比之下,GPU就顯得低調(diào)了很多。它處于顯卡之中,是顯卡的“心臟”,并且在以往的概念中,GPU并沒(méi)有CPU那般地位重要。
CPU和GPU都遵循著摩爾定律,即當(dāng)價(jià)格不變時(shí),集成電路上可以容納的元器件的數(shù)目,約每隔18-24個(gè)月便會(huì)增加一倍,性能也將會(huì)增加一遍。我們不可否認(rèn)的是,即使科技不斷的進(jìn)步,可以容納的元器件的數(shù)目也會(huì)有一個(gè)上限。這時(shí),我們會(huì)用何種方式來(lái)提高性能呢?科學(xué)家們不停的探索這一方面的內(nèi)容,給出的答案的其中之一就是使用GPU編程。如何利用GPU來(lái)編程?它和CPU的區(qū)別在哪里?它適用于怎么樣的程序?能提高的性能有多少?這四個(gè)問(wèn)題就是本文想要闡述的。下面就讓我們一起進(jìn)入電子元器件的世界。
1 CPU(中央處理器)
下面先介紹一下CPU(中央處理器)相關(guān)的知識(shí)。包括指令集,物理結(jié)構(gòu),流水線架構(gòu),以及目前CPU發(fā)展的六個(gè)階段。
1.1 指令集
我們?nèi)粘J褂秒娔X的過(guò)程中可能會(huì)思考下面的一個(gè)問(wèn)題:為什么我雙擊了桌面上的一個(gè)圖標(biāo),程序就開(kāi)始運(yùn)行了?你也可能已經(jīng)猜到了答案:我們向電腦發(fā)出了一條命令。這條命令是什么,誰(shuí)處理這條命令,這個(gè)問(wèn)題就是我們這一節(jié)要弄明白的問(wèn)題。
當(dāng)我們雙擊了圖標(biāo)之后,就向計(jì)算機(jī)發(fā)出了一條命令。這條命令被CPU所接受,然后CPU開(kāi)始解析這條命令并且向計(jì)算機(jī)其他部件發(fā)出信號(hào),包括從硬盤(pán)取出相應(yīng)的程序,放到內(nèi)存中運(yùn)行。這就是一條指令帶給計(jì)算機(jī)的工作。如果還不能夠理解,也沒(méi)有關(guān)系,只需要知道我們給計(jì)算機(jī)發(fā)出的命令都可以轉(zhuǎn)換成指令的形式就足夠了。
當(dāng)然,計(jì)算機(jī)能夠接受的指令有很多很多,總體來(lái)說(shuō)分成兩大類:復(fù)雜指令集和精簡(jiǎn)指令集。
復(fù)雜指令集也稱CISC。在CISC微處理器中,指令是按照順序來(lái)執(zhí)行的,其優(yōu)點(diǎn)就是控制簡(jiǎn)單,但是因?yàn)橹荒軌蝽樞驁?zhí)行,因此它的運(yùn)行速度不盡如人意。我們現(xiàn)在使用的所有的Intel處理器都是CISC,也就是x86和x86-64架構(gòu)的。
精簡(jiǎn)指令集稱作RISC。John Cocke對(duì)CISC機(jī)進(jìn)行研究之后發(fā)現(xiàn),程序中出現(xiàn)頻率達(dá)到80%的指令只占指令集中所有指令的20%(這也是著名的28定律)。復(fù)雜的指令系統(tǒng)會(huì)增加微處理器的復(fù)雜頂,導(dǎo)致計(jì)算機(jī)運(yùn)行的速度降低。因此RISC誕生了,它的指令格式統(tǒng)一,種類比較少,尋址方式也簡(jiǎn)單了很多,自然處理速度也有了提高。目前在高檔的服務(wù)器中都采用了RISC指令集。
1.2 物理結(jié)構(gòu)
計(jì)算機(jī)之父馮·諾依曼曾經(jīng)提出過(guò)存儲(chǔ)程序原理,把程序本身當(dāng)作數(shù)據(jù)來(lái)對(duì)待,程序和該程序處理的數(shù)據(jù)用同樣的方式存儲(chǔ)。大致的思想如圖1所示。
可以看到,運(yùn)算器、控制器和內(nèi)存儲(chǔ)器是被放在CPU之中的,這也是目前CPU的物理結(jié)構(gòu)。運(yùn)算器也稱做運(yùn)算邏輯部件,可以執(zhí)行各種算術(shù)運(yùn)算操作和邏輯操作。內(nèi)存儲(chǔ)器包括寄存器和CPU緩存,用來(lái)保存指令執(zhí)行過(guò)程中臨時(shí)存放的寄存器操作數(shù)和中間操作結(jié)果。控制部件主要是對(duì)指令進(jìn)行翻譯,并且發(fā)出為完成每條指令所要執(zhí)行的各個(gè)操作的控制信號(hào)。
在CPU中,上述三個(gè)部件是必不可少的。當(dāng)然隨著技術(shù)的發(fā)展,目前CPU還有很多其他的部件,感興趣的讀者可以自行搜索相關(guān)資料。
1.3 流水線架構(gòu)
在說(shuō)流水線架構(gòu)之前,我們需要先弄清楚CPU的工作流程。CPU從存儲(chǔ)器中取出指令,放入指令寄存器,并且進(jìn)行譯碼。然后發(fā)出各種控制命令,執(zhí)行微操作,從而完成一條指令的執(zhí)行。詳細(xì)來(lái)說(shuō),主要分成下述四個(gè)步驟:
(1)提取。用程序計(jì)數(shù)器來(lái)指定存儲(chǔ)器的位置,然后從存儲(chǔ)器中檢索指令。
(2)解碼。根據(jù)我們提取到的指令來(lái)決定其執(zhí)行行為。根據(jù)CPU的指令集,指令會(huì)被拆解成有意義的片段。
(3)執(zhí)行。我們根據(jù)相應(yīng)的指令片段,來(lái)鏈接到各種CPU運(yùn)算部件,進(jìn)行相應(yīng)的操作。
(4)寫(xiě)回。最終,我們將在執(zhí)行階段得到的結(jié)果簡(jiǎn)單的寫(xiě)回。通常他會(huì)被寫(xiě)進(jìn)CPU內(nèi)部的寄存器中,也有可能會(huì)被寫(xiě)進(jìn)速度較慢但是容量較大的內(nèi)存中。這時(shí),一條指令已經(jīng)完成,程序計(jì)數(shù)器值會(huì)遞增,來(lái)提取下一條指令并且重復(fù)上述的過(guò)程。
這就是CPU的工作流程。在流水線架構(gòu)誕生之前,我們的指令都是一條完成后再接著另一條的,這樣做效率就會(huì)很低,因?yàn)椴⒉皇撬胁考紵o(wú)時(shí)無(wú)刻的在工作。比如,在執(zhí)行階段,指令存儲(chǔ)器就沒(méi)有辦法很好的利用起來(lái)。為了解決這樣的問(wèn)題,流水線架構(gòu)誕生了。簡(jiǎn)單來(lái)說(shuō),就是能夠充分利用每一個(gè)部件。在第n條指令解碼的時(shí)候,我們可以提前提取第n+1條指令。然后在第n條指令執(zhí)行之時(shí),CPU會(huì)去對(duì)第n+1條指令進(jìn)行解碼。詳細(xì)的流程如圖2所示。
有了流水線架構(gòu),CPU的工作效率大大提高。
1.4 發(fā)展的六個(gè)階段
CPU發(fā)展已經(jīng)有40多年的歷史了。我們通常將其分成六個(gè)階段。
(1)第一階段(1971年-1973年)。這是4位和8位低檔微處理器時(shí)代,代表產(chǎn)品是Intel4004處理器。
(2)第二階段(1974年-1977年)。這是8位中高檔微處理器時(shí)代,代表產(chǎn)品是Intel8080。此時(shí)指令系統(tǒng)已經(jīng)比較完善了。
(3)第三階段(1978年-1984年)。這是16位微處理器的時(shí)代,代表產(chǎn)品是Intel8086。相對(duì)而言已經(jīng)比較成熟了。
(4)第四階段(1985年-1992年)。這是32位微處理器時(shí)代,代表產(chǎn)品是Intel80386。已經(jīng)可以勝任多任務(wù)、多用戶的作業(yè)。
(5)第五階段(1993年-2005年)。這是奔騰系列微處理器的時(shí)代。
(6)第六階段(2005年至今)。是酷睿系列微處理器的時(shí)代,這是一款領(lǐng)先節(jié)能的新型微架構(gòu),設(shè)計(jì)的出發(fā)點(diǎn)是提供卓然出眾的性能和能效。
2 GPU(圖像處理器)
讀完了CPU的介紹,現(xiàn)在我們來(lái)簡(jiǎn)單介紹一下GPU。因?yàn)镃PU和GPU的工作流程和物理結(jié)構(gòu)大致是類似的,因此這里不再重復(fù)了。我們僅僅介紹一下GPU的功能和目前主流的供應(yīng)商。
相比于CPU而言,GPU的工作更為單一。在大多數(shù)的個(gè)人計(jì)算機(jī)中,GPU僅僅是用來(lái)繪制圖像的。如果CPU想畫(huà)一個(gè)二維圖形,只需要發(fā)個(gè)指令給GPU,GPU就可以迅速計(jì)算出該圖形的所有像素,并且在顯示器上指定位置畫(huà)出相應(yīng)的圖形。
由于GPU會(huì)產(chǎn)生大量的熱量,所以通常顯卡上都會(huì)有獨(dú)立的散熱裝置。
除此之外,GPU的供應(yīng)商比CPU供應(yīng)商更多一些。主流的供應(yīng)商有:
(1)Intel,基本都為集成顯卡。
(2)Nvidia,也就是我們常說(shuō)的N卡,在運(yùn)算速度上有較大的優(yōu)勢(shì)。
(3)AMD(ATI),我們常說(shuō)的A卡,通常在圖形渲染上做的比N卡好。
(4)其他廠商,包括3dfx,Matrox,SiS和VIA。這些都是相對(duì)比較小眾的公司。
3 CPU和GPU的比較
現(xiàn)在,我們來(lái)比較一下CPU和GPU??纯此麄兏髯栽谀男╊I(lǐng)域能夠發(fā)揮出自己的作用。我們從兩個(gè)角度入手:設(shè)計(jì)結(jié)構(gòu)和使用場(chǎng)景。
3.1 設(shè)計(jì)結(jié)構(gòu)
我們先從CPU開(kāi)始說(shuō)起。CPU有強(qiáng)大的算術(shù)運(yùn)算單元,可以在很少的時(shí)鐘周期內(nèi)完成算術(shù)計(jì)算。同時(shí),有很大的緩存可以保存很多數(shù)據(jù)在里面。此外,還有復(fù)雜的邏輯控制單元,當(dāng)程序有多個(gè)分支的時(shí)候,通過(guò)提供分支預(yù)測(cè)的能力來(lái)降低延時(shí)。具體的結(jié)構(gòu)如圖3所示。
下面我們來(lái)討論GPU的設(shè)計(jì)結(jié)構(gòu)。GPU是基于大的吞吐量設(shè)計(jì),有很多的算術(shù)運(yùn)算單元和很少的緩存。同時(shí)GPU支持大量的線程同時(shí)運(yùn)行,如果他們需要訪問(wèn)同一個(gè)數(shù)據(jù),緩存會(huì)合并這些訪問(wèn),自然會(huì)帶來(lái)延時(shí)的問(wèn)題。盡管有延時(shí),但是因?yàn)槠渌阈g(shù)運(yùn)算單元的數(shù)量龐大,因此能夠達(dá)到一個(gè)非常大的吞吐量的效果。如圖4所示。
3.2 使用場(chǎng)景
顯然,因?yàn)镃PU有大量的緩存和復(fù)雜的邏輯控制單元,因此它非常擅長(zhǎng)邏輯控制、串行的運(yùn)算。相比較而言,GPU因?yàn)橛写罅康乃阈g(shù)運(yùn)算單元,因此可以同時(shí)執(zhí)行大量的計(jì)算工作,它所擅長(zhǎng)的是大規(guī)模的并發(fā)計(jì)算,計(jì)算量大但是沒(méi)有什么技術(shù)含量,而且要重復(fù)很多次。
這樣一說(shuō),我們利用GPU來(lái)提高程序運(yùn)算速度的方法就顯而易見(jiàn)了。我們使用CPU來(lái)做復(fù)雜的邏輯控制,用GPU來(lái)做簡(jiǎn)單但是量大的算術(shù)運(yùn)算,就能夠大大地提高程序的運(yùn)行速度。下面我們來(lái)介紹一下Nvidia所推出的CUDA運(yùn)算平臺(tái)。
4 CUDA
CPU程序員的挑戰(zhàn)不只是在GPU上獲得出色的性能,還要協(xié)調(diào)系統(tǒng)處理器與GPU上的計(jì)算調(diào)度、系統(tǒng)存儲(chǔ)器和GPU存儲(chǔ)器之間的數(shù)據(jù)傳輸。為了解決這樣的問(wèn)題,Nvidia決定開(kāi)發(fā)一種與C類似的語(yǔ)言和編程環(huán)境,通過(guò)克服多種并行帶來(lái)的挑戰(zhàn)來(lái)提高GPU程序員的生產(chǎn)效率。這個(gè)系統(tǒng)的名稱為CUDA,表示“計(jì)算統(tǒng)一設(shè)備體系結(jié)構(gòu)”。
在CUDA中,這些并行形式的統(tǒng)一主題就是CUDA線程。CUDA線程是最低級(jí)別的并行,可以執(zhí)行一次操作。例如,如果我們有200個(gè)CUDA線程,那我們就可以同時(shí)進(jìn)行200個(gè)算術(shù)運(yùn)算,這樣一來(lái)程序的吞吐率就有了提高。
就目前來(lái)看,CUDA的應(yīng)用場(chǎng)景是非常廣泛的。在消費(fèi)級(jí)市場(chǎng)上,幾乎每一款重要的視頻程序都已經(jīng)使用CUDA加速。除此之外,在科研界和金融市場(chǎng),CUDA都有相應(yīng)的使用場(chǎng)景。不可否認(rèn)的是,在未來(lái),GPU計(jì)算必將成為主流。
參考文獻(xiàn)
[1]John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach[M].人民郵電出版社,2013.