歡迎光臨
每天分享高質量文章

談談GPU和CPU為何不同?

CPU和GPU之所以大不相同,是由於其設計標的的不同,它們分別針對了兩種不同的應用場景。CPU需要很強的通用性來處理各種不同的資料型別,同時又要邏輯判斷又會引入大量的分支跳轉和中斷的處理。

 

這些都使得CPU的內部結構異常複雜。而GPU面對的則是型別高度統一的、相互無依賴的大規模資料和不需要被打斷的純凈的計算環境。於是CPU和GPU就呈現出非常不同的架構(示意圖):

 

GPU採用了數量眾多的計算單元和超長的流水線,但只有非常簡單的控制邏輯並省去了Cache。而CPU不僅被Cache占據了大量空間,而且還有有複雜的控制邏輯和諸多優化電路,相比之下計算能力只是CPU很小的一部分。

CPU 基於低延時的設計,CPU有強大的ALU(算術運算單元),它可以在很少的時鐘周期內完成算術計算。

 

GPU是基於大的吞吐量設計:Cache比較小、控制單元簡單,但GPU的核數很多,適合於並行高吞吐量運算。

 

 

總而言之,CPU和GPU因為最初用來處理的任務就不同,所以設計上有不小的區別。而某些任務和GPU最初用來解決的問題比較相似,所以用GPU來算了。

 

GPU的運算速度取決於雇了多少小學生,CPU的運算速度取決於請了多麼厲害的教授。教授處理複雜任務的能力是碾壓小學生的,但是對於沒那麼複雜的任務,還是頂不住人多。當然現在的GPU也能做一些稍微複雜的工作了,相當於升級成初中生高中生的水平。

 

但還需要CPU來把資料喂到嘴邊才能開始幹活,究竟還是靠CPU來管的。

OpenCL與CUDA的關係是什麼?

 

  • 雖然兩者抱著相同的標的:通用並行計算。但是CUDA僅僅能夠在NVIDIA的GPU硬體上運行,而OpenCL的標的是面向任何一種MassivelyParallel Processor,期望能夠對不同種類的硬體給出一個相同的編程模型。
  • 跨平臺性和通用性。這一點上OpenCL占有很大優勢(這也是很多National Laboratory使用OpenCL進行科學計算的最主要原因)。OpenCL支持包括ATI,NVIDIA,Intel,ARM在內的多類處理器,並能支持運行在CPU的並行代碼,同時還獨有Task-Parallel Execution Mode,能夠更好的支持Heterogeneous Computing。這一點是僅僅支持資料級並行並僅能在NVIDIA眾核處理器上運行的CUDA無法做到的。

 

  • CUDA和OpenCL的關係並不是衝突關係,而是包容關係。OpenCL是一個API,在第一個級別,CUDA架構是更高一個級別,在這個架構上不管是OpenCL還是DX11這樣的API,還是像C語言、Fortran、DX11計算,都可以支持。
  • 關於OpenCL與CUDA之間的技術區別,主要體現在實現方法上。基於C語言的CUDA被包裝成一種容易編寫的代碼,因此即使是不熟悉芯片構造的科研人員,也可能利用CUDA工具編寫出實用的程式。而OpenCL雖然句法上與CUDA接近,但是它更加強調底層操作,因此難度較高,但正因為如此,OpenCL才能跨平臺運行。

     

 

CUDA 軟體堆棧由幾層組成,如圖所示:一個硬體驅動程式,一個應用程式編程接口(API)和它的Runtime,還有二個高級的通用數學庫: CUFFT和CUBLAS。

CUDA是一個並行計算的架構,包含有一個指令集架構和相應的硬體引擎。OpenCL是一個並行計算的應用程式編程接口(API),在NVIDIA CUDA架構上OpenCL是除了C for CUDA外新增的一個CUDA程式開發途徑。

已同步到看一看
赞(0)

分享創造快樂