?計(jì)算機(jī)視覺學(xué)習(xí)(一)——CUDA介紹及基礎(chǔ)入門
CUDA? :計(jì)算統(tǒng)一設(shè)備架構(gòu)(Computer Unified Device Architecture, CUDA)是由英偉達(dá)(NVIDIA)開發(fā)的一套并行計(jì)算平臺(tái)和編程模型。它只支持NVIDIA GPU卡。
CUDA可以使用簡單的編程API在圖形處理單元(GPU)上創(chuàng)建大規(guī)模并行應(yīng)用程序。而且,CUDA允許程序員指定代碼的哪個(gè)部分在CPU上執(zhí)行,哪個(gè)部分在GPU上執(zhí)行。
1.1? 并行處理
我們需要可以快速運(yùn)行的處理器以超高的時(shí)鐘速度、較小的面積和最小的功率執(zhí)行多項(xiàng)任務(wù)。過去都是隨著晶體管的尺寸逐漸減小,一個(gè)芯片上可以封裝更多的晶體管,導(dǎo)致時(shí)鐘速度的不斷提高。但是最近幾年時(shí)鐘速度幾乎保持不變,這是因?yàn)闀r(shí)鐘速度恒定的背后是高功率損耗和高時(shí)鐘速率。小的晶體管在小面積內(nèi)封裝和高速工作將耗散大功率,因此它是很難保持處理器的低溫。開發(fā)中隨著始終速度逐漸飽和,我們就需要新地計(jì)算模式來提高處理器的性能了。
可以這么理解,假如現(xiàn)在要在很短的時(shí)間里挖一個(gè)很大的坑,有三種方法完成這項(xiàng)工作:
(1)挖得更快
(2)換一把更好的鏟子
(3)雇傭更多的挖掘機(jī)。
第一種選擇類似與更快的時(shí)鐘,第二種類似于擁有更多可以在每個(gè)時(shí)鐘周期做更多工作的晶體管,但是功耗限制了這兩個(gè)步驟。第三種類似于擁有許多可以并行處理任務(wù)的更小更簡單的處理器,而CPU遵循了這種計(jì)算模式。他不是一個(gè)可以執(zhí)行復(fù)雜任務(wù)的更強(qiáng)大的處理器,而是有許多小而簡單的且可以并行工作的處理器。
1.2 GPU架構(gòu)和CUDA介紹
GPU剛開始是被開發(fā)來用于顯示器上渲染高端圖形的,只用在像素計(jì)算上,后來發(fā)現(xiàn)GPU既然可以做像素計(jì)算就可以做其他的數(shù)學(xué)計(jì)算,這些GPU就被稱為通用GPU(GPGPU)。
CPU和GPU的硬件架構(gòu)有什么不同呢?
CPU具有復(fù)雜的控制硬件和較少的數(shù)據(jù)計(jì)算硬件,復(fù)雜的控制硬件在性能上提供了CPU的靈活性和一個(gè)簡單的編程接口,但是就功耗而言,這個(gè)成本是非常高的。GPU具有簡單的控制硬件和更多的數(shù)據(jù)計(jì)算硬件,讓他具有并行計(jì)算的能力,這種結(jié)構(gòu)更加節(jié)能,缺點(diǎn)是它有一個(gè)更嚴(yán)格的編程模型。在GPU計(jì)算的早期,OpenGL 和DirectX 等圖形API是與GPU交互的唯一方式。但是這兩個(gè)API的使用是非常復(fù)雜的,于是這促成了CUDA編程架構(gòu)的開發(fā)。
任何硬件架構(gòu)的性能都是根據(jù)延遲和吞吐量來度量的。延遲是完成給定任務(wù)所花費(fèi)的時(shí)間,而吞吐量是在給定時(shí)間內(nèi)完成任務(wù)的數(shù)量。正常的串行CPU被設(shè)計(jì)為優(yōu)化延遲,而GPU被設(shè)計(jì)為優(yōu)化吞吐量。
1.3 CUDA架構(gòu)
所有的GPU都有許多被稱為核心(Core)的并行處理單元。這些核心被分為流處理器和流多處理器。GPU有這些流多處理器的網(wǎng)格。CUDA程序是作為一些并行運(yùn)行的多線程(Thread)來執(zhí)行的,每個(gè)線程都在不同的核心上執(zhí)行,可以將GPU看作多個(gè)塊(Block)的組合,每個(gè)塊可以執(zhí)行多個(gè)線程。
CPU及其內(nèi)存稱為主機(jī)(Host),GPU及其內(nèi)存稱為設(shè)備(Device)。CUDA代碼包含主機(jī)和設(shè)備的代碼。
1.4 CUDA開發(fā)環(huán)境
1??支持CUDA的GPU:CUDA架構(gòu)只支持NVIDIA GPU
2??英偉達(dá)顯卡驅(qū)動(dòng)程序
3??標(biāo)準(zhǔn)C編譯器
4??CUDA開發(fā)工具包