為什么我們總說(shuō)GPU比CPU要強(qiáng)大,既然GPU強(qiáng)大,為什么不能取代CPU呢?
答案就是CPU工作方式和GPU的工作方式截然不同,下面的兩張圖有助于幫助我們理解CPU和GPU的工作方式的不同。
上圖有幾個(gè)重點(diǎn)的元素,也是我們下文重點(diǎn)要闡述的概念,綠色代表的是computational units(可計(jì)算單元) 或者稱(chēng)之為 cores(核心),橙色代表memories(內(nèi)存) ,黃色代表的是control units(控制單元)。
因此想要理解GPU的底層核心構(gòu)成,就必須明確這幾個(gè)元素的作用,下文會(huì)逐一講解每個(gè)元素的作用。
01.計(jì)算單元(cores)
總的來(lái)看,我們可以這樣說(shuō):CPU的計(jì)算單元是“大”而“少”的,然而GPU的計(jì)算單元是“小”而“多”的。
這里的大小是指的計(jì)算能力,多少指的是設(shè)備中的數(shù)量。通過(guò)觀(guān)察上圖,顯然可以看出,計(jì)算單元(綠色的部分),CPU“大少”,GPU“小多”的特點(diǎn)。
CPU的cores 比GPU的cores要更加聰明(smarter),這也是所謂“大”的特點(diǎn)。
在過(guò)去的很長(zhǎng)時(shí)間里,CPU的core計(jì)算能力增長(zhǎng)是得益于主頻時(shí)鐘最大的頻率增長(zhǎng)。
相反,GPU不僅沒(méi)有主頻時(shí)鐘的提升,而且還經(jīng)歷過(guò)主頻下降的情況,因?yàn)镚PU需要適應(yīng)嵌入式應(yīng)用環(huán)境,在這個(gè)環(huán)境下對(duì)功耗的要求是比較高的,不能容忍超高主頻的存在。
例如英偉達(dá)的Jetson NANO, 安裝在室內(nèi)導(dǎo)航機(jī)器人身上,就是一個(gè)很好的嵌入式環(huán)境應(yīng)用示例,安裝在機(jī)器人身上,就意味著使用電池供電,GPU的功耗不可以過(guò)高。
CPU比GPU聰明,很大一個(gè)原因就是CPU擁有"out-of-order exectutions"(亂序執(zhí)行)功能。
出于優(yōu)化的目的,CPU可以用不同于輸入指令的順序執(zhí)行指令,當(dāng)遇到分支的時(shí)候,它可以預(yù)測(cè)在不久的將來(lái)哪一個(gè)指令最有可能被執(zhí)行到(multiple branch prediction 多重分支預(yù)測(cè))。
通過(guò)這種方式,它可以預(yù)先準(zhǔn)備好操作數(shù),并且提前執(zhí)行他們(soeculative execution 預(yù)測(cè)執(zhí)行),通過(guò)上述的幾種方式節(jié)省了程序運(yùn)行時(shí)間。
顯然現(xiàn)代CPU擁有如此多的提升性能的機(jī)制,這是比GPU聰明的地方。
相比之下,GPU的core不能做任何類(lèi)似out-of-order exectutions那樣復(fù)雜的事情。
總的來(lái)說(shuō),GPU的core只能做一些最簡(jiǎn)單的浮點(diǎn)運(yùn)算,例如 multiply-add(MAD)或者 fused multiply-add(FMA)指令。
通過(guò)上圖可以看出MAD指令實(shí)際是計(jì)算A*B+C的值。
實(shí)際上,現(xiàn)代GPU結(jié)構(gòu),CORE不僅僅可以結(jié)算FMA這樣簡(jiǎn)單的運(yùn)算,還可以執(zhí)行更加復(fù)雜的運(yùn)算操作,例如tensor張量(tensor core)或者光線(xiàn)追蹤(ray tracing core)相關(guān)的操作。
張量核心 (tensor cores) 的目的在于服務(wù)張量操作在一些人工智能運(yùn)算場(chǎng)合,光纖追蹤(ray tracing) 旨在服務(wù)超現(xiàn)實(shí)主義(hyper-realistic)實(shí)時(shí)渲染的場(chǎng)合。
上文說(shuō)到,GPU Core最開(kāi)始只是支持一些簡(jiǎn)單的浮點(diǎn)運(yùn)算FMA, 后來(lái)經(jīng)過(guò)發(fā)展又增加了一些復(fù)雜運(yùn)算的機(jī)制tensor core以及ray trace,但是總體來(lái)說(shuō)GPU的計(jì)算靈活性還是比不上CPU的核心。
值得一提的是,GPU的編程方式是SIMD(Single Instruction Multiple Data)意味著所有Core的計(jì)算操作完全是在相同的時(shí)間內(nèi)進(jìn)行的,但是輸入的數(shù)據(jù)有所不同。
顯然,GPU的優(yōu)勢(shì)不在于核心的處理能力,而是在于他可以大規(guī)模并行處理數(shù)據(jù)。
GPU中每個(gè)核心的作用有點(diǎn)像羅馬帆船上的槳手:鼓手打著節(jié)拍(時(shí)鐘),槳手跟著節(jié)拍一同滑動(dòng)帆船。
SIMT編程模型允許加速運(yùn)行非常多的應(yīng)用,對(duì)圖像進(jìn)行縮放就是一個(gè)很好的例子。
在這個(gè)例子中,每個(gè)core對(duì)應(yīng)圖像的一個(gè)像素點(diǎn),這樣就可以并行的處理每一個(gè)像素點(diǎn)的縮放操作,如果這個(gè)工作給到CPU來(lái)做,需要N的時(shí)間才可以做完,但是給到GPU只需要一個(gè)時(shí)鐘周期就可以完成。
當(dāng)然,這樣做的前提是有足夠的core來(lái)覆蓋所有的圖像像素點(diǎn)。這個(gè)問(wèn)題有個(gè)顯著的特點(diǎn),就是對(duì)一張圖像進(jìn)行縮放操作,各個(gè)像素點(diǎn)之間的信息是相互獨(dú)立的,因此可以獨(dú)立的放在不同的core中進(jìn)行并行運(yùn)算。
我們認(rèn)為不同的core操作的信息相互獨(dú)立,是符合SIMT的模型的,使用SIMT來(lái)解決這樣的問(wèn)題非常方便。
但是,也不是所有的問(wèn)題都是符合SIMT模型的,尤其在異步問(wèn)題中,在這樣的問(wèn)題中,不同的core之間要相互交互信息,計(jì)算的結(jié)構(gòu)不規(guī)則,負(fù)載不均衡,這樣的問(wèn)題交給GPU來(lái)處理就會(huì)比較復(fù)雜。
02.內(nèi)存memory
回到這個(gè)文章的第一張圖中來(lái),我們接下來(lái)會(huì)討論GPU和CPU內(nèi)存方面的差別。
CPU的memory系統(tǒng)一般是基于DRAM的,在桌面PC中,一般來(lái)說(shuō)是8G,在服務(wù)器中能達(dá)到數(shù)百(256)Gbyte。
CPU內(nèi)存系統(tǒng)中有個(gè)重要的概念就是cache,是用來(lái)減少CPU訪(fǎng)問(wèn)DRAM的時(shí)間。cache是一片小的內(nèi)存區(qū)域,但是訪(fǎng)問(wèn)速度更快,更加靠近處理器核心的內(nèi)存段,用來(lái)儲(chǔ)存DRAM中的數(shù)據(jù)副本。
cache一般有一個(gè)分級(jí),通常分為三個(gè)級(jí)別L1,L2,L3 cache,cache離核心越近就越小訪(fǎng)問(wèn)越快,例如 L1可以是64KB L2就是256KB L3是4MB。
CPU Cache的內(nèi)容不再這里展開(kāi)講解,感興趣的讀者可以自行查閱資料。
從第一張圖可以看到GPU中有一大片橙色的內(nèi)存,名稱(chēng)為DRAM,這一塊被稱(chēng)為全局內(nèi)存或者GMEM。
GMEM的內(nèi)存大小要比CPU的DRAM小的多,在最便宜的顯卡中一般只有幾個(gè)G的大小,在最好的顯卡中GMEM可以達(dá)到24G。
GMEM的尺寸大小是科學(xué)計(jì)算使用中的主要限制。十年前,顯卡的容量最多也就只有512M,但是,現(xiàn)在已經(jīng)完全克服了這個(gè)問(wèn)題。
關(guān)于cache,從第一張圖中不難推斷,左上角的小橙色塊就是GPU的cache段。然而GPU的緩存機(jī)制和CPU是存在一定的差異的,稍后將會(huì)證明這一點(diǎn)。
03.GPU的底層結(jié)構(gòu)
為了充分理解GPU的架構(gòu),讓我們?cè)诜祷貋?lái)看下第一張圖,一個(gè)顯卡中絕大多數(shù)都是計(jì)算核心core組成的海洋。
在圖像縮放的例子中,core與core之間不需要任何協(xié)作,因?yàn)樗麄兊娜蝿?wù)是完全獨(dú)立的,然而,GPU解決的問(wèn)題不一定這么簡(jiǎn)單,讓我們來(lái)舉個(gè)例子。
假設(shè)我們需要對(duì)一個(gè)數(shù)組里的數(shù)進(jìn)行求和,這樣的運(yùn)算屬于reductuin family類(lèi)型,因?yàn)檫@樣的運(yùn)算試圖將一個(gè)序列“reduce”簡(jiǎn)化為一個(gè)數(shù)。
計(jì)算數(shù)組的元素總和的操作看起來(lái)是順序的,我們只需要獲取第一個(gè)元素,求和到第二個(gè)元素中,獲取結(jié)果,再將結(jié)果求和到第三個(gè)元素,以此類(lèi)推。
令人驚訝的是,一些看起來(lái)本質(zhì)是順序的運(yùn)算,其實(shí)可以再并行算法中轉(zhuǎn)化。
假設(shè)一個(gè)長(zhǎng)度為8的數(shù)組,在第一步中完全可以并行執(zhí)行兩個(gè)元素和兩個(gè)元素的求和,從而同時(shí)獲得四個(gè)元素,兩兩相加的結(jié)果,以此類(lèi)推,通過(guò)并行的方式加速數(shù)組求和的運(yùn)算速度。具體的操作如下圖所示:
如上圖計(jì)算方式,如果是長(zhǎng)度為8的數(shù)組兩兩并行求和計(jì)算,那么只需要三次就可以計(jì)算出結(jié)果。
如果是順序計(jì)算需要8次。如果按照兩兩并行相加的算法,N個(gè)數(shù)字相加,那么僅需要log2(N)次就可以完成計(jì)算。
從GPU的角度來(lái)講,只需要四個(gè)core就可以完成長(zhǎng)度為8的數(shù)組求和算法,我們將四個(gè)core編號(hào)為0,1,2,3。
那么第一個(gè)時(shí)鐘下,兩兩相加的結(jié)果通過(guò)0號(hào)core計(jì)算,放入了0號(hào)core可以訪(fǎng)問(wèn)到的內(nèi)存中,另外兩兩對(duì)分別由1號(hào)2號(hào)3號(hào)core來(lái)計(jì)算,第二個(gè)個(gè)時(shí)鐘繼續(xù)按照之前的算法計(jì)算,只需要0號(hào)和1號(hào)兩個(gè)core即可完成。
以此類(lèi)推,最終的結(jié)果將在第三個(gè)時(shí)鐘由0號(hào)core計(jì)算完成,并儲(chǔ)存在0號(hào)core可以訪(fǎng)問(wèn)到的內(nèi)存中。這樣實(shí)際三次就能完成長(zhǎng)度為8的數(shù)組求和計(jì)算。
如果GPU想要完成上述的推理計(jì)算過(guò)程,顯然,多個(gè)core之間要可以共享一段內(nèi)存空間以此來(lái)完成數(shù)據(jù)之間的交互,需要多個(gè)core可以在共享的內(nèi)存空間中完成讀/寫(xiě)的操作。
我們希望每個(gè)Cores都有交互數(shù)據(jù)的能力,但是不幸的是,一個(gè)GPU里面可以包含數(shù)以千計(jì)的core,如果使得這些core都可以訪(fǎng)問(wèn)共享的內(nèi)存段是非常困難和昂貴的。
出于成本的考慮,折中的解決方案是將各類(lèi)GPU的core分類(lèi)為多個(gè)組,形成多個(gè)流處理器(Streaming Multiprocessors )或者簡(jiǎn)稱(chēng)為SMs。
04.GPU架構(gòu)
上圖的綠色部分意味著Core計(jì)算單元,綠色的塊就是上文談到的Streaming Multiprocessors,理解為Core的集合。
黃色的部分名為RT COREs畫(huà)的離SMs非常近。單個(gè)SM的圖靈架構(gòu)如下圖所示
在SM的圖靈結(jié)構(gòu)中,綠色的部分CORE相關(guān)的,我們進(jìn)一步區(qū)分了不同類(lèi)型的CORE。主要分為INT32,FP32,TENSOR CORES。
1. FP32 Cores,執(zhí)行單進(jìn)度浮點(diǎn)運(yùn)算,在TU102卡中,每個(gè)SM由64個(gè)FP32核,圖靈102由72個(gè)SM因此,F(xiàn)P32 Core的數(shù)量是 72 * 64。
2. FP64 Cores. 實(shí)際上每個(gè)SM都包含了2個(gè)64位浮點(diǎn)計(jì)算核心FP64 Cores,用來(lái)計(jì)算雙精度浮點(diǎn)運(yùn)算,雖然上圖沒(méi)有畫(huà)出,但是實(shí)際是存在的。
3. Integer Cores,這些core執(zhí)行一些對(duì)整數(shù)的操作,例如地址計(jì)算,可以和浮點(diǎn)運(yùn)算同時(shí)執(zhí)行指令。在前幾代GPU中,執(zhí)行這些整型操作指令都會(huì)使得浮點(diǎn)運(yùn)算的管道停止工作。TU102總共由4608個(gè)Integer Cores,每個(gè)SM有64個(gè)intCores。
4. Tensor Cores,張量core是FP16單元的變種,認(rèn)為是半精度單元,致力于張量積算加速常見(jiàn)的深度學(xué)習(xí)操作。
圖靈張量Core還可以執(zhí)行INT8和INT4精度的操作,用于可以接受量化而且不需要FP16精度的應(yīng)用場(chǎng)景,在TU102中,我們每個(gè)SM有8個(gè)張量Cores,一共有8 * 72個(gè)Tensor Cores。
在大致描述了GPU的執(zhí)行部分之后,讓我們回到上文提出的問(wèn)題,各個(gè)核心之間如何完成彼此的協(xié)作?
在四個(gè)SM塊的底部有一個(gè)96KB的L1 Cache,用淺藍(lán)色標(biāo)注的。這個(gè)cache段是允許各個(gè)Core都可以訪(fǎng)問(wèn)的段,在L1 Cache中每個(gè)SM都有一塊專(zhuān)用的共享內(nèi)存。
作為芯片上的L1 cache他的大小是有限的,但它非常快,肯定比訪(fǎng)問(wèn)GMEM快得多。
實(shí)際上L1 CACHE擁有兩個(gè)功能,一個(gè)是用于SM上Core之間相互共享內(nèi)存,另一個(gè)則是普通的cache功能。
當(dāng)Core需要協(xié)同工作,并且彼此交換結(jié)果的時(shí)候,編譯器編譯后的指令會(huì)將部分結(jié)果儲(chǔ)存在共享內(nèi)存中,以便于不同的core獲取到對(duì)應(yīng)數(shù)據(jù)。
當(dāng)用做普通cache功能的時(shí)候,當(dāng)core需要訪(fǎng)問(wèn)GMEM數(shù)據(jù)的時(shí)候,首先會(huì)在L1中查找,如果沒(méi)找到,則回去L2 cache中尋找,如果L2 cache也沒(méi)有,則會(huì)從GMEM中獲取數(shù)據(jù),L1訪(fǎng)問(wèn)最快 L2 以及GMEM遞減。
緩存中的數(shù)據(jù)將會(huì)持續(xù)存在,除非出現(xiàn)新的數(shù)據(jù)做替換。從這個(gè)角度來(lái)看,如果Core需要從GMEM中多次訪(fǎng)問(wèn)數(shù)據(jù),那么編程者應(yīng)該將這塊數(shù)據(jù)放入功能內(nèi)存中,以加快他們的獲取速度。
其實(shí)可以將共享內(nèi)存理解為一段受控制的cache,事實(shí)上L1 cache和共享內(nèi)存是同一塊電路中實(shí)現(xiàn)的。編程者有權(quán)決定L1 的內(nèi)存多少是用作cache多少是用作共享內(nèi)存。
最后,也是比較重要的是,可以?xún)?chǔ)存各個(gè)core的計(jì)算中間結(jié)果,用于各個(gè)核心之間共享的內(nèi)存段不僅僅可以是共享內(nèi)存L1,也可以是寄存器,寄存器是離core最近的內(nèi)存段,但是也非常小。
最底層的思想是每個(gè)線(xiàn)程都可以擁有一個(gè)寄存器來(lái)儲(chǔ)存中間結(jié)果,每個(gè)寄存器只能由相同的一個(gè)線(xiàn)程來(lái)訪(fǎng)問(wèn),或者由相同的warp或者組的線(xiàn)程訪(fǎng)問(wèn)。
05.總結(jié)
GPU的基本底層構(gòu)成,主要是以GPU計(jì)算核心 Cores,以及Memory以及控制單元,三大組成要素組成。
Core是計(jì)算的基本單元,既可以用作簡(jiǎn)單的浮點(diǎn)運(yùn)算,又可以做一些復(fù)雜的運(yùn)算例如,tensor 或者ray tracing。
多個(gè)core之間通訊的方式:
在特定的應(yīng)用場(chǎng)合多個(gè)core之間是不需要的通訊的,也就是各干各的(例如 圖像縮放)。但是也有一些例子,多個(gè)core之間要相互通訊配合(例如上文談到的數(shù)組求和問(wèn)題),每個(gè)core之間都可以實(shí)現(xiàn)交互數(shù)據(jù)是非常昂貴的,因此提出了SM的概念,SM是多個(gè)core的集合,一個(gè)SM里面的cores可以通過(guò)L1 Cache進(jìn)行交互信息,完成使用GPU處理數(shù)組求和問(wèn)題的時(shí)候,多個(gè)核心共享數(shù)據(jù)的功能。
關(guān)于memory,存在全局的內(nèi)存GMEM,但是訪(fǎng)問(wèn)較慢,Cores當(dāng)需要訪(fǎng)問(wèn)GMEM的時(shí)候會(huì)首先訪(fǎng)問(wèn)L1,L2如果都miss了,那么才會(huì)花費(fèi)大代價(jià)到GMEM中尋找數(shù)據(jù)。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19896瀏覽量
235290 -
cpu
+關(guān)注
關(guān)注
68文章
11080瀏覽量
217116 -
gpu
+關(guān)注
關(guān)注
28文章
4948瀏覽量
131256
原文標(biāo)題:深入理解GPU硬件架構(gòu)及運(yùn)行機(jī)制
文章出處:【微信號(hào):算力基建,微信公眾號(hào):算力基建】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
蘋(píng)果宣布iPhone OS 4 多任務(wù)運(yùn)行機(jī)制詳解
Arduino為什么只有l(wèi)oop和setup函數(shù),揭開(kāi)Arduino的神秘面紗--運(yùn)行機(jī)制
NVIDIA火熱招聘GPU高性能計(jì)算架構(gòu)師
計(jì)算機(jī)操作系統(tǒng)的運(yùn)行機(jī)制和體系結(jié)構(gòu)
ARM架構(gòu)的GPU和臺(tái)式機(jī)的GPU有什么區(qū)別
CPU的基本結(jié)構(gòu)和運(yùn)行機(jī)制
MCU總結(jié)結(jié)構(gòu)和程序運(yùn)行機(jī)制的相關(guān)資料分享
Linux系統(tǒng)是如何去實(shí)現(xiàn)多用戶(hù)運(yùn)行機(jī)制的呢
Linux系統(tǒng)的fork運(yùn)行機(jī)制分析

SSL和TLS協(xié)議運(yùn)行機(jī)制的資料詳細(xì)概述

深入GPU硬件架構(gòu)及運(yùn)行機(jī)制(下)
GPU硬件架構(gòu)及運(yùn)行機(jī)制(下)
php運(yùn)行機(jī)制和原理
揭秘GPU: 高端GPU架構(gòu)設(shè)計(jì)的挑戰(zhàn)

評(píng)論