CPU和GPU的區別
CPU和GPU的設計區別
CPU和GPU之所以大不相同,是由於其設計目標的不同,它們分別針對了兩種不同的應用場景。CPU需要很強的通用性來處理各種不同的資料型別,同時又要邏輯判斷、又會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜。而GPU面對的則是型別高度統一的、相互無依賴的大規模資料和不需要被打斷的純淨的計算環境。
於是CPU和GPU就呈現出非常不同的架構(示意圖如下):
圖片來自nVidia CUDA文件。其中綠色的是計算單元,橙紅色的是儲存單元,橙黃色的是控制單元。
GPU採用了數量眾多的計算單元和超長的流水線,但只有簡單的控制邏輯並省去了Cache。而CPU不僅被Cache佔據了大量空間,而且還有複雜的控制邏輯和諸多優化電路,相比之下計算能力只是CPU很小的一部分。
從上圖可以看出:
Cache, local memory:CPU > GPU
Threads(執行緒數):GPU > CPU
Registers:GPU > CPU,多暫存器可以支援非常多的Thread,Thread需要用到Register,Thread數目大,Register也必須跟著很大才行。
SIMD Unit(單指令多資料流,以同步方式,在同一時間內執行同一條指令):GPU > CPU。
CPU基於低延時的設計:
CPU有強大的ALU(算術運算單元),它可以在很少的時鐘週期內完成算術計算。
當今的CPU可以達到64bit雙精度。執行雙精度浮點運算的加法和乘法只需要1~3個時鐘週期。
CPU的時鐘週期的頻率是非常高的,達到1.532~3gigahertz(千兆HZ,10的9次方)。
大的快取也可以降低延時。儲存很多的資料放在快取裡面,當需要訪問的這些資料,只要在之前訪問過,如今直接在快取裡面取即可。
複雜的邏輯單元控制。當程式含有多個分支的時候,它通過提供分支預測的能力來降低延時。
資料轉發。當一些指令依賴前面的指令結果時,資料轉發的邏輯控制單元決定這些指令在pipeline中的位置並且儘可能快的轉發一個指令的結果給後續的指令。這些動作需要很多的對比電路單元和轉發電路單元。
GPU是基於大的吞吐量設計。
GPU的特點是有很多的ALU和很少的Cache。快取的目的不是儲存後面需要訪問的資料,這點和CPU不同,而是為Thread提供服務。如果有很多執行緒需要訪問同一個相同的資料,快取會合並這些訪問,然後再去訪問DRAM(因為需要訪問的資料儲存在DRAM中而不是Cache裡面),獲取資料後Cache會轉發這個資料給對應的執行緒,這個時候是資料轉發的角色。但是由於需要訪問DRAM,自然會帶來延時的問題。
GPU的控制單元(左邊的黃色區域塊)可以把多個訪問合併成少的訪問。
GPU雖然有DRAM訪問延時,卻有非常多的ALU和非常多的Thread。為了平衡延時的問題,我們可以充分利用多的ALU的特性達到一個非常大的吞吐量的效果,儘可能多的分配Threads。通常來看,GPU ALU會有非常重的pipeline就是因為這樣。
所以與CPU擅長邏輯控制,序列的運算和通用型別資料運算不同,GPU擅長的是大規模併發計算,這也正是密碼破解等所需要的。所以GPU除了影像處理,也越來越多的參與到計算當中來。
GPU的工作大部分就是這樣,計算量大,但沒什麼計算含量,而且需要重複很多很多次,就像你有個工作需要算幾億次一百以內加減乘除一樣,最好的辦法就是僱上幾十個小學生計算,一人算一部分,反正這些計算也沒什麼技術含量,純粹體力活而已。而CPU就像老教授,積分微分都會,就是工資高,一個老教授頂二十個小學生,你要是富士康你僱哪個?
GPU就是這樣,用很多簡單的計算單元去完成大量的計算任務,純粹的人海戰術。這種策略基於一個前提,就是小學生A和小學生B的工作沒有什麼依賴性,是互相獨立的。很多涉及到大量計算的問題基本都有這種特性,比如你說的密碼破解,資料探勘和影像計算,這些計算可以分解為多個相同的簡單小任務,每個任務就可以分給一個小學生去做。但還有一些任務涉及到流的問題,比如說你去相親,雙方看著順眼才能繼續發展,總不能你這邊還沒見面,那邊就把證領了。這種比較複雜的問題就需要CPU來解決。
總而言之,CPU和GPU因為最初用來處理的任務就不同,所以設計上有不小的區別。而某些任務和GPU最初用來解決的問題比較相似,所以用GPU就可以加快效率。GPU的運算速度取決於僱了多少小學生,CPU的運算速度取決於請了多少厲害的教授,教授處理複雜的任務的能力肯定是碾壓小學生的,但是對於沒那麼複雜的任務,還是頂不住人多算得快。當然,現在的GPU也能做一部分稍微複雜的工作了,相當於升級成初中生或者高中生的水平,但還是需要CPU把資料喂到嘴邊才能開始幹活。
什麼型別的程式適合在GPU上執行?
(1)計算密集型的程式。所謂計算密集型(Compute-intensive)的程式,就是其大部分執行時間花在了暫存器運算上,暫存器的速度和處理器的速度相當,從暫存器讀寫資料幾乎沒有延時。可以做一下對比,讀記憶體的延遲大概是幾百個時鐘週期;讀硬碟的速度就不說了,即便是SSD,也實在是太慢了。
(2)易於並行的程式。GPU其實是一種SIMD(Single Instruction Multiple Data)的架構,它有成百上千個核,每一個核在同一時間最好能做同樣的事情。
相關文章
- GPU程式設計--CPU和GPU的設計區別GPU程式設計
- gpu是什麼 gpu和cpu的區別介紹GPU
- CPU Turbo和GPU Turbo的區別 CPU Turbo是什麼意思?GPU
- 特網雲 CPU和GPU有什麼區別GPU
- 電腦gpu是什麼意思 gpu和cpu有什麼區別不同GPU
- CPU(中央處理器)和GPU(影像處理器)的區別GPU
- 恆訊科技分析:伺服器的CPU和GPU之間的區別?伺服器GPU
- 五年經驗的前端社招被問:CPU 和 GPU 到底有啥區別?前端GPU
- 一文讀懂資料中心計算市場CPU、DPU和GPU的區別GPU
- CPU的散片和盒裝CPU有什麼區別?
- 【知識分享】伺服器CPU和家用CPU的區別伺服器
- Linux 中CPU 和 GPU 的行為監控LinuxGPU
- AMD CPU散片和盒裝有什麼區別?AMD CPU散片和盒裝的區別對比知識
- CPU散片是什麼意思?盒裝CPU和CPU散裝的區別知識科普
- cpu散片和盒裝的區別 cpu買散片還是盒裝
- cpu散片和盒裝的區別是什麼 amdintelcpu散片和盒裝區別介紹Intel
- 在 Linux 上監控 CPU 和 GPU 溫度LinuxGPU
- cpu散片和盒裝的區別是什麼 cpu散片和盒裝的買哪個好
- 四大CPU架構的區別架構
- cpu超頻和不超頻的區別是什麼 cpu超頻和不超頻哪個好
- CPU睿頻和超頻的區別 睿頻是什麼意思
- 如何檢視CPU核數和執行緒數?CPU的核心數、執行緒數的關係和區別執行緒
- Caffe原始碼理解2:SyncedMemory CPU和GPU間的資料同步原始碼GPU
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- CPU單核多核區別【轉載】單核
- ||和??的區別
- /*和/**的區別
- Unity效能分析(二)CPU/GPU分析UnityGPU
- 電腦CPU釺焊和矽脂有什麼區別 CPU釺焊是什麼意思?
- 監控Ubuntu Linux中的CPU/GPU 溫度UbuntuLinuxGPU
- 部署CPU與GPU通用的tensorflow:Anaconda環境GPU
- TensorFlow——tensorflow指定CPU與GPU運算GPU
- Keras/Tensorflow選擇GPU/CPU執行KerasGPU
- jquery $(this) 和this的區別jQuery
- JQuery this和$(this)的區別jQuery
- T和?的區別
- makefile =和:=的區別