一、CUDA和GPU簡介
CUDA(Compute Unified Device Architecture),是顯卡廠商N(yùn)VIDIA推出的運(yùn)算平臺(tái)。 CUDA?是一種由NVIDIA推出的通用并行計(jì)算架構(gòu),該架構(gòu)使GPU能夠解決復(fù)雜的計(jì)算問題。 它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計(jì)算引擎。 開發(fā)人員可以使用C語言來為CUDA?架構(gòu)編寫程序,所編寫出的程序可以在支持CUDA?的處理器上以超高性能運(yùn)行。CUDA3.0已經(jīng)開始支持C++和FORTRAN。
GPU(Graphic Processing Unit):圖形處理器,顯卡的處理核心。電腦顯示器上顯示的圖像,在顯示在顯示器上之前,要經(jīng)過一些列處理,這個(gè)過程有個(gè)專有的名詞叫“渲染"。以前的計(jì)算機(jī)上沒有GPU,渲染就是CPU負(fù)責(zé)的。
渲染是個(gè)什么操作呢,其實(shí)就是做了一系列圖形的計(jì)算,但這些計(jì)算往往非常耗時(shí),占用了CPU的一大部分時(shí)間。而CPU還要處理計(jì)算機(jī)器許多其他任務(wù)。因此就專門針對圖形處理的這些操作設(shè)計(jì)了一種處理器,也就是GPU。這樣CPU就可以從繁重的圖形計(jì)算中解脫出來。
NVIDIA公司在1999年發(fā)布Geforce 256圖形處理芯片時(shí)首先提出GPU的概念,隨后大量復(fù)雜的應(yīng)用需求促使整個(gè)產(chǎn)業(yè)蓬勃發(fā)展至今。
最早的GPU是專門為了渲染設(shè)計(jì)的,那么他也就只能做渲染的那些事情。渲染這個(gè)過程具體來說就是幾何點(diǎn)、位置和顏色的計(jì)算,這些計(jì)算在數(shù)學(xué)上都是用四維向量和變換矩陣的乘法,因此GPU也就被設(shè)計(jì)為專門適合做類似運(yùn)算的專用處理器了。但隨著GPU的發(fā)展,GPU的功能也越來越多,比如現(xiàn)在很多GPU還支持了硬件編解碼。
全球GPU巨頭:NVIDIA(英偉達(dá))AMD(超威半導(dǎo)體)。
二、GPU工作原理與結(jié)構(gòu)
GPU采用流式并行計(jì)算模式,可對每個(gè)數(shù)據(jù)行獨(dú)立的并行計(jì)算。
GPU與CPU區(qū)別:
- CPU基于低延時(shí)設(shè)計(jì),由運(yùn)算器(ALU,Arithmetic and Logic Unit 算術(shù)邏輯單元)和控制器(CU,Control Unit),以及若干個(gè)寄存器和高速緩沖存儲(chǔ)器組成,功能模塊較多,擅長邏輯控制,串行運(yùn)算。
- GPU基于大吞吐量設(shè)計(jì),擁有更多的ALU用于數(shù)據(jù)處理,適合對密集數(shù)據(jù)進(jìn)行并行處理,擅長大規(guī)模并發(fā)計(jì)算,因此GPU也被應(yīng)用于AI訓(xùn)練等需要大規(guī)模并發(fā)計(jì)算場景。
2.1、基礎(chǔ)GPU架構(gòu)
GPU為圖形圖像專門設(shè)計(jì),在矩陣運(yùn)算,數(shù)值計(jì)算方面具有獨(dú)特優(yōu)勢,特別是浮點(diǎn)和并行計(jì)算上能優(yōu)于CPU的數(shù)十?dāng)?shù)百倍的性能。
GPU的優(yōu)勢在于快,而不是效果好。比如用美團(tuán)軟件給一張圖要加上模糊效果,CPU處理的時(shí)候從左到右從上到下進(jìn)行處理??梢钥紤]開多核,但是核數(shù)畢竟有限制,比如4核、8核 分塊處理。
使用GPU進(jìn)行處理,因?yàn)榉謮K之前沒有相互的關(guān)聯(lián)關(guān)系,可以通過GPU并行處理,就不單只是4、 8分塊了,可以切換更多的塊,比如16、64等。
2.2、GPU編程模型
軟件層面上不管什么計(jì)算設(shè)備,大部分異構(gòu)計(jì)算都會(huì)分成主機(jī)代碼和設(shè)備代碼。整體思考過程就是應(yīng)用分析、內(nèi)存資源分配、線程資源分配再到具體核函數(shù)的實(shí)現(xiàn)。
CUDA中線程也可以分成三個(gè)層次:線程、線程塊和線程網(wǎng)絡(luò)。
- 線程是CUDA中基本執(zhí)行單元,由硬件支持、開銷很小,每個(gè)線程執(zhí)行相同代碼;
- 線程塊(Block)是若干線程的分組,Block內(nèi)一個(gè)塊至多512個(gè)線程、或1024個(gè)線程(根據(jù)不同的GPU規(guī)格),線程塊可以是一維、二維或者三維的;
- 線程網(wǎng)絡(luò)(Grid)是若干線程塊的網(wǎng)格,Grid是一維和二維的。
線程用ID索引,線程塊內(nèi)用局部ID標(biāo)記threadID,配合blockDim和blockID可以計(jì)算出全局ID,用于SIMT(Single Instruction Multiple Thread單指令多線程)分配任務(wù)。
首先需要關(guān)注的是具體線程數(shù)量的劃分,在并行計(jì)算部分里也提到數(shù)據(jù)劃分和指令劃分的概念,GPU有很多線程,在CUDA里被稱為thread,同時(shí)我們會(huì)把一組thread歸為一個(gè)block,而block又會(huì)被組織成一個(gè)grid。
假如我們要對一個(gè)長度為1024的數(shù)組做reduce_sum(減少和求和),恰好我們正好有1024個(gè)thread,此時(shí)直接一一對應(yīng)就行,但如果是一張很大的圖片呢?
如果有很多核函數(shù)要處理不同的數(shù)據(jù)呢?GPU上有很多thread,但要完全和實(shí)際應(yīng)用中需要處理的數(shù)據(jù)大小完全匹配是不可能的,事實(shí)上在滿足規(guī)定的情況下我們可以給一個(gè)block內(nèi)部分配很多thread,對于到硬件上也真的是相應(yīng)數(shù)量的thread會(huì)自動(dòng)歸為一組直接在一個(gè)SM上實(shí)行嗎?答案當(dāng)然不是,此時(shí)我們就要關(guān)注硬件,引入了wrap概念,GPU上有很多計(jì)算核心也就是Streaming Multiprocessor (SM),在具體的硬件執(zhí)行中,一個(gè)SM會(huì)同時(shí)執(zhí)行一組線程,在CUDA里叫warp,直接可以理解這組硬件線程會(huì)在這個(gè)SM上同時(shí)執(zhí)行一部分指令,這一組的數(shù)量一般為32或者64個(gè)線程。一個(gè)block會(huì)被綁定到一個(gè)SM上,即使這個(gè)block內(nèi)部可能有1024個(gè)線程,但這些線程組會(huì)被相應(yīng)的調(diào)度器來進(jìn)行調(diào)度,在邏輯層面上我們可以認(rèn)為1024個(gè)線程同時(shí)執(zhí)行,但實(shí)際上在硬件上是一組線程同時(shí)執(zhí)行,這一點(diǎn)其實(shí)就和操作系統(tǒng)的線程調(diào)度一樣。 意思就是假如一個(gè)SM同時(shí)能執(zhí)行64個(gè)線程,但一個(gè)block有1024個(gè)線程,那這1024個(gè)線程是分1024/64=16次執(zhí)行。
解釋完了執(zhí)行層面,再來分析一下內(nèi)存層面上的對應(yīng),一個(gè)block不光要綁定在一個(gè)SM上,同時(shí)一個(gè)block內(nèi)的thread是共享一塊share memory(一般就是SM的一級(jí)緩存,越靠近SM的內(nèi)存就越快)。GPU和CPU也一樣有著多級(jí)cache還有寄存器的架構(gòu),把全局內(nèi)存的數(shù)據(jù)加載到共享內(nèi)存上再去處理可以有效的加速。所以結(jié)合具體的硬件具體的參數(shù)(SM和寄存器數(shù)量、緩存大小等)做出合適的劃分,確保最大化的利用各種資源(計(jì)算、內(nèi)存、帶寬)是做異構(gòu)計(jì)算的核心。
2.3、軟件和硬件的對應(yīng)關(guān)系
GPU在管理線程(thread)的時(shí)候是以block(線程塊)為單元調(diào)度到SM上執(zhí)行。每個(gè)block中以warp(一般32個(gè)線程或64線程)作為一次執(zhí)行的單位(真正的同時(shí)執(zhí)行)。
- 一個(gè) GPU 包含多個(gè) Streaming Multiprocessor ,而每個(gè) Streaming Multiprocessor 又包含多個(gè) core 。Streaming Multiprocessors 支持并發(fā)執(zhí)行多達(dá)幾百的 thread 。
- 一個(gè) thread block 只能調(diào)度到一個(gè) Streaming Multiprocessor 上運(yùn)行,直到 thread block 運(yùn)行完畢。一個(gè)Streaming Multiprocessor 可以同時(shí)運(yùn)行多個(gè)thread block (因?yàn)橛卸鄠€(gè)core)。
通俗點(diǎn)講:stream multiprocessor(SM)是一塊硬件,包含了固定數(shù)量的運(yùn)算單元,寄存器和緩存。
寫cuda kernel的時(shí)候,跟SM對應(yīng)的概念是block,每一個(gè)block會(huì)被調(diào)度到某個(gè)SM執(zhí)行,一個(gè)SM可以執(zhí)行多個(gè)block。 cuda程序就是很多的blocks(一般來說越多越好)均勻的喂給這80個(gè)SM來調(diào)度執(zhí)行。具體每個(gè)block喂給哪個(gè)SM沒法控制。
不同的GPU規(guī)格參數(shù)也不一樣,比如 Fermi 架構(gòu)(2010年的比較老):
- 每一個(gè)SM上最多同時(shí)執(zhí)行8個(gè)block。(不管block大小)
- 每一個(gè)SM上最多同時(shí)執(zhí)行48個(gè)warp。
- 每一個(gè)SM上最多同時(shí)執(zhí)行48*32=1,536個(gè)線程。
當(dāng)warp訪問內(nèi)存的時(shí)候,processor(處理器)會(huì)做context switch(上下文切換),讓其他warp使用硬件資源。因?yàn)槭怯布碜?,所以速度非??臁?/p>
三、GPU應(yīng)用領(lǐng)域
GPU適用于深度學(xué)習(xí)訓(xùn)練和推理,圖像識(shí)別、語音識(shí)別等;計(jì)算金融學(xué)、地震分析、分子建模、基因組學(xué)、計(jì)算流體動(dòng)力學(xué)等;高清視頻轉(zhuǎn)碼、安防視頻監(jiān)控、大型視頻會(huì)議等;三維設(shè)計(jì)與渲染、影音動(dòng)畫制作、工程建模與仿真(CAD/CAE)、醫(yī)學(xué)成像、游戲測試等等。
GPU常見的應(yīng)用領(lǐng)域如下所示:
- 游戲:GeForce RTX/GTX系列GPU(PCs)、GeForce NOW(云游戲)、SHIELD(游戲主機(jī))。
- 專業(yè)可視化:Quadro/RTX GPU(企業(yè)工作站) 。
- 數(shù)據(jù)中心:基于GPU的計(jì)算平臺(tái)和系統(tǒng),包括DGX(AI服務(wù)器)、HGX(超算)、EGX(邊緣計(jì)算)、AGX(自動(dòng)設(shè)備) 。
- 汽車:NVIDIA DRIVE計(jì)算平臺(tái),包括AGX Xavier(SoC芯片)、DRIVE AV(自動(dòng)駕駛)、DRIVE IX(駕駛艙軟件)、Constellation(仿真軟件) 。
- 消費(fèi)電子:智能手機(jī)市場占據(jù)了全球GPU市場份額的主導(dǎo)地位,此外,智能音箱、智能手環(huán)/手表、VR/AR眼鏡等移動(dòng)消費(fèi)電子都是GPU潛在的市場。比如拍照、導(dǎo)航地圖的合成、UI圖標(biāo)、圖像框、照片的后處理等都需要GPU來完成。
更詳細(xì)的應(yīng)用場景參考:華秋元器件:一文看完GPU八大應(yīng)用場景,搶食千億美元市場
GPU算力 TOPs: OPS是Tera Operations Per Second的縮寫,1TOPS代表處理器每秒鐘可進(jìn)行一萬億次操作。
四、GPU+CPU異構(gòu)計(jì)算
異構(gòu)計(jì)算從常見的搭配有CPU+GPU、CPU+FPGA、CPU+DSP等。
CPU的核心少但每一個(gè)核心的控制和計(jì)算能力都不弱,因此常作為主機(jī)。而GPU的計(jì)算核心很多, 所以當(dāng)遇到大數(shù)據(jù)量且邏輯簡單的任務(wù),CPU就會(huì)交給GPU來進(jìn)行計(jì)算,同時(shí)CPU的核心雖少但也是有多個(gè)線程的,多線程可以調(diào)度并同時(shí)控制多張GPU同時(shí)完成多個(gè)任務(wù),這本身也是一種并行思想,并且GPU也可以在接收到任務(wù)后讓CPU的線程先去處理別的事情完成異步控制來進(jìn)一步提高效率(這本質(zhì)上也是一種時(shí)域上的并行)。
之所以出現(xiàn)GPU+CPU異構(gòu)計(jì)算,因?yàn)镃PU和GPU各自有優(yōu)缺點(diǎn):
- CPU 適用于一系列廣泛的工作負(fù)載,特別是那些對于延遲和單位內(nèi)核性能要求較高的工作負(fù)載。作為強(qiáng)大的執(zhí)行引擎, CPU 將它數(shù)量相對較少的內(nèi)核集中用于處理單個(gè)任務(wù),并快速將其完成。這使它尤其適合用于處理從串行計(jì)算到數(shù)據(jù)庫 運(yùn)行等類型的工作。
- GPU 最初是作為專門用于加速特定 3D 渲染任務(wù)的 ASIC 開發(fā)而成的。隨著時(shí)間的推移,這些功能固定的引擎變得更加可編程化、更加靈活。盡管圖形處理和當(dāng)下視覺效果越來越真實(shí)的頂級(jí)游戲仍是 GPU 的主要功能,但同時(shí),它也已經(jīng)演 化為用途更普遍的并行處理器,能夠處理越來越多的應(yīng)用程序。
五、MPI與CUDA的區(qū)別
MPI全稱Massage Passing Interface是支持c、c++等語言的并行編程的拓展庫,主要是負(fù)責(zé)多進(jìn)程之間的通信。用于編寫并行計(jì)算程序。我們通過MPI并行庫來編寫并行化的程序。
由于“天河二號(hào)”等高性能計(jì)算機(jī)在運(yùn)行的時(shí)候是同一個(gè)程序會(huì)運(yùn)行在很多節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)上都是一個(gè)進(jìn)程。這些進(jìn)程也就是這些節(jié)點(diǎn)之間需要相互通信來達(dá)到程序的并行。因此想要利用“天河二號(hào)”的計(jì)算能力來幫助自己運(yùn)行程序,就需要將自己的程序改為MPI的并行程序,至于超級(jí)計(jì)算機(jī)分配哪些任務(wù)給哪些節(jié)點(diǎn)是我們不需要知道的,以及節(jié)點(diǎn)之間如何通信,利用中心架構(gòu)進(jìn)行通信還是非中心架構(gòu)進(jìn)行通信也是我們不需要知道的,我們要了解的就是如何將自己在個(gè)人計(jì)算機(jī)上運(yùn)行的普通程序改成可以在超級(jí)計(jì)算機(jī)上運(yùn)行的MPI程序即可。
MPI框架下,同一個(gè)程序在多個(gè)節(jié)點(diǎn)中以進(jìn)程形式存在,這些進(jìn)程組成一個(gè)group,每個(gè)進(jìn)程都有唯一的進(jìn)程號(hào),MPI的點(diǎn)對點(diǎn)通信有兩種,一種是消息發(fā)送,一種是消息的接收,最簡單的為MPI_Send()和MPI_Recv()。
相對應(yīng)的,還有另外三種通信方式緩存通信、同步通信、就緒通信。
(1)緩存通信:用戶提供通信緩沖區(qū),避免了系統(tǒng)內(nèi)存拷貝,提高了通信效率,但是緩沖區(qū)需用戶自己管理。
(2)同步通信:發(fā)送進(jìn)程只有當(dāng)接受進(jìn)程開始接收(不需要全部接收)的時(shí)候才返回。
(3)就緒通信:發(fā)送進(jìn)程的發(fā)送操作只有當(dāng)接受進(jìn)程已經(jīng)開啟了接收操作的時(shí)候才能夠成功調(diào)用,否則發(fā)送操作將會(huì)出錯(cuò)。文章來源:http://www.zghlxwxcb.cn/news/detail-824141.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-824141.html
到了這里,關(guān)于一文了解GPU并行計(jì)算CUDA的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!