深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解
我們知道做深度學(xué)習(xí)離不開(kāi)GPU,不過(guò)一直以來(lái)對(duì)GPU和CPU的差別,CUDA以及cuDNN都不是很了解,所以找了些資料整理下,希望不僅可以幫助自己理解,也能夠幫助到其他人理解。
先來(lái)講講CPU和GPU的關(guān)系和差別吧。截圖來(lái)自資料1(CUDA的官方文檔):
從上圖可以看出GPU(圖像處理器,Graphics Processing Unit)和CPU(中央處理器,Central Processing Unit)在設(shè)計(jì)上的主要差異在于GPU有更多的運(yùn)算單元(如圖中綠色的ALU),而Control和Cache單元不如CPU多,這是因?yàn)镚PU在進(jìn)行并行計(jì)算的時(shí)候每個(gè)運(yùn)算單元都是執(zhí)行相同的程序,而不需要太多的控制。Cache單元是用來(lái)做數(shù)據(jù)緩存的,CPU可以通過(guò)Cache來(lái)減少存取主內(nèi)存的次數(shù),也就是減少內(nèi)存延遲(memory latency)。GPU中Cache很小或者沒(méi)有,因?yàn)镚PU可以通過(guò)并行計(jì)算的方式來(lái)減少內(nèi)存延遲。因此CPU的Cahce設(shè)計(jì)主要是實(shí)現(xiàn)低延遲,Control主要是通用性,復(fù)雜的邏輯控制單元可以保證CPU高效分發(fā)任務(wù)和指令。所以CPU擅長(zhǎng)邏輯控制,是串行計(jì)算,而GPU擅長(zhǎng)高強(qiáng)度計(jì)算,是并行計(jì)算。打個(gè)比方,GPU就像成千上萬(wàn)的苦力,每個(gè)人干的都是類(lèi)似的苦力活,相互之間沒(méi)有依賴,都是獨(dú)立的,簡(jiǎn)單的人多力量大;CPU就像包工頭,雖然也能干苦力的活,但是人少,所以一般負(fù)責(zé)任務(wù)分配,人員調(diào)度等工作。
可以看出GPU加速是通過(guò)大量線程并行實(shí)現(xiàn)的,因此對(duì)于不能高度并行化的工作而言,GPU就沒(méi)什么效果了。而CPU則是串行操作,需要很強(qiáng)的通用性,主要起到統(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.
換句話說(shuō)CUDA是NVIDIA推出的用于自家GPU的并行計(jì)算框架,也就是說(shuō)CUDA只能在NVIDIA的GPU上運(yùn)行,而且只有當(dāng)要解決的計(jì)算問(wèn)題是可以大量并行計(jì)算的時(shí)候才能發(fā)揮CUDA的作用。
接下來(lái)這段話摘抄自資料2。在 CUDA 的架構(gòu)下,一個(gè)程序分為兩個(gè)部份:host 端和 device 端。Host 端是指在 CPU 上執(zhí)行的部份,而 device 端則是在顯示芯片上執(zhí)行的部份。Device 端的程序又稱為 “kernel”。通常 host 端程序會(huì)將數(shù)據(jù)準(zhǔn)備好后,復(fù)制到顯卡的內(nèi)存中,再由顯示芯片執(zhí)行 device 端程序,完成后再由 host 端程序?qū)⒔Y(jié)果從顯卡的內(nèi)存中取回。
接下來(lái)這段話摘抄自資料2。在 CUDA 架構(gòu)下,顯示芯片執(zhí)行時(shí)的最小單位是thread。數(shù)個(gè) thread 可以組成一個(gè)block。一個(gè) block 中的 thread 能存取同一塊共享的內(nèi)存,而且可以快速進(jìn)行同步的動(dòng)作。每一個(gè) block 所能包含的 thread 數(shù)目是有限的。不過(guò),執(zhí)行相同程序的 block,可以組成grid。不同 block 中的 thread 無(wú)法存取同一個(gè)共享的內(nèi)存,因此無(wú)法直接互通或進(jìn)行同步。因此,不同 block 中的 thread 能合作的程度是比較低的。不過(guò),利用這個(gè)模式,可以讓程序不用擔(dān)心顯示芯片實(shí)際上能同時(shí)執(zhí)行的 thread 數(shù)目限制。例如,一個(gè)具有很少量執(zhí)行單元的顯示芯片,可能會(huì)把各個(gè) block 中的 thread 順序執(zhí)行,而非同時(shí)執(zhí)行。不同的 grid 則可以執(zhí)行不同的程序(即 kernel)。
————————————————————————-華麗的分割線——————————————————————-
cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的針對(duì)深度神經(jīng)網(wǎng)絡(luò)的加速庫(kù),是一個(gè)用于深層神經(jīng)網(wǎng)絡(luò)的GPU加速庫(kù)。如果你要用GPU訓(xùn)練模型,cuDNN不是必須的,但是一般會(huì)采用這個(gè)加速庫(kù)。
- 參考資料1:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy
- 參考資料2:http://www.smallgui.com/wp-content/uploads/2016/04/深入淺出談CUDA.pdf
補(bǔ)充:查詢版本命令
ubuntu:
cuda 版本 nvcc -V cat /usr/local/cuda/version.txt cudnn 版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 查看Nvidia GPU版本 nvidia-smi //10s顯示一次 watch -n 10 nvidia-smi nvidia-smi -l
到此這篇關(guān)于深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解的文章就介紹到這了,更多相關(guān)GPU,CUDA和cuDNN理解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的可可愛(ài)愛(ài)的小粽子詳解
我突發(fā)奇想做一個(gè)關(guān)于粽子的小游戲,基本原理:操控粽子吃掉愛(ài)心,即可增加分?jǐn)?shù),經(jīng)過(guò)朋友game多測(cè)嘗試最終完成小游戲2022-06-06python圖形用戶界面tkinter之標(biāo)簽Label的使用說(shuō)明
這篇文章主要介紹了python圖形用戶界面tkinter之標(biāo)簽Label的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等)
這篇文章主要介紹了詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07基于pytorch中的Sequential用法說(shuō)明
這篇文章主要介紹了基于pytorch中的Sequential用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06cv2.imread?和?cv2.imdecode?用法及區(qū)別
對(duì)于路徑中含有中文的圖像,直接用cv2.imread讀取會(huì)報(bào)錯(cuò),上次看到有大佬使用cv2.imdecode就可以正常讀取,有點(diǎn)好奇,所以今天來(lái)記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-02-02