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