GPGPU的流式多處理器微架構(gòu)原理解析_第1頁(yè)
GPGPU的流式多處理器微架構(gòu)原理解析_第2頁(yè)
GPGPU的流式多處理器微架構(gòu)原理解析_第3頁(yè)
GPGPU的流式多處理器微架構(gòu)原理解析_第4頁(yè)
GPGPU的流式多處理器微架構(gòu)原理解析_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WordGPGPU的流式多處理器微架構(gòu)原理解析

?

陳巍博士:存算一體/(GPU)架構(gòu)和(AI)專家,高級(jí)職稱。中關(guān)村(云計(jì)算)產(chǎn)業(yè)聯(lián)盟,中國(guó)(光學(xué))工程學(xué)會(huì)專家,國(guó)際計(jì)算機(jī)學(xué)會(huì)(ACM)會(huì)員,中國(guó)計(jì)算機(jī)學(xué)會(huì)(CCF)專業(yè)會(huì)員。

耿云川博士:資深SoC設(shè)計(jì)專家,軟(硬件)協(xié)同設(shè)計(jì)專家,擅長(zhǎng)(人工智能)加速芯片設(shè)計(jì)。

流式多處理器(StreamMulti-processor,SM)是構(gòu)建整個(gè)GPU的核心模塊(執(zhí)行整個(gè)KernelGrid),一個(gè)流式多處理器上一般同時(shí)運(yùn)行多個(gè)線程塊。每個(gè)流式多處理器可以視為具有較小結(jié)構(gòu)的(CPU),支持指令并行(多發(fā)射)。流式多處理器是線程塊的運(yùn)行載體,但一般不支持亂序執(zhí)行。每個(gè)流式多處理器上的單個(gè)Warp以SIMD方式執(zhí)行相同指令。

圖3-1流式多處理器在GPU架構(gòu)中的位置(以NVIDIA(Te)sla架構(gòu)為例,修改自NVIDIA)

3.1整體微架構(gòu)

圖3-3是流式多處理器(SM,(AMD)稱之為計(jì)算單元)微架構(gòu)(根據(jù)公開文獻(xiàn)和專利信息綜合獲得)。

流式多處理器按照流水線可以分為SIMT前端和SIMD后端。整個(gè)流水線處理劃分為六個(gè)階段,包括取指、譯碼、發(fā)射、操作數(shù)傳送、執(zhí)行與寫回。

圖3-2GPGPU的流式多處理器結(jié)構(gòu)劃分

SIMD即單指令多數(shù)據(jù),采用一個(gè)控制器來(lái)控制多組計(jì)算單元(或處理器),同時(shí)對(duì)一組數(shù)據(jù)(向量)中的每一個(gè)數(shù)據(jù)分別執(zhí)行相同的操作從而實(shí)現(xiàn)空間并行性計(jì)算的技術(shù)。

SIMT即單指令多線程,多個(gè)線程對(duì)不同的數(shù)據(jù)集執(zhí)行相同指令。SIMT的的優(yōu)勢(shì)在于無(wú)須把數(shù)據(jù)整理為合適的矢量長(zhǎng)度,并且SIMT允許每個(gè)線程有不同的邏輯分支。

按照軟件級(jí)別,SIMT層面,流式多處理器由線程塊組成,每個(gè)線程塊由多個(gè)線程束組成;SIMD層面,每個(gè)線程束內(nèi)部在同一時(shí)間執(zhí)行相同指令,對(duì)應(yīng)不同數(shù)據(jù),由統(tǒng)一的線程束調(diào)度器(Warpscheduler)調(diào)度。

一般意義上的CUDA核,對(duì)應(yīng)于流處理器(SP),以計(jì)算單元和分發(fā)端口為主組成。

線程塊調(diào)度程序?qū)⒕€程塊分派給SIMT前端,線程在流式多處理器上以Warp為單位并行執(zhí)行。

圖3-3GPGPU的流式多處理器微架構(gòu)

流式多處理器中的主要模塊包括:

取指單元(I-Fetch):負(fù)責(zé)將指令請(qǐng)求發(fā)送到指令緩存。并將程序計(jì)數(shù)器(PC)指向下一條指令。

指令緩存(I-Cache):如來(lái)自取指單元的請(qǐng)求在指令緩存中被命中,則將指令傳送給譯碼單元,否則把請(qǐng)求保存在未命中狀態(tài)保持(寄存器)(MSHR)中。

譯碼單元(Decode):將指令解碼并轉(zhuǎn)發(fā)至I-Buffer。該單元還將源和目標(biāo)寄存器信息轉(zhuǎn)發(fā)到記分牌,并將指令類型、目標(biāo)地址(用于分支)和其他控制流相關(guān)信息轉(zhuǎn)發(fā)到SIMT堆棧。

SIMT堆棧(SIMTStack):SIMT堆棧負(fù)責(zé)管理控制流相關(guān)的指令和提供下一程序計(jì)數(shù)器相關(guān)的信息。

記分牌(Scoreboard):用于支持指令級(jí)并行。并行執(zhí)行多條獨(dú)立指令時(shí),由記分牌跟蹤掛起的寄存器寫入狀態(tài)避免重復(fù)寫入。

指令緩沖(I-Buffer):保存所有Warp中解碼后的指令信息。Warp的循環(huán)調(diào)度策略決定了指令發(fā)射到執(zhí)行和寫回階段的順序。

后端執(zhí)行單元:后端執(zhí)行單元包括CUDA核心(相當(dāng)于ALU)、特殊功能函數(shù)、LD/ST單元、張量核心(Tensorcore)。特殊功能單元的數(shù)量通常比較少,計(jì)算相對(duì)復(fù)雜且執(zhí)行速度較慢。(例如,正弦、余弦、倒數(shù)、平方根)。

共享存儲(chǔ):除了寄存器文件,流式多處理器也有共享存儲(chǔ),用于保存線程塊不同線程經(jīng)常使用的公共數(shù)據(jù),以減少對(duì)全局內(nèi)存的訪問頻率。

3.2取指與譯碼

圖3-4GPU執(zhí)行流程(修改自GPGPU-Sim)

取指-譯碼-執(zhí)行,是處理器運(yùn)行指令所遵循的一般周期性操作。

取指一般是指按照當(dāng)前存儲(chǔ)在程序計(jì)數(shù)器(Prog(ram)Counter,PC)中的存儲(chǔ)地址,取出下一條指令,并存儲(chǔ)到指令寄存器中的過程。在取指操作結(jié)束時(shí),PC指向?qū)⒃谙乱粋€(gè)周期讀取的下一條指令。

譯碼一般是指將存儲(chǔ)在指令寄存器中的指令解釋為傳輸給執(zhí)行單元的一系列控制(信號(hào))。

圖3-5取指譯碼結(jié)構(gòu)

在GPGPU中,譯碼之后要對(duì)指令進(jìn)行調(diào)度,以保證后繼執(zhí)行單元的充分利用。這一調(diào)度通過線程束調(diào)度器(WarpScheduler)實(shí)現(xiàn)。

線程束是為了提高效率打包的線程集合(NVIDIA稱之為Warps,AMD稱為Wavefronts)。在每一個(gè)循環(huán)中的調(diào)度單位是Warp,同一個(gè)Warp內(nèi)每個(gè)線程在同一時(shí)刻執(zhí)行相同命令。

取指與譯碼操作過程如下:

取指模塊(I-Fetch)根據(jù)PC指向的指令,從內(nèi)存中獲取到相應(yīng)的指令塊。需要注意的是,在GPGPU中,一般沒有CPU中常見的亂序執(zhí)行。

圖3-5取指模塊

指令緩存(I-Cache)讀取固定數(shù)量的字節(jié)(對(duì)齊),并將指令位存儲(chǔ)到寄存器中。

對(duì)I-Cache的請(qǐng)求會(huì)導(dǎo)致命中、未命中或保留失?。≧eservationfail)。保留失敗發(fā)生于未命中保持寄存器(MSHR)已滿或指令緩存中沒有可替換的區(qū)塊。不管命中或者未命中,循環(huán)取指都會(huì)移向下一Warp。

在命中的情況下,獲取的指令被發(fā)送到譯碼階段。在未命中的情況下,指令緩存將生成請(qǐng)求。當(dāng)接收到未命中響應(yīng)時(shí),新的指令塊被加載到指令緩存中,然后Warp再次訪問指令緩存。

指令緩沖(I-Buffer)用于從I-Cache中獲取指令后對(duì)譯碼后的指令進(jìn)行緩沖。最近獲取的指令被譯碼器譯碼并存儲(chǔ)在I-Buffer中的相應(yīng)條目中,等待發(fā)射。

每個(gè)Warp都至少對(duì)應(yīng)兩個(gè)I-Buffer。每個(gè)I-Buffer條目都有一個(gè)有效位(Valid)、就緒位(Re(ad)y)和一個(gè)存于此Warp的已解碼的指令。有效位表示在I-Buffer中的該已解碼的指令還未發(fā)射,而就緒位則表示該Warp的已解碼的指令已準(zhǔn)備好發(fā)射到執(zhí)行流水線。

圖3-4指令緩沖

當(dāng)Warp內(nèi)的I-Buffer為空時(shí),Warp以循環(huán)順序訪問指令緩存。(默認(rèn)情況下,會(huì)獲取兩條連續(xù)的指令)這時(shí)對(duì)應(yīng)指令在I-Buffer中的有效位被激活,直到該Warp的所有提取的指令都被發(fā)送到執(zhí)行流水線。

當(dāng)所有線程都已執(zhí)行,且沒有任何未完成的存儲(chǔ)或?qū)Ρ镜丶拇嫫鞯膾炱饘懭?,則Warp完成執(zhí)行且不再取指。當(dāng)線程塊中的所有Warp都執(zhí)行完成且沒有掛起的操作,標(biāo)記線程塊完成。所有線程塊完成標(biāo)記為內(nèi)核已完成。

相對(duì)于CPU,GPU的前端一般沒有亂序發(fā)射,每個(gè)核心的尺寸就可以更小,算力更密集。

3.3發(fā)射

發(fā)射是指令就緒后,從指令緩沖進(jìn)入到執(zhí)行單元的過程。

在(譯碼后的)指令發(fā)射階段,指令循環(huán)仲裁選擇一個(gè)Warp,將I-Buffer中的發(fā)射到流水線的后級(jí),且每個(gè)周期可從同一Warp發(fā)射多條指令。

所發(fā)射的有效指令應(yīng)符合以下條件:

在Warp里未被設(shè)置為屏障等待狀態(tài);

在I-Buffer中已被設(shè)置為有效指令(有效位被置為1);

已通過計(jì)分板(Scoreboard)檢查;

指令流水線的操作數(shù)訪問階段處于有效狀態(tài)。

在GPU中,不同的線程束的不同指令,經(jīng)由SIMT堆棧和線程束調(diào)度,選擇合適的就緒的指令發(fā)射。

在發(fā)射階段,存儲(chǔ)相關(guān)指令(Load、Store等)被發(fā)送至存儲(chǔ)流水線進(jìn)行相關(guān)存儲(chǔ)操作。其他指令被發(fā)送至后級(jí)SP(流處理器)進(jìn)行相關(guān)計(jì)算。

3.3.1SIMT堆棧

SIMT堆棧用于在Warp前處理SIMT架構(gòu)的分支分化的執(zhí)行。一般采用后支配堆棧重收斂機(jī)制來(lái)減少分支分化對(duì)計(jì)算效率的負(fù)面影響。

SIMT堆棧的條目代表不同的分化級(jí)別,每個(gè)條目存儲(chǔ)新分支的目標(biāo)PC、后繼的直接主要再收斂PC和分布到該分支的線程的活動(dòng)掩碼。在每個(gè)新的分化分支,一個(gè)新條目被推到棧頂;而當(dāng)Warp到達(dá)其再收斂點(diǎn)時(shí),棧頂條目則被彈出。每個(gè)Warp的SIMT堆棧在該Warp的每個(gè)指令發(fā)出后更新。

線程束分化

從功能角度來(lái)看,雖然SIMT架構(gòu)下每個(gè)線程獨(dú)立執(zhí)行,但在實(shí)際的計(jì)算過程中會(huì)遇到一些分支的處理,即有些線程執(zhí)行一個(gè)分支,而另外的線程則執(zhí)行其他分支。如果在同一個(gè)Warp內(nèi)不同的線程執(zhí)行不同的分支,就會(huì)造成線程束分化,導(dǎo)致后繼SIMD計(jì)算的效率降低。因此應(yīng)盡量避免線程束的分化。

圖3-6線程束分化與重(聚合)

SIMT堆棧功能

SIMT堆棧模塊可有效改善線程束分化引起的GPGPU執(zhí)行單元利用率下降的問題。

SIMT堆棧重點(diǎn)解決:

控制流嵌套問題(NestedControlFlow)

在控制流嵌套中,一個(gè)分支嚴(yán)重地依賴另一個(gè)分支,這極大影響了線程的獨(dú)立性。

如何跳過計(jì)算過程(SkipComputation)

由于線程束分支的存在,導(dǎo)致同一個(gè)Warp內(nèi)的有些線程并不必要執(zhí)行某些計(jì)算指令。

3)SIMT掩碼

SIMT堆棧中使用了SIMT掩碼(SIMTMask)來(lái)處理線程束分化問題,以下例來(lái)說明掩碼如何控制整個(gè)Warp的執(zhí)行。

4)

SIMT掩碼引起的死鎖問題

SIMT掩碼可以解決Warp內(nèi)分支執(zhí)行問題,通過串行執(zhí)行完畢分支之后,線程在ReconvergePoint(重合點(diǎn))又重新聚合在一起以便最大提高其并行能力。

但對(duì)于一個(gè)程序來(lái)說,如果出現(xiàn)分支就表明每個(gè)分支的指令和處理是不一致的,容易使一些共享數(shù)據(jù)失去一致性。如果在同一個(gè)Warp內(nèi)如果存在分支,則線程之間可能不能夠交互或者進(jìn)行數(shù)據(jù)交換,在一些實(shí)際(算法)中可能使用鎖定(Lock)機(jī)制來(lái)進(jìn)行數(shù)據(jù)交換。但掩碼恰恰可能因?yàn)檎{(diào)度失衡,造成鎖定一直不能被解除,造成死鎖問題。

5)GPGPU解決死鎖的方法

圖3-8V100Warp調(diào)度對(duì)比圖[2]

解決死鎖的方法如下:

NVIDIA為V100中Warp內(nèi)的每個(gè)線程都分配了一個(gè)PC指針和堆棧,將PC指針的顆粒度細(xì)化到每一個(gè)線程中去,保障數(shù)據(jù)交換避免死鎖。(圖3-5)

為避免細(xì)粒度的PC指針和堆棧與GPU的SIMT執(zhí)行模型產(chǎn)生沖突,硬件仍以Warp為單位來(lái)進(jìn)行線程調(diào)度。

使用了ScheduleOp(ti)mizer(調(diào)度優(yōu)化器)硬件模塊來(lái)決定哪些線程可以在一個(gè)Warp內(nèi)進(jìn)行調(diào)度,將相同的指令重新進(jìn)行組織排布到一個(gè)Warp內(nèi),并執(zhí)行SIMD模型,以保證利用效率最大化[2]。

3.3.2線程束調(diào)度與記分牌

進(jìn)行線程束(Warp)調(diào)度的目的是充分利用內(nèi)存等待時(shí)間,選擇合適的線程束來(lái)發(fā)射,提升執(zhí)行單元計(jì)算效率。

在理想的計(jì)算情況下,GPU內(nèi)每個(gè)Warp內(nèi)的線程訪問內(nèi)存延遲都相等,那么可以通過在Warp內(nèi)不斷切換線程來(lái)隱藏內(nèi)存訪問的延遲。

GPU將不同類型的指令分配給不同的單元執(zhí)行,LD/ST硬件單元用于讀取內(nèi)存,而執(zhí)行計(jì)算指令可能使用INT32或者FP32硬件單元,且不同硬件單元的執(zhí)行周期數(shù)一般不同。這樣,在同一個(gè)Warp內(nèi),執(zhí)行的內(nèi)存讀取指令可以采用異步執(zhí)行的方式,即在讀取內(nèi)存等待期間,下一刻切換線程其他指令做并行執(zhí)行,使得GPU可以一邊進(jìn)行讀取內(nèi)存指令,一邊執(zhí)行計(jì)算指令動(dòng)作,通過循環(huán)調(diào)用(RoundRobin)隱藏內(nèi)存延遲問題,提升計(jì)算效率。

在理想狀態(tài)下,可以通過這種循環(huán)調(diào)用方式完全隱藏掉內(nèi)存延遲。但在實(shí)際計(jì)算流程中,內(nèi)存延遲還取決于內(nèi)核訪問的內(nèi)存位置,以及每個(gè)線程對(duì)內(nèi)存的訪問數(shù)量。

內(nèi)存延遲問題影響著Warp調(diào)度,需要通過合理的Warp調(diào)度來(lái)隱藏掉內(nèi)存延遲問題。

1)指令順序調(diào)整的原因

在同一個(gè)Warp的單個(gè)線程中,調(diào)整發(fā)送到ALU將要執(zhí)行的指令順序,可以隱藏掉一部分內(nèi)存延遲問題。例如讀取指令和加法指令使用的是不同的硬件單元,在第一個(gè)(時(shí)鐘)周期執(zhí)行內(nèi)存讀取指令之后,下一個(gè)時(shí)鐘周期不必等待讀取內(nèi)存指令,而是可以直接執(zhí)行加法指令,從而實(shí)現(xiàn)一邊計(jì)算一邊讀取,來(lái)提高整個(gè)運(yùn)行效率。

但在實(shí)際情況中,后一個(gè)指令有可能是依賴于前一個(gè)指令的讀取結(jié)果。要解決該問題就需要GPU提前對(duì)指令之間的依賴關(guān)系進(jìn)行預(yù)測(cè),解析出指令之間的獨(dú)立性和依賴關(guān)系。

圖3-11動(dòng)態(tài)線程束示例(來(lái)源:WILSONW.L.FUNG等)

2)記分牌與指令順序調(diào)整的方法

GPU在這里參考了CPU設(shè)計(jì),為了解析指令之間的獨(dú)立性,采用順序記分牌(In-OrderScoreboard)。

對(duì)于單線程束情況,

每個(gè)寄存器在記分牌中都對(duì)應(yīng)一個(gè)標(biāo)志位,用于表示該寄存器是否已被寫入數(shù)據(jù),如果置1則表示該寄存器已經(jīng)被寫入。

此時(shí)如果另外一個(gè)指令想要讀或者寫該寄存器,則會(huì)處于一直等待狀態(tài),一直到該寄存器的標(biāo)志位被清零(表明之前寫寄存器操作完成)。這樣就可以阻止Read-After-Write和Write-After-Write的問題。

當(dāng)順序記分牌和順序指令(In-OrderInstruction)結(jié)合時(shí),能避免Write-After-Read的問題。

圖3-11數(shù)據(jù)沖突與流水線結(jié)構(gòu)相關(guān)

對(duì)于

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論