1. 程式人生 > >GPU,CUDA,cuDNN的理解 GPU,CUDA,cuDNN的理解

GPU,CUDA,cuDNN的理解 GPU,CUDA,cuDNN的理解

GPU,CUDA,cuDNN的理解

2017年08月17日 20:29:37 閱讀數:13155
													<span class="tags-box artic-tag-box">
							<span class="label">標籤:</span>
															<a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;gpu&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=gpu&amp;t=blog" target="_blank">gpu																</a><a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;cuda&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=cuda&amp;t=blog" target="_blank">cuda																</a>
						<span class="article_info_click">更多</span></span>
																				<div class="tags-box space">
							<span class="label">個人分類:</span>
															<a class="tag-link" href="https://blog.csdn.net/u014380165/article/category/6829229" target="_blank">深度學習																</a>
						</div>
																							</div>
			<div class="operating">
													</div>
		</div>
	</div>
</div>
<article>
	<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post" style="height: 1150.8px; overflow: hidden;">
							<div class="article-copyright">
				版權宣告:本文為博主原創文章,未經博主允許不得轉載。					https://blog.csdn.net/u014380165/article/details/77340765				</div>
							            <div class="markdown_views prism-atom-one-dark">
						<!-- flowchart 箭頭圖示 勿刪 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p>我們知道做深度學習離不開GPU,不過一直以來對GPU和CPU的差別,CUDA以及cuDNN都不是很瞭解,所以找了些資料整理下,希望不僅可以幫助自己理解,也能夠幫助到其他人理解。</p>

先來講講CPU和GPU的關係和差別吧。截圖來自資料1(CUDA的官方文件):

這裡寫圖片描述

從上圖可以看出GPU(影象處理器,Graphics Processing Unit)和CPU(中央處理器,Central Processing Unit)在設計上的主要差異在於GPU有更多的運算單元(如圖中綠色的ALU),而Control和Cache單元不如CPU多,這是因為GPU在進行平行計算的時候每個運算單元都是執行相同的程式,而不需要太多的控制。Cache單元是用來做資料快取的,CPU可以通過Cache來減少存取主記憶體的次數,也就是減少記憶體延遲(memory latency)。GPU中Cache很小或者沒有,因為GPU可以通過平行計算的方式來減少記憶體延遲。

因此CPU的Cahce設計主要是實現低延遲,Control主要是通用性,複雜的邏輯控制單元可以保證CPU高效分發任務和指令。所以CPU擅長邏輯控制,是序列計算,而GPU擅長高強度計算,是平行計算。打個比方,GPU就像成千上萬的苦力,每個人乾的都是類似的苦力活,相互之間沒有依賴,都是獨立的,簡單的人多力量大;CPU就像包工頭,雖然也能幹苦力的活,但是人少,所以一般負責任務分配,人員排程等工作。

可以看出GPU加速是通過大量執行緒並行實現的,因此對於不能高度並行化的工作而言,GPU就沒什麼效果了。而CPU則是序列操作,需要很強的通用性,主要起到統管和分配任務的作用。

————————————————————————-華麗的分割線——————————————————————-

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上執行,而且只有當要解決的計算問題是可以大量平行計算的時候才能發揮CUDA的作用。

接下來這段話摘抄自資料2。在 CUDA 的架構下,一個程式分為兩個部份:host 端和 device 端。Host 端是指在 CPU 上執行的部份,而 device 端則是在顯示晶片上執行的部份。Device 端的程式又稱為 “kernel”。通常 host 端程式會將資料準備好後,複製到顯示卡的記憶體中,再由顯示晶片執行 device 端程式,完成後再由 host 端程式將結果從顯示卡的記憶體中取回。

這裡寫圖片描述

接下來這段話摘抄自資料2。在 CUDA 架構下,顯示晶片執行時的最小單位是thread。數個 thread 可以組成一個block。一個 block 中的 thread 能存取同一塊共享的記憶體,而且可以快速進行同步的動作。每一個 block 所能包含的 thread 數目是有限的。不過,執行相同程式的 block,可以組成grid。不同 block 中的 thread 無法存取同一個共享的記憶體,因此無法直接互通或進行同步。因此,不同 block 中的 thread 能合作的程度是比較低的。不過,利用這個模式,可以讓程式不用擔心顯示晶片實際上能同時執行的 thread 數目限制。例如,一個具有很少量執行單元的顯示晶片,可能會把各個 block 中的 thread 順序執行,而非同時執行。不同的 grid 則可以執行不同的程式(即 kernel)。

這裡寫圖片描述

————————————————————————-華麗的分割線——————————————————————-

cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的針對深度神經網路的加速庫,是一個用於深層神經網路的GPU加速庫。如果你要用GPU訓練模型,cuDNN不是必須的,但是一般會採用這個加速庫。

參考資料1
參考資料2

閱讀更多