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才能跨平台運行。