CPU和GPU之因此大不相同,是因爲其設計目標的不一樣,它們分別針對了兩種不一樣的應用場景。CPU須要很強的通用性來處理各類不一樣的數據類型,同時又要邏輯判斷又會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜。而GPU面對的則是類型高度統一的、相互無依賴的大規模數據和不須要被打斷的純淨的計算環境。html
因而CPU和GPU就呈現出很是不一樣的架構(示意圖):緩存
圖片來自nVidia CUDA文檔。其中綠色的是計算單元,橙紅色的是存儲單元,橙黃色的是控制單元。多線程
GPU採用了數量衆多的計算單元和超長的流水線,但只有很是簡單的控制邏輯並省去了Cache。而CPU不只被Cache佔據了大量空間,並且還有有複雜的控制邏輯和諸多優化電路,相比之下計算能力只是CPU很小的一部分架構
從上圖能夠看出:併發
Cache, local memory: CPU > GPU 優化
Threads(線程數): GPU > CPUspa
Registers: GPU > CPU 多寄存器能夠支持很是多的Thread,thread須要用到register,thread數目大,register也必須得跟着很大才行。線程
SIMD Unit(單指令多數據流,以同步方式,在同一時間內執行同一條指令): GPU > CPU。 設計
CPU 基於低延時的設計:htm
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來把數據喂到嘴邊才能開始幹活,究竟仍是靠CPU來管的。
什麼類型的程序適合在GPU上運行?
(1)計算密集型的程序。所謂計算密集型(Compute-intensive)的程序,就是其大部分運行時間花在了寄存器運算上,寄存器的速度和處理器的速度至關,從寄存器讀寫數據幾乎沒有延時。能夠作一下對比,讀內存的延遲大概是幾百個時鐘週期;讀硬盤的速度就不說了,即使是SSD, 也實在是太慢了。
(2)易於並行的程序。GPU實際上是一種SIMD(Single Instruction Multiple Data)架構, 他有成百上千個核,每個核在同一時間最好能作一樣的事情。