23.10.3 Case Study:AMD GCN Vega
AMD的Graphics Core Next(GCN)架構(gòu)在AMD的多款顯卡產(chǎn)品上使用,并且還應(yīng)用在Xbox One和PLAYSTATION 4上。這里,我們會(huì)介紹GCN Vega架構(gòu)的一些基礎(chǔ)的元素,其對(duì)于在主機(jī)平臺(tái)上使用的架構(gòu)來(lái)說(shuō)是一場(chǎng)革命。
GCN架構(gòu)的一個(gè)核心模塊就是計(jì)算單元compute unit(CU),在Figure 23.28里展示。CU有4個(gè)SIMD unit,每個(gè)有16個(gè)SIMD lanes,即是16個(gè)ALU(使用Section 23.2里的術(shù)語(yǔ))。每個(gè)SIMD unit有64個(gè)執(zhí)行命令的指令,每個(gè)都叫做一個(gè)wavefront。一個(gè)每個(gè)時(shí)鐘周期里,每個(gè)SIMD可以執(zhí)行一次單精度浮點(diǎn)數(shù)運(yùn)算指令。因?yàn)檫@個(gè)架構(gòu)會(huì)在每個(gè)SIMD unit上處理一個(gè)64個(gè)進(jìn)程組成的wavefront,這個(gè)過(guò)程全部執(zhí)行完需要4個(gè)時(shí)鐘周期。注意,一個(gè)CU可以同時(shí)運(yùn)行來(lái)自于不同kernel的代碼。因?yàn)槊總€(gè)SIMD有16個(gè)lane,并且每個(gè)時(shí)鐘周期可以執(zhí)行一個(gè)指令,所以整個(gè)CU的峰值是,(每個(gè)CU 4個(gè)SIMD unit)X(每個(gè)unit 16個(gè)SIMD lane)=每個(gè)時(shí)鐘周期64個(gè)單精度浮點(diǎn)數(shù)操作。相比于單精度浮點(diǎn)數(shù)指令,CU可以執(zhí)行2倍的半精度浮點(diǎn)數(shù)(16位浮點(diǎn)數(shù)),這對(duì)于精度要求不高的情況很有用。注意2個(gè)16位的浮點(diǎn)值會(huì)被打包進(jìn)一個(gè)32位的浮點(diǎn)寄存器。每個(gè)SIMD unit有一個(gè)64kB大小的寄存器文件,等于65536/(4*64)=256個(gè)寄存器每個(gè)thread,由于單精度浮點(diǎn)數(shù)用4個(gè)bytes,所以wavefront有64個(gè)進(jìn)程。ALU有四個(gè)硬件管線階段。
每個(gè)CU有一個(gè)指令寄存器(圖里沒(méi)顯示),在四個(gè)SIMD unit之間共享。需要處理的指令會(huì)送往SIMD unit的指令緩沖里instruction buffer(IB)。每個(gè)IB有容納10個(gè)wavefront的存儲(chǔ)空間,這樣可以在SIMD上進(jìn)行切換來(lái)隱藏延遲。這意味著,CU可以處理40個(gè)wavefronts。這等同于40*64=2560個(gè)進(jìn)程。FIgure 23.28里的CU 調(diào)度器因此可以同時(shí)處理2560個(gè)進(jìn)程,他的任務(wù)就分發(fā)任務(wù)給CU不同的單元。每個(gè)時(shí)鐘周期,所有的當(dāng)前CU上的wavefront會(huì)進(jìn)入指令選擇,最多一個(gè)指令會(huì)被分配給執(zhí)行端口。CU的執(zhí)行端口包括了分支branch,標(biāo)量scalar/向量vector ALU,scalar/vector memory,本地?cái)?shù)據(jù)共享local data share,全局?jǐn)?shù)據(jù)共享global data shader或者輸出export,以及特殊指令,就是說(shuō)每個(gè)執(zhí)行端口幾乎只會(huì)匹配一個(gè)CU的unit。
標(biāo)量單元scalar unit是一個(gè)64位的ALU,由SIMD unit之間共享。它擁有自己的標(biāo)量寄存器文件和一個(gè)標(biāo)量數(shù)據(jù)緩沖(未展示)。標(biāo)量寄存器文件對(duì)每個(gè)SIMD unit有800個(gè)32位寄存器,即是80044=12.5kB。執(zhí)行過(guò)程是和wavefront緊密綁定的。因?yàn)樗枰?個(gè)時(shí)鐘周期來(lái)完全的分配指令給SIMD unit,所以scalar unit只能每4個(gè)時(shí)鐘周期才能服務(wù)一個(gè)特定的SIMD unit。Scalar unit處理控制流control flow,指針運(yùn)算pointer arithmetic,和其他的可以在一個(gè)warp里的進(jìn)程之間共享的計(jì)算。條件和非條件的分支命令從scalar unit發(fā)出,來(lái)在branch和message unit上執(zhí)行。每個(gè)SIMD unit有一個(gè)單獨(dú)的48位程序計(jì)數(shù)器program counter(PC),在lane之間共享。這是夠用的,因?yàn)樗械膌ane都在執(zhí)行同樣的命令。對(duì)于完成的分支,程序計(jì)數(shù)器會(huì)更新。這個(gè)unit可以發(fā)出的信息包括debug messages,特殊的圖像同步信息special graphics synchronization message,和CPU中斷CPU interrupts。
Vega 10架構(gòu)在Figure 23.29里顯示。圖片的頂部包括了一個(gè)圖像指令處理器graphics command processor,兩個(gè)硬件調(diào)度器hardware schedulers(HWSs)和八個(gè)異步計(jì)算引擎asynchronous compute engines(ACES)。GPC的任務(wù)是把圖像處理任務(wù)分派給圖像管線和GPU的compute engine。HWSs的的緩沖對(duì)象按照順序處理,盡可能快的分配給ACEs。一個(gè)ACE的任務(wù)是向compute engine分配任務(wù)。還有2個(gè)DMA engines,可以處理復(fù)制任務(wù)(圖里未展現(xiàn))。GPC,ACEs,和DMA engine可以并行工作并提交作業(yè)給GPU,這樣提高了利用率,因?yàn)椴煌?duì)列的任務(wù)可以交錯(cuò)穿插。任何隊(duì)列的任務(wù)都可以發(fā)出,不需要等待其他的作業(yè)完成,這意味著獨(dú)立的任務(wù)可以同時(shí)在compute engine上執(zhí)行。ACEs可以通過(guò)緩存或者內(nèi)存同步。他們可以一起支持task graph,所以一個(gè)ACEs的任務(wù)可以依賴于另一個(gè)ACEs的任務(wù),或者圖形管線上其他的任務(wù)。推薦使用分的更小的計(jì)算或者拷貝任務(wù),來(lái)進(jìn)行交錯(cuò)穿插在重度的圖形任務(wù)之間。

如Figure 23.29可見(jiàn),有4個(gè)圖形管線和4個(gè)compute engine。每個(gè)compute engine有16個(gè)CU,共計(jì)64個(gè)CU。這個(gè)圖形管線有2個(gè)塊,即是一個(gè)geometry engine和一個(gè)draw-stream binning rasterizer(DSBR)。Geometry engine包括了一個(gè)幾何裝配器geometry assembler,曲面細(xì)分單元tessellation unit,和一個(gè)頂點(diǎn)裝配器vertex assembler。另外,還支持一種新的圖元著色器primitive shader。Primitive shader的思想是支持更靈活的幾何處理和更快的圖元裁剪。DSBR結(jié)合了sort-middle和sort-last架構(gòu)的優(yōu)點(diǎn),也是分塊緩存tiled caching(23.10.2)的目標(biāo)。圖片分割為屏幕空間里的tiles,在幾何處理完成之后,每個(gè)圖元被指定給它所覆蓋的所有tile。在一個(gè)tile的光柵化過(guò)程中,所有數(shù)據(jù)(比如tile buffer)都被存在L2 cache里,這樣提升了性能。像素著色會(huì)推遲到tile上所有的幾何處理都結(jié)束之后。因此,一個(gè)z-prepass會(huì)在默認(rèn)執(zhí)行,像素只會(huì)被著色一次。延遲渲染是可以開(kāi)關(guān)的,即對(duì)于半透明的幾何體會(huì)被關(guān)上。
為了處理深度,模板值,和顏色緩沖,GCN架構(gòu)有一個(gè)block叫做顏色和深度block(CDB)。他們處理顏色,深度和模板值的讀寫,另外還有顏色的混合。一個(gè)CDB可以使用Section 23.5的通用辦法來(lái)壓縮顏色緩沖。一個(gè)差值壓縮技術(shù)是這么用的:一個(gè)像素的顏色值是未壓縮的狀態(tài),剩下顏色被編碼為它的相對(duì)值。為了提升效率,tile的尺寸可以通過(guò)訪問(wèn)模式動(dòng)態(tài)的選擇。對(duì)于一個(gè)原始256bytes來(lái)存儲(chǔ)的tile,最高的壓縮率是8:1,即是壓縮為32bytes。一個(gè)壓縮的顏色緩沖可以在隨后的pass里被當(dāng)做貼圖使用,texture unit會(huì)相應(yīng)的解壓和壓縮tile,這個(gè)操作節(jié)省了帶寬。
光柵器可以在每個(gè)時(shí)鐘周期光柵化4個(gè)圖元。CDB和圖形管線相連,compute engine可以在每個(gè)時(shí)鐘周期寫16個(gè)像素。就是說(shuō),低于16個(gè)像素的三角形會(huì)降低效率。光柵器也會(huì)處理粗的深度測(cè)試(HiZ)和層級(jí)的模板值測(cè)試。HiZ的緩沖叫做HTILE,可以由開(kāi)發(fā)者來(lái)變成,例如提供遮擋信息給GPU。
Vega的cache層級(jí)在Figure 23.30里顯示。在層級(jí)的頂部(圖片的最右邊),可以看到寄存器,隨后是L1和L2緩存。然后,是高帶寬內(nèi)存2 high-bandwidth memory 2(HBM2),這個(gè)位于顯卡內(nèi)部,最后系統(tǒng)的內(nèi)存位于CPU一側(cè)。Vega的一個(gè)新特性是高帶寬緩存控制器High-Bandwidth Cache Controller(HBCC),在Figure 23.29底部顯示。它可以讓顯存用起來(lái)顯示最后一層的緩存last-level cache。這意味著如果一次內(nèi)存訪問(wèn)請(qǐng)求發(fā)生了,并且對(duì)應(yīng)的內(nèi)容不在顯存里,即,HBM2,那么HBCC將會(huì)自動(dòng)的通過(guò)PCIe總線來(lái)獲取相關(guān)的系統(tǒng)內(nèi)存的頁(yè),并放入顯存中。最不常用的頁(yè)會(huì)被置換出顯存里,通過(guò)一個(gè)隊(duì)列的方式。在HBM2和系統(tǒng)內(nèi)存之間共享的內(nèi)存池叫做HBCC內(nèi)存片段(HMS)。所有的圖形模塊也通過(guò)L2緩存來(lái)訪問(wèn)內(nèi)存,這和之前的架構(gòu)不同。這個(gè)架構(gòu)也支持虛擬內(nèi)存(Section 19.10.1)。

要注意所有在on-chip的模塊,例如HBCC,XDMA(CrossFire DMA),PCI express,顯示引擎display engines,和多媒體引擎multimedia engines,通過(guò)一個(gè)叫做Infinity Fabric(IF)的內(nèi)部連接來(lái)通訊。AMD的CPU也可以和IF連接。Infinity Fabric可以通過(guò)芯片模具來(lái)連接各模塊。IF之間也是相連的,意味著所有的模塊看到的內(nèi)存里內(nèi)容的視圖都是相同的。
芯片基礎(chǔ)的時(shí)鐘頻率是1677 MHz,即是說(shuō),最高的計(jì)算能力是

FMA和TFLOPS的對(duì)應(yīng)都和公式23.16一樣。這個(gè)架構(gòu)是非常靈活的,可拓展的,所以我們也期待會(huì)有進(jìn)一步的配置。
23.11 Ray Tracing Architectures
這部分的知識(shí)太過(guò)老舊,沒(méi)有意義。如果有一天,還能相遇,你還想知道,我便再講與你聽(tīng)罷。
謹(jǐn)以此文獻(xiàn)給我曾經(jīng)的,永遠(yuǎn)的,可愛(ài)的朋友zmj。