當前位置: 華文問答 > 數碼

為什麽 GPU 的通用計算能力高於 CPU?架構原因?內核數量?

2015-07-27數碼

先上一張老生常談的圖吧,說起這個問題需要長篇大論解釋CPU和GPU本身區別或者GPU浮點為什麽比CPU高?

那麽,先拋一個簡單明了的答案:CPU和GPU本身設計方式和運算目的不同導致了這種差距,那麽我來細說一下。

CPU和GPU設計上大概有什麽不同:

1:CPU中大部份(大概70%)晶體管用來構建Cache還有一部份控制單元,負責邏輯算數的部份並不多;而GPU整個就是一個龐大的計算陣列(包括alu和shader填充),我們知道GPU大致分為3d setup和流計算兩個部份,而GPGPU就是用流計算來做大量密集型運算,比如linpack這種求解大規模稠密線性方程式組。GPU中負責邏輯算數的部份要遠遠大於CPU因此在邏輯運算上當然就比CPU強太多

2:GPU對Cache的依賴比CPU小,因為GPU用的是高速度總線;其次GPU的數據具有高度對齊性以及不符合局部化假設、比CPU更深的pipeline執行還有一點就是很少把數據寫回。

但是CPU不同,它非常需要Cache,有無Cache的CPU差距可以是極大的。其實Cache是人類如今對於矽工藝的一種「妥協」——我們總是希望擁有一個記憶體它的CPU比肩或者接近於CPU同時又可以在容量上做大。但目前矽工藝限制了這個「天馬行空」的幻想,因此,人類不得已做出了Cache這個片上記憶體,它的速度的確是最快的,位於記憶體體系結構的最高層,但它也是容量最小的。它可以擴大,但是進步很小,至於原因其中大概是2點:1:Cache是構建於CPU內部,需要考慮面積;2:需要權衡利弊,比如l1不能無限做大是因為本身致力於為CPU提供一個快速的數據遞交,而l1如果做大那麽命中時間增加以及延遲開銷的影響來說這就是非常大的弊端了。

為什麽CPU需求Cache?上面說的已經透露了一些,CPU需要處理不同類別的數據更是需要記憶體的配合來執行load/store指令,所以,我們透過在CPU內部構建一個Cache作為片上記憶體配合DRAM、ROM整個記憶體體系結構為配合CPU處理load/store指令;還有一點是CPU的總線速度非常落後。

3:還有一點就是核心的不同。CPU的核心內部因為有大量Cache所以一個邏輯核心普遍是比GPU中的Stream Processors大的,GPU中的SP就是簡單的核心但是CPU不同,在core的設計上CPU是比GPU復雜的多。

CPU和GPU計算目的的不同:

1:如上就可以看出來。CPU本身設計初衷適合序列,而GPU則是適合大規模並列。CPU所作的工作是極度復雜的,處理的指令之間有復雜的邏輯關系,比如Dependence還有branch Instruction等等,這些都是GPU做不來的。

2:GPU需要做的工作在復雜度上遠不如CPU,GPU需要處理的數據之間沒有任何的Dependence,所以它們可以並列執行,比如Vertex和Pixel兩種數據處理都執行獨立數據產生獨立結果因此可以達到高度並列。換句話來說,GPU因為設計問題天生適合大規模SIMT/SIMD運算方式。它就是一個針對向量計算進行高度並列並且以數據流作為處理單元的處理機這樣在對數據流的處理上可以獲得很高的效率。


如上是大致說出了GPU比CPU在alu計算上的關鍵所在,那麽我前面說過了,GPU主要是兩部份:一部份是3d setup;一部份是負責密集型流計算的。後者是屬於可編程的,那麽GPGPU正是利用OpenCL、CUDA這些專用非圖形介面API讓流計算的部份來解決非圖形問題,比如流體模擬、爆炸等等這些適合大規模密集型運算的工作。


如上,在GPU通用計算上GPU比CPU強的原因無外乎就是:因為根本目的的不同產生了不同設計因而導致各自計算方向不同所以產生了這樣的差距。


ps:唔~ 手機碼字倒是碼了一個小時。。。手也累了,就大概寫那麽多了,真要說起來這個問題還可以寫一長篇大論的,只是我太懶了~ 而且現在,也有點餓了●﹏●