我們知道做深度學(xué)習(xí)離不開GPU,不過一直以來對GPU和CPU的差別舷礼,CUDA以及cuDNN都不是很了解鹃彻,所以找了些資料整理下,希望不僅可以幫助自己理解妻献,也能夠幫助到其他人理解蛛株。
先來講講CPU和GPU的關(guān)系和差別吧。截圖來自資料1(CUDA的官方文檔):
從上圖可以看出GPU(圖像處理器育拨,Graphics Processing Unit)和CPU(中央處理器谨履,Central Processing Unit)在設(shè)計上的主要差異在于GPU有更多的運算單元(如圖中綠色的ALU),而Control和Cache單元不如CPU多熬丧,這是因為GPU在進行并行計算的時候每個運算單元都是執(zhí)行相同的程序笋粟,而不需要太多的控制。Cache單元是用來做數(shù)據(jù)緩存的,CPU可以通過Cache來減少存取主內(nèi)存的次數(shù)害捕,也就是減少內(nèi)存延遲(memory latency)绿淋。GPU中Cache很小或者沒有,因為GPU可以通過并行計算的方式來減少內(nèi)存延遲尝盼。因此CPU的Cahce設(shè)計主要是實現(xiàn)低延遲吞滞,Control主要是通用性,復(fù)雜的邏輯控制單元可以保證CPU高效分發(fā)任務(wù)和指令盾沫。所以CPU擅長邏輯控制裁赠,是串行計算,而GPU擅長高強度計算赴精,是并行計算佩捞。打個比方,GPU就像成千上萬的苦力祖娘,每個人干的都是類似的苦力活失尖,相互之間沒有依賴,都是獨立的渐苏,簡單的人多力量大掀潮;CPU就像包工頭,雖然也能干苦力的活琼富,但是人少仪吧,所以一般負責(zé)任務(wù)分配,人員調(diào)度等工作鞠眉。
可以看出GPU加速是通過大量線程并行實現(xiàn)的薯鼠,因此對于不能高度并行化的工作而言,GPU就沒什么效果了械蹋。而CPU則是串行操作出皇,需要很強的通用性,主要起到統(tǒng)管和分配任務(wù)的作用哗戈。
————————————————————————-華麗的分割線——————————————————————-
CUDA的官方文檔(參考資料1)是這么介紹CUDA的:a general purpose parallel computing platform and programming model that leverages the parallel compute engine in NVIDIA GPUs to solve many complex computational problems in a more efficient way than on a CPU.
換句話說CUDA是NVIDIA推出的用于自家GPU的并行計算框架郊艘,也就是說CUDA只能在NVIDIA的GPU上運行,而且只有當(dāng)要解決的計算問題是可以大量并行計算的時候才能發(fā)揮CUDA的作用唯咬。
接下來這段話摘抄自資料2纱注。在 CUDA 的架構(gòu)下,一個程序分為兩個部份:host 端和 device 端胆胰。Host 端是指在 CPU 上執(zhí)行的部份狞贱,而 device 端則是在顯示芯片上執(zhí)行的部份。Device 端的程序又稱為 “kernel”蜀涨。通常 host 端程序會將數(shù)據(jù)準(zhǔn)備好后瞎嬉,復(fù)制到顯卡的內(nèi)存中蝎毡,再由顯示芯片執(zhí)行 device 端程序,完成后再由 host 端程序?qū)⒔Y(jié)果從顯卡的內(nèi)存中取回佑颇。
接下來這段話摘抄自資料2顶掉。在 CUDA 架構(gòu)下,顯示芯片執(zhí)行時的最小單位是thread挑胸。數(shù)個 thread 可以組成一個block痒筒。一個 block 中的 thread 能存取同一塊共享的內(nèi)存,而且可以快速進行同步的動作茬贵。每一個 block 所能包含的 thread 數(shù)目是有限的簿透。不過,執(zhí)行相同程序的 block解藻,可以組成grid老充。不同 block 中的 thread 無法存取同一個共享的內(nèi)存,因此無法直接互通或進行同步螟左。因此啡浊,不同 block 中的 thread 能合作的程度是比較低的。不過胶背,利用這個模式巷嚣,可以讓程序不用擔(dān)心顯示芯片實際上能同時執(zhí)行的 thread 數(shù)目限制。例如钳吟,一個具有很少量執(zhí)行單元的顯示芯片廷粒,可能會把各個 block 中的 thread 順序執(zhí)行,而非同時執(zhí)行红且。不同的 grid 則可以執(zhí)行不同的程序(即 kernel)坝茎。
————————————————————————-華麗的分割線——————————————————————-
cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的針對深度神經(jīng)網(wǎng)絡(luò)的加速庫,是一個用于深層神經(jīng)網(wǎng)絡(luò)的GPU加速庫暇番。如果你要用GPU訓(xùn)練模型嗤放,cuDNN不是必須的,但是一般會采用這個加速庫壁酬。
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy
參考資料2