GPU如何工作:PowerVR/高通Adreno/ARM Mali的渲染模式分析
在渲染片元的時(shí)候,GPU先比較最粗糙版本的Z-buffer。如果要畫(huà)的片元Z值還比較遠(yuǎn),那這個(gè)片元就一定不用畫(huà)出來(lái)了。如果它比較近,就再拿比較細(xì)的Z-buffer來(lái)比較,一直比較到最細(xì)的版本。在理想的情形下,通常大部分的片元都不需要比較到最細(xì)的版本,所以可以節(jié)省不少時(shí)間(要記得,一個(gè)“粗糙”版的Z值比較,其實(shí)就等于和四個(gè)“精細(xì)”版的 Z 值比較)。
本文引用地址:http://cafeforensic.com/article/201606/292810.htm相較之下,PowerVR的TBDR會(huì)在幾何階段的三角形裁剪后將當(dāng)前 scene(場(chǎng)景或者說(shuō)畫(huà)面)的三角形經(jīng)過(guò)篩選排序存放在scene buffer 內(nèi),然后由 HSR(隱面消除)算法將攝像機(jī)視點(diǎn)不可見(jiàn)的片元剔去掉,這部分實(shí)現(xiàn)細(xì)節(jié)已經(jīng)在PowerVR一節(jié)中有闡述,這里就不再?gòu)?fù)述了。
按照高通的說(shuō)法,Adreno從3xx系列采用了名為FlexRender的渲染架構(gòu),可以自動(dòng)在立即渲染和TBDR之間切換,而且這個(gè)TBDR的執(zhí)行過(guò)程和PowerVR TBDR是基本一樣的(同樣有對(duì)三角形進(jìn)行binning和剔除無(wú)效片元的處理):
所以從微架構(gòu)方面而言,高通透露的信息并不多,只能看到個(gè)大概,以驍龍820搭配的Adreno 530為例,采用了統(tǒng)一著色架構(gòu)和FlexRender,配有256個(gè)ALU,支持DirectX 12.1、Vulkan、OpenCL 2.0。
采用驍龍820(搭載 Adreno 530)的小米 5(價(jià)格1999元版本))在運(yùn)行OpenCL-Z的FP32 性能測(cè)試結(jié)果是287 GFLOPS,相較之下,價(jià)格799元的紅米Note 2(Power VR 6200)只有44 GFLOPS,前者是后者性能的6.52倍,當(dāng)然,這個(gè)測(cè)試只是屬于底層測(cè)試,實(shí)際的游戲體驗(yàn)因人、因應(yīng)用而異。
安謀Mali——弱核化設(shè)計(jì)
安謀(ARM)最為人熟知的是旗下的各款 ARM CPU內(nèi)核,目前的主要手機(jī)幾乎都是采用ARM 陣營(yíng)的CPU。
ARM的GPU Mali是ARM在2006年收購(gòu)的挪威公司Falanx獲得的,源起于是90年代由ARM在挪威科技大學(xué)支持的的項(xiàng)目,到了2001年由Borgar Ljosland與四位在該項(xiàng)目中的GPU團(tuán)隊(duì)學(xué)生于2001年創(chuàng)辦了這家Falanx Microsystems。
Falanx最初是希望打進(jìn)臺(tái)式機(jī)市場(chǎng),不過(guò)隨著3dfx、Matrox等公司的萎靡、敗退,臺(tái)式機(jī)GPU市場(chǎng)的格局發(fā)生了很大的變化,不再有空間給新丁了,F(xiàn)alanx轉(zhuǎn)向了從事手機(jī)、PDA、機(jī)頂盒、游戲掌機(jī)、信息機(jī)等領(lǐng)域,不過(guò)他們當(dāng)時(shí)在這個(gè)領(lǐng)域其實(shí)做得并不算很出色,ARM的收購(gòu)對(duì)他們來(lái)說(shuō)是一個(gè)重要的轉(zhuǎn)折點(diǎn)。
ARM收購(gòu)Falanx推出的第一款GPU就是2007年的Mali-200,是Mali第一款OpenGL ES 2.0 GPU,它和它的換代型號(hào)Mali-300、Mali-400、Mali-450都是基于名為Utgard(北歐神話中Utgard-Loki統(tǒng)治下約頓巨人位于仙宮與塵世之外的宮殿)的微架構(gòu)。Utgar采用的是非統(tǒng)一架構(gòu),頂點(diǎn)指令和像素指令有各自專門(mén)的單元來(lái)執(zhí)行,到了Mali-400時(shí)候?qū)崿F(xiàn)了多核能力。
Mali最新的微架構(gòu)代號(hào)是Midgard,和Utgard不同的是,Midgard開(kāi)始采用統(tǒng)一著色架構(gòu),幾何和片元操作指令都在同一個(gè)著色器單元上執(zhí)行。
Mali同樣采用了分塊式渲染(塊元大小是16x16),但是根據(jù)下面這個(gè)幻燈片,可以看到其scene buffer或者說(shuō)primitive buffer保存的圖元順序必須和程序遞交的順序保持一致(畫(huà)紅線部分),不存在PowerVR那樣的篩選(sorting)動(dòng)作。
因此如果按照ImgTec的說(shuō)法 Mali并不能算是真正的TBDR,當(dāng)然,它還是具備 Early-Z這樣的隱面消除能力,只是粒度上肯定不如PowerVR那么細(xì)(PowerVR自稱其HSR能力為pixel perfect)。
在渲染流程方面,Mali或者說(shuō)Midgard和目前你看到的大多數(shù)GPU做法有些不一樣,那就是作為統(tǒng)一渲染架構(gòu),它可以在同一時(shí)間里同時(shí)對(duì)幾何和片元進(jìn)行渲染操作,而其他的GPU在同一時(shí)間里要嘛就是幾何計(jì)算要嘛就是片元計(jì)算:
如上圖所示,你可以看到Mali可以在同一時(shí)間片上同時(shí)進(jìn)行幾何和片元操作,這表明Mali內(nèi)部的任務(wù)調(diào)度設(shè)計(jì)非常靈活,原因請(qǐng)看下面的介紹。
上圖是Mali的著色器內(nèi)核(Shader Core)功能模塊圖,可以看到,如果圖示的確是正確的話,那么這個(gè)著色器內(nèi)核里面可謂是五臟俱全,本質(zhì)上就是一個(gè)小 GPU,圖形渲染所涉及到的操作都能在一個(gè) Shader Core 上完成,因此配有多個(gè)Shader Core的Mali可以做到在同一時(shí)間內(nèi)跑幾何和片元處理,多個(gè)Shader Core的Mali GPU其實(shí)就是一個(gè)片上多GPU并行渲染系統(tǒng)。
其實(shí)其他廠商尤其是采用TBR的GPU可以像Mali這樣片上多核運(yùn)行多個(gè)Tile,但是Mali GPU的特別之處是它的內(nèi)核內(nèi)部是沒(méi)考慮擴(kuò)展的,至少目前是這樣。像ImgTecPower VR XT7等其他廠牌的GPU內(nèi)部的CU數(shù)都是具備延伸能力的,而Mali GPU則對(duì)不起,不管什么型號(hào)的Mali GPU,上面的Tri-Pipe 都是固定的一個(gè),這就是所謂的“完整的弱內(nèi)核”設(shè)計(jì)。
從OpenCL的角度而言,每個(gè)Mali內(nèi)核都是一個(gè)CU,只能以多個(gè)Partition(分區(qū))的方式實(shí)現(xiàn)規(guī)模擴(kuò)張。而像PowerVR則是既可以多個(gè)CU 也可以多個(gè)Partition的方式實(shí)現(xiàn)規(guī)模上的性能延伸。
值得一提的是,Mali-T880的Tri-Pipe,這其實(shí)就是Mali的可編程渲染/計(jì)算單元,其中包含了紋理(T-Pipe)、內(nèi)存指令(LS-Pipe)和算術(shù)邏輯(A-Pipe)單元三部分,在Mali-T880之前,Tri-Pipe的算術(shù)邏輯單元大都只有兩個(gè),而在Mali-T880上,Tri-Pipe 的算術(shù)邏輯單元增加到了3個(gè),使其計(jì)算能力提升了50%。
Mali相對(duì)于目前大多數(shù)其他廠商GPU的另一個(gè)區(qū)別要點(diǎn)是它的A-Pipe采用了SIMD向量處理設(shè)計(jì),寄存器能夠像目前CPU的SIMD單元那樣靈活地拆分成2xFP64、4xFP32、8xFP16、2xInt64、4xInt32、8xInt16、16xInt8等數(shù)據(jù)類型訪問(wèn)。
按照ARM的說(shuō)法,Mali的算術(shù)ISA 用了SIMD + VLIW的設(shè)計(jì):
三個(gè)向量單元(128-bit數(shù)據(jù)路徑)
4路FP32或者8路FP16
16路Int8
兩個(gè)標(biāo)量單元(32-bit數(shù)據(jù)路徑)
按照ARM官方博客的一篇文章,Mali-T760的每條A-Pipe單周期單精度計(jì)算性能是17FLOP,從上圖來(lái)看,VMUL和VADD以及SADD、SMUL的FLOPS是應(yīng)該是10個(gè),余下的7個(gè)就是那個(gè)VLUT。
LUT的含義并不是很清楚,也許是查表(Look-up Table)的含義,不過(guò)這樣的話,我覺(jué)得似乎不太適合將其歸入到人們常說(shuō)的通用計(jì)算性能指標(biāo)里,即使其使用的是VLIW指令集。
所以我覺(jué)得每條A-Pipe的單精度性能應(yīng)該視作每周期10個(gè)比較合適。對(duì)于Mali-T880MP16來(lái)說(shuō),在 650MHz 時(shí)候的單精度性能應(yīng)該是312 GFLOPS,同理,Mali-T760MP8的單精度浮點(diǎn)性能應(yīng)該是104 GFLOPS,當(dāng)然這只是我的個(gè)人意見(jiàn)。
LS-Pipe執(zhí)行的是和紋理無(wú)關(guān)的內(nèi)存存取動(dòng)作,例如幾何/片元處理時(shí)候的屬性讀取和變量寫(xiě)入操作。通常而言每條指令就是一次內(nèi)存訪問(wèn)操作,如果是 A-pipe的向量操作就是單指令Vec4操作。
雖然ARM Mali并非TBDR,不具備在進(jìn)入塊元渲染之前透過(guò)篩選將無(wú)效的片元剔除掉,但是它的某些型號(hào)具備名為Forward Pixel Kill(正向像素剔除,簡(jiǎn)稱FPK,見(jiàn)上面Mali-T880 Shader Core架構(gòu)圖中Early-Z后接的就是FPK單元)技術(shù)。
具備這個(gè)技術(shù)的GPU所跑的線程不再是不可撤銷的,如果發(fā)現(xiàn)稍后的線程要向相同像素位置寫(xiě)入不透明數(shù)據(jù),就會(huì)將已經(jīng)在進(jìn)行的計(jì)算終止掉。由于每個(gè)像素需要花費(fèi)一段時(shí)間才能完成,因此 FPK可以有一個(gè)時(shí)間窗口來(lái)排空流水線中已有的無(wú)效渲染片元。
按照ARM的說(shuō)法,這個(gè)FPK技術(shù)在最適中的流水時(shí)間窗口下所能達(dá)到的消除無(wú)效渲染效果可以和PowerVRTBDR w/HSR媲美,而且無(wú)需對(duì)整個(gè)畫(huà)面的三角形進(jìn)行篩選、無(wú)需在程序里添加篩選代碼、能夠?qū)Π胪该鲗?duì)象實(shí)行正確處理、不會(huì)對(duì)幀率產(chǎn)生突變影響。
上面這個(gè)表格是維基百科上的Mali各型號(hào)規(guī)格表,其中的單精度指標(biāo)是包括了那個(gè)VLUT的。
目前市場(chǎng)上大多數(shù)采用Mali的中端SoC都還是基于Mali-4XX系列,按照 ARM的說(shuō)法,目前有75%的數(shù)字電視、超過(guò)50%的Android平板電腦、大于35% 的智能手機(jī)采用了Mali GPU。
例如小米電視3就采用了Mali-T760MP4這個(gè)GPU,三星去年的旗艦產(chǎn)品Galaxy S6、Galaxy S6 Edge都有采用Mali-T760,我手頭有一臺(tái)支持智能卡的電信T6有線電視機(jī)頂盒,搭配的是全志的SoC,其中的GPU也是ARM Mali-400MP,所以這個(gè)看上去有點(diǎn)古怪(完整的弱內(nèi)核設(shè)計(jì))的GPU在市占率方面Mali已經(jīng)取得了相當(dāng)不錯(cuò)的成績(jī)。
三星Galaxy S6采用的Mali-T760MP8名義頻率是772MHz,理論單精度性能是123.5 GFLOPS(按照每個(gè)算術(shù)流水線里包含兩個(gè)4 路FP32 SIMD和兩個(gè) FP32標(biāo)量來(lái)統(tǒng)計(jì),未將那個(gè)相當(dāng)于7個(gè)FLOPS 的VLUT或者說(shuō) SFU 單元計(jì)算在內(nèi)),3DMark Ice Storm Unlimited 得分是 20988 ,而采用PowerVRGT7600的iPhone 6s Plus 3Dmark Ice Storm Unlimited 結(jié)果是27811,基本上符合123.5 GFLOPS vs 172.8GFLOPS (按照iPhone 6s Plus的GT7600頻率為450MHz時(shí)計(jì)算出的單精度性能為172.8 GFLOPS)的差距。
我們相信,在新的一年里將有機(jī)會(huì)看到Mali-T8xx系列初露崢嶸,原因是Mali的完整弱內(nèi)核比較便于隨意搭配,新內(nèi)核帶來(lái)的規(guī)格、性能提升也可以為新應(yīng)用帶來(lái)更好的用戶體驗(yàn)。
結(jié)語(yǔ)
在這篇文章里,我們介紹了三個(gè)常見(jiàn)的智能設(shè)備或者說(shuō)手機(jī)/平板電腦的GPU,涉及到的知識(shí)面相對(duì)坊間的大多數(shù)文章而言要更深入一些,例如ImgTec的PowerVR、高通的Adreno、ARM的Mali雖然都屬于TBR,但是具體的實(shí)現(xiàn)卻有著各自的特色。
ImgTec的PowerVR是三個(gè)TBR架構(gòu)中歷史最長(zhǎng)的,也是10年GPU大戰(zhàn)中少數(shù)幸存下來(lái)并且活的還比較滋潤(rùn)的廠商之一,PowerVR在TBDR方面擁有非常豐富的實(shí)作經(jīng)驗(yàn),憑借 TBDR 的高能效比特點(diǎn),在移動(dòng)設(shè)備中站穩(wěn)了腳跟,成為包括蘋(píng)果在內(nèi)眾多手機(jī)廠商選擇的GPU方案。
高通的 Adreno 從3xx系列開(kāi)始引入了名為FlexRender的渲染技術(shù),能動(dòng)態(tài)在IMR和TBDR渲染模式之間切換,前者可以在兼容性、響應(yīng)時(shí)延方面提供最佳的保證,而后者可以在性能耗電比方面達(dá)到更佳的體驗(yàn)效果。
Mali的渲染架構(gòu)相對(duì)簡(jiǎn)單,屬于TBIMR,也就是分塊式立即渲染,對(duì)遞交的三角形順序不作篩選處理,分塊的主要目的是節(jié)省帶寬,不過(guò)它的某些型號(hào)具備名為 Forward Pixel Kill的技術(shù),能夠隨時(shí)停掉“預(yù)見(jiàn)”到的無(wú)效像素(線程)的渲染,號(hào)稱可以達(dá)到媲美PowerVR TBDR 的效果。同時(shí),Mali采用了“完整弱GPU內(nèi)核”(相對(duì)于其他廠商的“完整可延伸GPU內(nèi)核”而言)設(shè)計(jì),內(nèi)核中的渲染單元不能擴(kuò)展,性能的規(guī)模延伸是透過(guò)增加內(nèi)核數(shù)來(lái)達(dá)到。
我們?cè)诒疚闹袥](méi)有對(duì)NVIDIA的GeForce ULP和Intel的GenX進(jìn)行介紹,不過(guò)它們其實(shí)基本上就是同架構(gòu)的臺(tái)式機(jī)版本的規(guī)模縮減版,當(dāng)然,由于針對(duì)的移動(dòng)設(shè)備,其中還有一些省電措施,遺憾的是,這兩家廠商的GPU雖然性能不錯(cuò),但是在手機(jī)市場(chǎng)上由于各自自身的因素而缺乏整機(jī)廠商的支持。
所以,本文從一開(kāi)始就不打算透過(guò)這篇文章來(lái)影響讀者的購(gòu)買(mǎi)意向,這只是一篇有科普性質(zhì)的文章,盡可能地較少功利的因素,但求看起來(lái)資料盡可能詳細(xì)有趣同時(shí)又能增加一些見(jiàn)識(shí)就行。
評(píng)論