深度學(xué)習(xí)之GPU,CUDA和cuDNN的理解
我們知道做深度學(xué)習(xí)離不開GPU,不過一直以來對GPU和CPU的差別,CUDA以及cuDNN都不是很了解,所以找了些資料整理下,希望不僅可以幫助自己理解,也能夠幫助到其他人理解。
先來講講CPU和GPU的關(guān)系和差別吧。截圖來自資料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ì)算的時候每個運(yùn)算單元都是執(zhí)行相同的程序,而不需要太多的控制。Cache單元是用來做數(shù)據(jù)緩存的,CPU可以通過Cache來減少存取主內(nèi)存的次數(shù),也就是減少內(nèi)存延遲(memory latency)。GPU中Cache很小或者沒有,因?yàn)镚PU可以通過并行計(jì)算的方式來減少內(nèi)存延遲。因此CPU的Cahce設(shè)計(jì)主要是實(shí)現(xiàn)低延遲,Control主要是通用性,復(fù)雜的邏輯控制單元可以保證CPU高效分發(fā)任務(wù)和指令。所以CPU擅長邏輯控制,是串行計(jì)算,而GPU擅長高強(qiáng)度計(jì)算,是并行計(jì)算。打個比方,GPU就像成千上萬的苦力,每個人干的都是類似的苦力活,相互之間沒有依賴,都是獨(dú)立的,簡單的人多力量大;CPU就像包工頭,雖然也能干苦力的活,但是人少,所以一般負(fù)責(zé)任務(wù)分配,人員調(diào)度等工作。
可以看出GPU加速是通過大量線程并行實(shí)現(xiàn)的,因此對于不能高度并行化的工作而言,GPU就沒什么效果了。而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.
換句話說CUDA是NVIDIA推出的用于自家GPU的并行計(jì)算框架,也就是說CUDA只能在NVIDIA的GPU上運(yùn)行,而且只有當(dāng)要解決的計(jì)算問題是可以大量并行計(jì)算的時候才能發(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)存,而且可以快速進(jìn)行同步的動作。每一個 block 所能包含的 thread 數(shù)目是有限的。不過,執(zhí)行相同程序的 block,可以組成grid。不同 block 中的 thread 無法存取同一個共享的內(nèi)存,因此無法直接互通或進(jìn)行同步。因此,不同 block 中的 thread 能合作的程度是比較低的。不過,利用這個模式,可以讓程序不用擔(dān)心顯示芯片實(shí)際上能同時執(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不是必須的,但是一般會采用這個加速庫。
- 參考資料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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的可可愛愛的小粽子詳解
我突發(fā)奇想做一個關(guān)于粽子的小游戲,基本原理:操控粽子吃掉愛心,即可增加分?jǐn)?shù),經(jīng)過朋友game多測嘗試最終完成小游戲2022-06-06python圖形用戶界面tkinter之標(biāo)簽Label的使用說明
這篇文章主要介紹了python圖形用戶界面tkinter之標(biāo)簽Label的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等)
這篇文章主要介紹了詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-07cv2.imread?和?cv2.imdecode?用法及區(qū)別
對于路徑中含有中文的圖像,直接用cv2.imread讀取會報(bào)錯,上次看到有大佬使用cv2.imdecode就可以正常讀取,有點(diǎn)好奇,所以今天來記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-02-02