在上一篇文章《【技術(shù)解析】GPU如何實(shí)現(xiàn)三維渲染及非圖形計(jì)算?》我們已經(jīng)了解了GPU工作流程以及作用,但GPU絕無這么簡單。目前市場上的 GPU 主要由三家公司主導(dǎo),分別是ImgTec的PowerVR系列、Qualcomm(高通)的 Adreno 以及 ARM(安謀)的 Mali,其中PowerVR被蘋果采用,Adreno被高通整合到驍龍SoC當(dāng)中,Mali應(yīng)用最為廣泛,有三星Exynos、MTK Helio、Mstar等等,按渲染模式可以劃分為IMR與TBR/TBDR兩大流派,下面我們先從PowerVR說起。
PowerVR —— 延后式分塊渲染架構(gòu)
ImgTec(或者說 Imagination Technologies)的前身是 1985 年在英國成立的VideoLogic公司,在上世紀(jì)90年風(fēng)靡一時(shí)的世嘉DreamCast游戲機(jī)就是采用該公司技術(shù)授權(quán)生產(chǎn)的圖形處理器。
ImgTec目前旗下有多個(gè)分部,PowerVR是其中專門從事GPU、視頻處理單元、攝像機(jī)知識產(chǎn)權(quán)內(nèi)核技術(shù)開發(fā)的分公司。
PowerVR雖然從事GPU開發(fā),但是它并不直接售賣芯片實(shí)體,而是透過授權(quán)的方式,將芯片內(nèi)核技術(shù)以收取權(quán)利金的方式讓第三方芯片廠商生產(chǎn)、銷售、使用,例如蘋果公司、英特爾公司、聯(lián)發(fā)科、索尼等,商業(yè)模式和同樣是英國公司的ARM一樣。
技術(shù)內(nèi)核授權(quán)方式給了芯片廠商和系統(tǒng)集成廠商非常高的靈活性和快速切入市場的能力,他們可以在較短的時(shí)間里就實(shí)現(xiàn)各種配置的靈活組合。如果你看過我前面介紹的圖形流水線就知道,要做好一枚具競爭力的GPU難度是相當(dāng)大的,中間涉及大量的技術(shù)積累。
像NVIDIA、AMD這樣的廠商都不是突然冒出來的,他們都經(jīng)歷過非常慘烈的市場競爭、有業(yè)界最強(qiáng)大的研發(fā)團(tuán)隊(duì)以及與周邊軟件開發(fā)商經(jīng)年累月的開發(fā)合作關(guān)系,現(xiàn)在一個(gè)新丁公司仿效NVIDIA模式貿(mào)然闖進(jìn)GPU開發(fā)領(lǐng)域的話,如果不是手握十億美元級規(guī)模的資金來換取技術(shù)和各種市場資源的話,恐怕連響都聽不到。
在上世紀(jì)90年代末和本世紀(jì)前兩年,PowerVR也在桌面市場和NVIDIA、3dfx進(jìn)行過捉對廝殺,不過由于商業(yè)模式并不十分適合桌面市場,所以在僅有母公司VideoLogic(1999年更名為Imagination Technologies)推出的Kyro II后就不再踏足桌面獨(dú)立顯卡市場,轉(zhuǎn)而全力發(fā)展嵌入式領(lǐng)域,從此一發(fā)不可收拾。
PowerVR在桌面獨(dú)立顯卡市場的最后一款產(chǎn)品是PowerVR3系列,原定用于Kyro III/IV的后續(xù)產(chǎn)品PowerVR4由于退出桌面市場,對公眾而言只停留在幻燈片(上圖的STG5000就是原本計(jì)劃用在Kyro III的PowerVR4)中。
當(dāng)然,PowerVR并沒有完全退出桌面市場,他們和Intel達(dá)成了技術(shù)授權(quán)協(xié)議,英特爾可以在其集成GPU中采PowerVR MBX架構(gòu),英特爾在很長的一段時(shí)期內(nèi)的集成GPU都采用了這個(gè)微架構(gòu)內(nèi)核。
PowerVR MBX據(jù)聞是世嘉DreamCast那枚PowerVR PCX 2的升級版,從技術(shù)資料來看的話,其實(shí)PowerVR MBX有些類似于PowerVR4,官方的PowerVR MBX白皮書里也明確寫著:
4th generation tile-based deferred rendering(第四代塊元式延后渲染)
從規(guī)格表來看,PowerVR MBX支持OpenGL ES 1.1,相當(dāng)于OpenGL版本1.5或者DirectX 8.x的變種版。
所以,PoweVR MBX應(yīng)該是和PowerVR Series 4一脈相承的,PowerVR MBX屬于后者的移動(dòng)版本。
什么是TBDR呢?
在前面介紹的圖形渲染流水線,GPU在渲染的時(shí)候,一般是逐個(gè)三角形渲染的,如果以深度順序來劃分,可以分為從遠(yuǎn)到近(畫家畫法)、從近往遠(yuǎn),開發(fā)人員可以在編寫代碼的時(shí)候指定渲染順序。
如果依照在圖形流水線什么階段進(jìn)行三角形排序,又可以分為sort-first、sort-middle、sort-last,middle是中間的意思,指的是從模型空間到屏幕空間這部分工位,sort-middle就是指在這段進(jìn)行三角形前后順序排序。sort-last是指在這之后進(jìn)行三角形排序,sort-first是指在這之前進(jìn)行三角形排序。
Sort-First一般用于多GPU渲染方案,基于片元方式的Sort-Last在目前絕大多數(shù)的GPU微架構(gòu)中使用,而Sort-Middle則是PowerVR的三角形排序方案,需要在幾何變換和光柵化之間進(jìn)行圖元的排列/分倉處理,在解決了可視性問題后再進(jìn)行貼圖和著色處理。
這個(gè)步驟會造成一定的延遲,加上采用了塊元式渲染,所以像PowerVR這種渲染架構(gòu)被稱作塊元式延后渲染器(Tile Based Deferred Rendering,TBDR)。
而一般的GPU被認(rèn)為是看到一個(gè)三角形就馬上渲染,所以被稱為立即渲染器(Immediate Mode Rendering),立即渲染器也可以分為塊元式(例如ARM Mali)和非塊元式(例如AMD、NVIDIA “目前”的GPU)。
?。↖MR)
什么是TBDR?
PowerVR 微架構(gòu)誕生于上世紀(jì)90年代初期,針對的是初代的三維游戲機(jī),當(dāng)時(shí)的人們希望這枚芯片的效率要盡可能地高,由于受到半導(dǎo)體技術(shù)的限制,所以在這時(shí)期有各種現(xiàn)在看來稀奇古怪的偏重于某個(gè)技術(shù)指標(biāo)的芯片。
要效率高,其中一個(gè)辦法就是只渲染屏幕上能看到的三角形所覆蓋的片元,人們引入了名為HSR(Hidden Surface Removal,隱面消除,這里的隱面是指被其他實(shí)體多邊形遮蓋的多邊形)來消除無效片元來實(shí)現(xiàn)這個(gè)目標(biāo)。
?。═BDR)
在TBDR的渲染流水線里,幾何階段生成(已經(jīng)經(jīng)過裁剪)的多邊形或者說三角形參數(shù)信息都存放在一個(gè)名為Scene Buffer(場景緩存)或者Parameter Buffer(參數(shù)緩存,這是相對新近的叫法)的內(nèi)存里,理論上里面保存的應(yīng)該是同一幀畫面里的所有三角形信息,其位置在顯存里(對于采用統(tǒng)一內(nèi)存架構(gòu)的手機(jī)而言,則是和系統(tǒng)內(nèi)存一樣位于同一塊物理內(nèi)存上)。
這一步是TBDR獨(dú)有的,相較之下,傳統(tǒng)的GPU在幾何階段扔出到三角形后紋理單元/著色單元就馬上渲染,因此人們將傳統(tǒng)的GPU渲染方式稱作立即渲染器。
這里請不要把TBDR 和延后式渲染混淆,后者是指把多個(gè)片元渲染后在進(jìn)行后期處理(例如打光、模糊等效果),同樣是“延后”一詞,但是對應(yīng)的渲染節(jié)點(diǎn)完全不一樣。
在生成Scene Buffer的同時(shí),PowerVR GPU內(nèi)部的塊元加速器會對這些三角形進(jìn)行分倉(Binning)或者說篩選(sorting)處理,這個(gè)動(dòng)作會依照16像素*16像素(取決于具體的GPU實(shí)現(xiàn),像PowerVR PCX2可以是32*32或者32*16,PowerVR SGX 5上是16*16,“新的”PowerVR Series 6/7是32*32,這樣的分塊被稱作塊元,即Tile)的大小,將Scene Buffer中位于塊元內(nèi)的所有三角形的指針存放到一個(gè)對應(yīng)的塊元緩存(Tile Buffer)中。
對于一個(gè)大小為1920x1080的全高清屏幕,用16*16的塊元大小進(jìn)行切分,可以切成大約8100個(gè)塊元,每個(gè)塊元在“顯存”中都有一個(gè)對應(yīng)的塊元緩存,里面存放的就是上面所說的位于塊元內(nèi)的三角形數(shù)據(jù)指針(指向Scene Buffer對應(yīng)的三角形數(shù)據(jù))。
所謂指針,是編程語言中的一個(gè)對象或變量,用來存儲某一個(gè)地址,這個(gè)地址的值直接指向(points to)存在電腦存儲器中另一塊存儲器空間的值。
從編程的角度而言,在這些塊元緩存存放的數(shù)據(jù)結(jié)構(gòu)可以稱作圖元列表(primtive list)。
按照PowerVR或者說ImgTec的說法,他們在新的微架構(gòu)中引入了幾何體壓縮技術(shù),存放在Scene Buffer的幾何體數(shù)據(jù)是壓縮過的,在GPU頂點(diǎn)內(nèi)存單元讀取時(shí)候再解壓,這樣的好處是可以顯著節(jié)省存放Scene Buffer的內(nèi)存空間和帶寬,而這通常意味著:省電。
TBDR是如何實(shí)現(xiàn)HSR的呢?
不過幾何體壓縮并非TBDR的賣點(diǎn),TBDR的真正賣點(diǎn)是可以實(shí)現(xiàn)完全消除不可見三角形的片元渲染,那么它是如何做到這一點(diǎn)的呢?
?。↘ristof Beets)
根據(jù)現(xiàn)在供職于ImgTec擔(dān)任商業(yè)開發(fā)總監(jiān)的Kristof Beets在 2001年(就在這一年他加盟PowerVR,任職開發(fā)者關(guān)系協(xié)調(diào)工程師,該文似乎是他在PowerVR實(shí)習(xí)期間撰寫的)的一篇文章,PowerVR的HSR實(shí)現(xiàn)方式應(yīng)該是這樣的:
1、從Tile Buffer中獲得第一個(gè)指針,基于這個(gè)指針就能拾取到Scene Buffer中所有三角形的數(shù)據(jù)。
這一步可以實(shí)現(xiàn)預(yù)拾取并將數(shù)據(jù)存放在一個(gè)GPU的片上緩存里,這個(gè)高速緩存可以稱作為On-Chip Tile buffer(片上塊元緩存),用作區(qū)別于片外的圖元列表Tile Buffer,雖然都是塊元緩存,都是對應(yīng)16*16個(gè)像素,但是存放的東西完全不一樣(一個(gè)是從指針解引用后獲得的三角形數(shù)據(jù)和計(jì)算好的深度值,另一個(gè)則是圖元列表)。
2、使用這個(gè)三角形的數(shù)據(jù)計(jì)算出被該三角形覆蓋的Tile中每個(gè)像素的Z值(深度值)。
3、這些深度值數(shù)據(jù)以及對應(yīng)于第一個(gè)三角形的指針被一起存放在GPU內(nèi)的高速緩存里。
4、重復(fù)上面的步驟,獲得第二個(gè)三角形的數(shù)據(jù)以及該Tile中被其覆蓋的像素的深度值,對第二個(gè)三角形覆所蓋像素的深度值和第一個(gè)三角形所覆蓋像素的深度值進(jìn)行比較,如果新的深度值更接近于視口(表明是可看見的),就更新深度值以及三角形(指向新的三角形)。
5、重復(fù)上述的步驟,直到覆蓋該Tile的所有三角形數(shù)據(jù)以及深度信息更新完畢。
6、此時(shí),GPU的片上高速緩存存放的就是用于確定像素色彩的三角形。
前面的Scene Buffer以及Tile Buffers都是存放在GPU外的,而上面步驟中絕大部分操作都是GPU內(nèi)部的高速緩存上進(jìn)行的(除了從Scene Buffer中載入該塊元的三角形數(shù)據(jù)外),速度會非???。
渲染一個(gè)塊元需時(shí)256個(gè)周期(根據(jù)Kristof Beets文章提到16x32的塊元需時(shí)512個(gè)周期推算):
1、數(shù)據(jù)拾取可以采用流水線結(jié)構(gòu),因此不存在性能懲罰;
2、篩選(計(jì)算Z值)需時(shí)一個(gè)周期,這個(gè)步驟也可以采用流水線結(jié)構(gòu),每個(gè)三角形的檢查和塊元更新可以在一個(gè)周期內(nèi)完成。
因此除非時(shí)出現(xiàn)極端狀況,256個(gè)周期的渲染時(shí)間是可以掩蓋掉塊元中含有256個(gè)三角形執(zhí)行篩選動(dòng)作的耗時(shí),在一個(gè)16x16的塊元內(nèi)出現(xiàn)256個(gè)三角形的情況目前來說應(yīng)該還是很少見。
按照這樣的思路可以推算出 1920x1080 60FPS下能實(shí)現(xiàn)的每秒三角形篩選能力是:
1920x1080 * 60FPS = 124,416,000 Mtriangles/s
根據(jù)上面的算式可以得出在像PowerVR SGX 5上每個(gè)塊元含有高達(dá)256個(gè)三角形的情況下,要滿足60FPS速率時(shí)的三角形篩選個(gè)數(shù)為124百萬三角形,現(xiàn)實(shí)的游戲中幾乎沒有這樣的情況會出現(xiàn),因?yàn)槟壳暗闹瞥虩o法做到一個(gè)全程勝任這個(gè)三角形規(guī)模真實(shí)游戲的移動(dòng)GPU。
在知名的三維性能測試軟件3DMark里有一個(gè)支持在手機(jī)上進(jìn)行測試的icestorm場景,其三角形規(guī)模在Extreme模式時(shí)候的為每幀28,000個(gè),達(dá)到60FPS時(shí)就是每秒1.68百萬三角形/秒,對于手機(jī)來說這個(gè)測試已經(jīng)算是比較嚴(yán)苛了,但是此時(shí)三角形規(guī)模也就是每個(gè)塊元大約3.5個(gè)三角形,遠(yuǎn)遠(yuǎn)低于每周期256個(gè)三角形的處理能力。
PowerVR的渲染
完成塊元渲染后,在塊元幀緩存中的數(shù)據(jù)會被寫入到顯存(在手機(jī)中通常顯存和系統(tǒng)內(nèi)存共享)中。在這個(gè)寫入動(dòng)作執(zhí)行的時(shí)候,會一并執(zhí)行抖動(dòng)操作(只執(zhí)行一次而非多次)。如果在臺PC上,如果指定了超取樣抗鋸齒,在這一步還會執(zhí)行一個(gè)向下取樣的操作,將畫面縮小到指定的屏幕分辨率。
在完成了一個(gè)塊元的渲染后,這個(gè)塊元的像素會被傳輸?shù)斤@存(對于采用一體內(nèi)存架構(gòu)的移動(dòng)設(shè)備來說,這塊顯存是從主內(nèi)存中分配的)。
然后,GPU繼續(xù)下一個(gè)塊元的渲染,直到整幀畫面渲染完畢后,以雙緩存方式運(yùn)作的Scene Buffer開始把下一幀的塊元遞交給渲染單元執(zhí)行后續(xù)工位處理,周而復(fù)始。
相較于非TBDR的GPU微架構(gòu)來說,PowerVR或者說TBDR能對整個(gè)畫面(場景)進(jìn)行判別,確定哪些三角形覆蓋的片元需要渲染,而“傳統(tǒng)”的立即渲染架構(gòu)無法實(shí)現(xiàn)這一點(diǎn)。
Kristof Beets的原文還介紹了infinite plane(無限大平面)和HSR的關(guān)系,所謂的infinite plane并不難理解,你可以想象一下:在一個(gè)三維空間里存在著一塊無限大的平面,這塊平面顯然會把這個(gè)三維空間一分為二。
如果我們在這個(gè)三維空間多弄幾個(gè)這樣的平面并使其相交,也就可以構(gòu)建出一個(gè)幾何體模型出來了(例如只要六個(gè)相交的無限大平面就能構(gòu)造出一個(gè)多邊形數(shù)很少的立方體)。
這樣的建模技術(shù)和常見的三角形建模是有很大區(qū)別的,所以很難找到合適的建模工具,其應(yīng)用非常受限,而且隨著模型越來越復(fù)雜,無限大平面的優(yōu)勢也就沒啥感覺了(在Youtube上有一段采用PowerVR PCX2渲染一個(gè)由35個(gè)無限大平面構(gòu)建的甜甜圈的視頻,幀率只有47 fps),三角形此時(shí)是更合理的選擇。
好好的三角形不用,為啥要折騰這個(gè)無限大平面呢?可能的原因是在當(dāng)時(shí)看來,這樣的技術(shù)可以節(jié)省在Scene Buffer里要存放的三角形數(shù):
在幾何階段,PowerVR會根據(jù)從視點(diǎn)發(fā)出的一條“測量光”確定最前和最后的平面相交點(diǎn),藉此得出一個(gè)渲染計(jì)算約束椎體(effect volume),使得這些無限大平面變成有限的平面,加上隱面消除技術(shù),幾何體外突出的平面也被消隱掉。
較少的多邊形、可以和TBDR的隱面消除技術(shù)完美配合,于是無限大平面建模的合理性也就因此存在了。
據(jù)說在PowerVR Series 2以后就不在支持無限大平面,目前為止只有世嘉 DreamCast中的那枚PowerVR芯片是具備無限大平面建模能力的圖形芯片,所以無限大平面這個(gè)部分我們完全不需要考慮,這里介紹主要是為了強(qiáng)調(diào)一下 PowerVR的特點(diǎn)——近乎完美的隱面消除能力(如果不涉及阿爾法混合、阿爾法測試的話,因?yàn)檫@兩項(xiàng)操作會導(dǎo)致HSR失效)。
我們上面費(fèi)了很多口舌來闡述PowerVR的最主要特色TBDR,接下來就讓我們說說當(dāng)前以及即將推出的PowerVR GPU到底會長成什么樣子。
ImgTec PowerVR Rogue
ImgTec在2012年發(fā)布了名為PowerVR Rogue的第六代PowerVR微架構(gòu),現(xiàn)在市場上許多手機(jī)里的GPU都是基于該微架構(gòu)的變種,例如紅米Note 3/Note2、魅藍(lán) Metal、魅族 MX5里的PowerVR G6200。蘋果iPhone 6s Plus的GPU經(jīng)過各種驗(yàn)尸手段查證后確認(rèn)為PowerVR GT7600,這個(gè)GT7600被PowerVR定義為第七代PowerVR(PowerVR Series 7 或者 Rogue 7)微架構(gòu)。毫無疑問,不論檔次高低,現(xiàn)在許多手機(jī)、平板電腦中都有基于PowerVR的GPU。
ImgTec屬于經(jīng)營、開發(fā)知識產(chǎn)權(quán)的芯片公司,本身并不直接售賣芯片,透過研發(fā)大量芯片內(nèi)核,然后將其授權(quán)給需要的第三方公司,收取授權(quán)金來維持公司的運(yùn)營,因此他們會弄一大堆內(nèi)核,以滿足不同廠商、市場的需求。
理論上這樣的運(yùn)管方式只牽涉到研發(fā)費(fèi)用和市場拓展費(fèi)用,弄一大堆內(nèi)核IP的并不會造成實(shí)體產(chǎn)品那樣的庫存壓力。
ImgTec在2012年發(fā)布了代號Rogue的PowerVR Series6微架構(gòu),最低端的是G60X0和G61X0(x為其中一個(gè)數(shù)字編號,不同編號型號配置均不一樣),對應(yīng)的D3D規(guī)格只能夠支持DX9特性級別。
在型號的含義方面,G6050里有0.5個(gè)正常規(guī)格的USC(通用著色器簇),61X0 里含有1個(gè)USC。USC 是PowerVR Series 6引入的統(tǒng)一著色簇簡稱,區(qū)別于以往的PowerVR Series 5時(shí)候的USSE。
前面我們所說的TBDR是指渲染流程的方式,而通用著色器簇則是指具體微架構(gòu)里將若干個(gè)計(jì)算、貼圖部件綁定在一起的單元,一個(gè)USC 就類似于CPU中傳統(tǒng)概念上的一個(gè)內(nèi)核,正如我們前面所說的,它對應(yīng)的就是通用計(jì)算標(biāo)準(zhǔn)OpenCL中的術(shù)語就是Compute Unit。
下圖是PowerVR最新的PowerVR Series 7XT的微架構(gòu)圖:
GPU廠商在設(shè)計(jì)GPU的時(shí)候都會把延伸性作為重要的設(shè)計(jì)因素,因?yàn)檫@樣能確保軟件、硬件資源的最充分利用,上圖的USC規(guī)??梢砸罁?jù)具體的應(yīng)用情況作調(diào)整,例如iPhone 6s采用的GT7600就具備6個(gè)USC(或者說6個(gè)CU)。
上圖的PowerVR Series 7XT屬于目前ImgTec最強(qiáng)大的GPU微架構(gòu),蘋果公司的iPhone 6s列就是采用基于該GPU微架構(gòu)的GT7600。
作為PowerV RSeries 7的GT7600,提供了FP16(半精度)的原生支持,所以如果程序采用了FP16的話,性能會較FP32快一倍,對于手機(jī)應(yīng)用來說,F(xiàn)P16 提供了10位的有效值和5位的指數(shù),是可以滿足許多情況下的圖形渲染計(jì)算的需求。
要正確使用這類FP16需要比FP32更多的技巧,像當(dāng)年NVIDIA的NV3X就提供了FP32 + FP16設(shè)計(jì),但是在和AMD R300的性能競爭中一直處于下風(fēng),維持NV3X拉力的主要靠NVIDIA和各個(gè)游戲開發(fā)商緊密的合作關(guān)系。
上表中的GFLOPS指標(biāo)是指GPU計(jì)算單元運(yùn)行于1GHz時(shí)候的情況,不過我們目前尚未有可靠的iPhone 6s系列GPU運(yùn)行頻率規(guī)格,wiki百科上寫的蘋果A9 GPU為450MHz(此時(shí)的單精度浮點(diǎn)性能是172 GFLOPS)或者533MHz也只能是參考。
根據(jù)GFXBench的ALU測試結(jié)果,iPhone6s Plus(GT7600,6 USC)是 12781fps,iPhone6 Plus(GX6450,4 USC)是5847 fps,這意味著前者的計(jì)算性能是后者的兩倍左右,考慮到ImgTec曾經(jīng)表示PowerVR Series 7XT浮點(diǎn)性能在同頻、同規(guī)模下的性能是PowerVRSeries 6XT 1.6 倍,這個(gè)測試結(jié)果表明iPhone 6s Plus的GT7600頻率很可能和iPhone 6 Plus的GX6450相當(dāng)。
業(yè)界也有人認(rèn)為iPhone 6s系A(chǔ)9采用的并非GT7600,原因是開發(fā)文檔缺乏一些PowerVR Series 7XT存在的Tessellation等特性以及采用Metal作為API,這其實(shí)因?yàn)镻owerVR的授權(quán)本來就允許廠商自行定制驅(qū)動(dòng),像 Intel的GMA系列GPU就沒有開放TBDR這樣的PowerVR最核心技術(shù),而且Tessellation對于這個(gè)級別的GPU而言意義也不是很大(有多少人用過iPhone 6 GX6450里的那個(gè)Tessellation?),所以不必太為此糾結(jié)。
下表是常見的PowerVR Series 6 GPU規(guī)格表,浮點(diǎn)性能部分依舊是以1GHz頻率為參考。
其中的G6200目前在諸如紅米Note2/Note 3、魅族 MX5、魅藍(lán) Metal、索尼 Sony Xperia M5/M5 Dual、亞馬遜Fire HD 8/10等智能手機(jī)和平板設(shè)備中采用,尤其是前三者,目前在市場上屬于比較火的產(chǎn)品。
以紅米Note 2為例,標(biāo)準(zhǔn)版的G6200頻率是550MHz,增強(qiáng)版是750MHz,單精度性能分別是42 GFLOPS和57.6 GFLOPS,和iPhone 6s的150+GFLOS顯然是有明顯差距的,從GPU的角度而言,搭配G6200的設(shè)備在運(yùn)行重度三維游戲的時(shí)候會明顯比iPhone 6s慢,以GFXBench為例,各項(xiàng)測試結(jié)果差距在3倍到13倍左右。
例如在離屏模式下,1080p算術(shù)邏輯單元2測試結(jié)果紅米Note 2是 749.4 frames,iPhone 6s是 3824 frames,大約是5.1倍,這意味著iPhone 6s GPU的浮點(diǎn)性能是214 GFLOPS左右,推算出來的iPhone 6s GPU頻率是550MHz到600MHz左右(假設(shè) Metal API 版渲染動(dòng)作、精度都是和OpenGL ES版本是一樣的)。
在2016年,我們預(yù)期會看搭載到比GT7600快接近一倍的頂配PowerVR GPU手機(jī)產(chǎn)品。目前手機(jī) AP(應(yīng)用處理器)還基本能按照摩爾定律高速發(fā)展,行業(yè)的增長勢頭還算是比較樂觀,廠商有足夠多的資金用于制程的而研發(fā)改進(jìn),例如對16nm/14nm制程進(jìn)行改進(jìn),降低功耗,適當(dāng)增大電池容量,對微架構(gòu)進(jìn)行調(diào)優(yōu)以及內(nèi)存技術(shù)的變化,都有望增加實(shí)現(xiàn)速度提升一倍的機(jī)會。
上圖是ImgTec日前發(fā)布的PowerVRSeries XT 7 Plus,顧名思義,它是PowerVR Series XT 7 的加強(qiáng)版,主要加強(qiáng)的地方包括:
增強(qiáng)整數(shù)單元的單元數(shù)和靈活性,例如每個(gè)其中的兩個(gè)32位整數(shù)單元可以同時(shí)執(zhí)行8個(gè)8位整數(shù)操作,這對于OpenCV這類可視化計(jì)算來說是有不少好處的。
首次實(shí)現(xiàn)了OpenCL 2.0的支持,CPU和GPU可以在同一塊虛擬內(nèi)存上運(yùn)作,編程的時(shí)候內(nèi)存指針不需要再作嚴(yán)格區(qū)分。
增加了動(dòng)態(tài)并行化功能,可以在無需GPU干預(yù)的情況下創(chuàng)建新的GPU線程。
新增了一個(gè)2D圖片處理數(shù)據(jù)前端,主要用于不涉及幾何和塊元的處理,適合做二維以及圖片處理應(yīng)用。
不過按照ImgTec的說法,PVR SXT7 Plus需要到2017年才有望看到,當(dāng)然,我們不排除在下一代iPhone或者iPad上出現(xiàn)PowerVR Series 7。
中低端方面GPU的提升有可能會更激進(jìn)一些,假設(shè)今年的中檔手機(jī)也是搭配 MT6795的制程升級版,可以預(yù)期GPU也會得到相應(yīng)的提升,在保持同樣功耗的情況下,GPU有望升級至G6430等級(150 GFLOPS)。
高通Adreno系列——ATI血脈
相較于ImgTec而言,高通公司在GPU方面的耕耘其實(shí)是有一定差距的,在缺乏底蘊(yùn)的情況下,一家土豪型的公司最簡單、最直接的收購,而對象則是AMD的Imageon。
雖然說是AMD的Imageon,但是Imageon其實(shí)是AMD 2006年收購的顯卡公司ATI的項(xiàng)目,高通在2009年收購了這個(gè)項(xiàng)目并將其更名為Adreno,當(dāng)年AMD和Intel拋售非x86業(yè)務(wù)給人的感覺是非常果斷的,他們可曾料到一年后喬布斯推出的iPhone所引領(lǐng)的智能手機(jī)現(xiàn)在正在給他們帶來最痛苦的時(shí)刻。
既然是源自ATI的,這個(gè)Adreno自然有很深的ATI烙印。在2000年后,NVIDIA和ATI的GPU(NV3X的EarlyZ、R200的HyperZ等)都或多或少地采用分塊式立即渲染架構(gòu),也就是TBIMR(Tile Based Immediate Mode Rendering),Adreno 200 就是源ATI 2002年時(shí)候的Imageon Z430。
TBIMR和TBDR相比,每個(gè)三角形都會按照遞交的順序交給著色器處理,理論上所有三角形都必須依照遞交的次序處理,不過GPU廠商引入了Early-Z技術(shù)來嘗試將一些不可見的片元剔除掉。
在高通的“Qualcomm® Adreno™ OpenGL ES Developer Guide”里,對Early-Z有以下的介紹:
在早期(2001年前)的GPU里,Z-test(Z軸深度測試)都是和阿爾法測試一樣在像素著色完成后才進(jìn)行的。
后來到了NVIDIA GeForce 3(NV20)和ATI RADEON 8500(R200)的時(shí)候,GPU 中開始引入名為Early-Z的操作(NVIDIA將其歸入到名為Lighspeed Memory Architecture的概念中,ATI則將其歸入到Hyper-Z里)。
Early-Z在GPU渲染流水線中位于三角形遍歷和像素著色器(含紋理單元)之間,它會讀取并測試片元的Z深度值,在進(jìn)入像素著色單元之前拋棄掉不可視的片元。
Early-Z只有在三角形按照從前往后(由近及遠(yuǎn))的遞交順序才能起作用,而且為了做到片上高速處理,一般會采取層次化Z緩存(Hierarchical Z-buffer)技術(shù)。
在采用Hierarchical Z-buffer的時(shí)候,GPU 會把每2×2個(gè)片元的四個(gè) Z值中最接近屏幕或者眼睛的Z值取出來,存到一個(gè)更“粗糙”的版本。
這個(gè)更“粗糙”版本的Z-buffer分辨率只有原 Z-Buffer的四分之一,GPU再對這個(gè)“粗糙”版本的Z-buffer再做同樣的事,一直重復(fù)直到分辨率只有一個(gè)片元。這樣一來,就形成一個(gè)pyramid(金字塔)。
在渲染片元的時(shí)候,GPU先比較最粗糙版本的Z-buffer。如果要畫的片元Z值還比較遠(yuǎn),那這個(gè)片元就一定不用畫出來了。如果它比較近,就再拿比較細(xì)的Z-buffer來比較,一直比較到最細(xì)的版本。在理想的情形下,通常大部分的片元都不需要比較到最細(xì)的版本,所以可以節(jié)省不少時(shí)間(要記得,一個(gè)“粗糙”版的Z值比較,其實(shí)就等于和四個(gè)“精細(xì)”版的 Z 值比較)。
相較之下,PowerVR的TBDR會在幾何階段的三角形裁剪后將當(dāng)前 scene(場景或者說畫面)的三角形經(jīng)過篩選排序存放在scene buffer 內(nèi),然后由 HSR(隱面消除)算法將攝像機(jī)視點(diǎn)不可見的片元剔去掉,這部分實(shí)現(xiàn)細(xì)節(jié)已經(jīng)在PowerVR一節(jié)中有闡述,這里就不再復(fù)述了。
按照高通的說法,Adreno從3xx系列采用了名為FlexRender的渲染架構(gòu),可以自動(dòng)在立即渲染和TBDR之間切換,而且這個(gè)TBDR的執(zhí)行過程和PowerVR TBDR是基本一樣的(同樣有對三角形進(jìn)行binning和剔除無效片元的處理):
所以從微架構(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 性能測試結(jié)果是287 GFLOPS,相較之下,價(jià)格799元的紅米Note 2(Power VR 6200)只有44 GFLOPS,前者是后者性能的6.52倍,當(dāng)然,這個(gè)測試只是屬于底層測試,實(shí)際的游戲體驗(yàn)因人、因應(yīng)用而異。
安謀Mali——弱核化設(shè)計(jì)
安謀(ARM)最為人熟知的是旗下的各款 ARM CPU內(nèi)核,目前的主要手機(jī)幾乎都是采用ARM 陣營的CPU。
ARM的GPU Mali是ARM在2006年收購的挪威公司Falanx獲得的,源起于是90年代由ARM在挪威科技大學(xué)支持的的項(xiàng)目,到了2001年由Borgar Ljosland與四位在該項(xiàng)目中的GPU團(tuán)隊(duì)學(xué)生于2001年創(chuàng)辦了這家Falanx Microsystems。
Falanx最初是希望打進(jìn)臺式機(jī)市場,不過隨著3dfx、Matrox等公司的萎靡、敗退,臺式機(jī)GPU市場的格局發(fā)生了很大的變化,不再有空間給新丁了,F(xiàn)alanx轉(zhuǎn)向了從事手機(jī)、PDA、機(jī)頂盒、游戲掌機(jī)、信息機(jī)等領(lǐng)域,不過他們當(dāng)時(shí)在這個(gè)領(lǐng)域其實(shí)做得并不算很出色,ARM的收購對他們來說是一個(gè)重要的轉(zhuǎn)折點(diǎn)。
ARM收購Falanx推出的第一款GPU就是2007年的Mali-200,是Mali第一款OpenGL ES 2.0 GPU,它和它的換代型號Mali-300、Mali-400、Mali-450都是基于名為Utgard(北歐神話中Utgard-Loki統(tǒng)治下約頓巨人位于仙宮與塵世之外的宮殿)的微架構(gòu)。Utgar采用的是非統(tǒng)一架構(gòu),頂點(diǎn)指令和像素指令有各自專門的單元來執(zhí)行,到了Mali-400時(shí)候?qū)崿F(xiàn)了多核能力。
Mali最新的微架構(gòu)代號是Midgard,和Utgard不同的是,Midgard開始采用統(tǒng)一著色架構(gòu),幾何和片元操作指令都在同一個(gè)著色器單元上執(zhí)行。
Mali同樣采用了分塊式渲染(塊元大小是16x16),但是根據(jù)下面這個(gè)幻燈片,可以看到其scene buffer或者說primitive buffer保存的圖元順序必須和程序遞交的順序保持一致(畫紅線部分),不存在PowerVR那樣的篩選(sorting)動(dòng)作。
因此如果按照ImgTec的說法 Mali并不能算是真正的TBDR,當(dāng)然,它還是具備 Early-Z這樣的隱面消除能力,只是粒度上肯定不如PowerVR那么細(xì)(PowerVR自稱其HSR能力為pixel perfect)。
在渲染流程方面,Mali或者說Midgard和目前你看到的大多數(shù)GPU做法有些不一樣,那就是作為統(tǒng)一渲染架構(gòu),它可以在同一時(shí)間里同時(shí)對幾何和片元進(jìn)行渲染操作,而其他的GPU在同一時(shí)間里要嘛就是幾何計(jì)算要嘛就是片元計(jì)算:
如上圖所示,你可以看到Mali可以在同一時(shí)間片上同時(shí)進(jìn)行幾何和片元操作,這表明Mali內(nèi)部的任務(wù)調(diào)度設(shè)計(jì)非常靈活,原因請看下面的介紹。
上圖是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)部是沒考慮擴(kuò)展的,至少目前是這樣。像ImgTecPower VR XT7等其他廠牌的GPU內(nèi)部的CU數(shù)都是具備延伸能力的,而Mali GPU則對不起,不管什么型號的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相對于目前大多數(shù)其他廠商GPU的另一個(gè)區(qū)別要點(diǎn)是它的A-Pipe采用了SIMD向量處理設(shè)計(jì),寄存器能夠像目前CPU的SIMD單元那樣靈活地拆分成2xFP64、4xFP32、8xFP16、2xInt64、4xInt32、8xInt16、16xInt8等數(shù)據(jù)類型訪問。
按照ARM的說法,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,從上圖來看,VMUL和VADD以及SADD、SMUL的FLOPS是應(yīng)該是10個(gè),余下的7個(gè)就是那個(gè)VLUT。
LUT的含義并不是很清楚,也許是查表(Look-up Table)的含義,不過這樣的話,我覺得似乎不太適合將其歸入到人們常說的通用計(jì)算性能指標(biāo)里,即使其使用的是VLIW指令集。
所以我覺得每條A-Pipe的單精度性能應(yīng)該視作每周期10個(gè)比較合適。對于Mali-T880MP16來說,在 650MHz 時(shí)候的單精度性能應(yīng)該是312 GFLOPS,同理,Mali-T760MP8的單精度浮點(diǎn)性能應(yīng)該是104 GFLOPS,當(dāng)然這只是我的個(gè)人意見。
LS-Pipe執(zhí)行的是和紋理無關(guān)的內(nèi)存存取動(dòng)作,例如幾何/片元處理時(shí)候的屬性讀取和變量寫入操作。通常而言每條指令就是一次內(nèi)存訪問操作,如果是 A-pipe的向量操作就是單指令Vec4操作。
雖然ARM Mali并非TBDR,不具備在進(jìn)入塊元渲染之前透過篩選將無效的片元剔除掉,但是它的某些型號具備名為Forward Pixel Kill(正向像素剔除,簡稱FPK,見上面Mali-T880 Shader Core架構(gòu)圖中Early-Z后接的就是FPK單元)技術(shù)。
具備這個(gè)技術(shù)的GPU所跑的線程不再是不可撤銷的,如果發(fā)現(xiàn)稍后的線程要向相同像素位置寫入不透明數(shù)據(jù),就會將已經(jīng)在進(jìn)行的計(jì)算終止掉。由于每個(gè)像素需要花費(fèi)一段時(shí)間才能完成,因此 FPK可以有一個(gè)時(shí)間窗口來排空流水線中已有的無效渲染片元。
按照ARM的說法,這個(gè)FPK技術(shù)在最適中的流水時(shí)間窗口下所能達(dá)到的消除無效渲染效果可以和PowerVRTBDR w/HSR媲美,而且無需對整個(gè)畫面的三角形進(jìn)行篩選、無需在程序里添加篩選代碼、能夠?qū)Π胪该鲗ο髮?shí)行正確處理、不會對幀率產(chǎn)生突變影響。
上面這個(gè)表格是維基百科上的Mali各型號規(guī)格表,其中的單精度指標(biāo)是包括了那個(gè)VLUT的。
目前市場上大多數(shù)采用Mali的中端SoC都還是基于Mali-4XX系列,按照 ARM的說法,目前有75%的數(shù)字電視、超過50%的Android平板電腦、大于35% 的智能手機(jī)采用了Mali GPU。
例如小米電視3就采用了Mali-T760MP4這個(gè)GPU,三星去年的旗艦產(chǎn)品Galaxy S6、Galaxy S6 Edge都有采用Mali-T760,我手頭有一臺支持智能卡的電信T6有線電視機(jī)頂盒,搭配的是全志的SoC,其中的GPU也是ARM Mali-400MP,所以這個(gè)看上去有點(diǎn)古怪(完整的弱內(nèi)核設(shè)計(jì))的GPU在市占率方面Mali已經(jīng)取得了相當(dāng)不錯(cuò)的成績。
三星Galaxy S6采用的Mali-T760MP8名義頻率是772MHz,理論單精度性能是123.5 GFLOPS(按照每個(gè)算術(shù)流水線里包含兩個(gè)4 路FP32 SIMD和兩個(gè) FP32標(biāo)量來統(tǒng)計(jì),未將那個(gè)相當(dāng)于7個(gè)FLOPS 的VLUT或者說 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ī)會看到Mali-T8xx系列初露崢嶸,原因是Mali的完整弱內(nèi)核比較便于隨意搭配,新內(nèi)核帶來的規(guī)格、性能提升也可以為新應(yīng)用帶來更好的用戶體驗(yàn)。
結(jié)語
在這篇文章里,我們介紹了三個(gè)常見的智能設(shè)備或者說手機(jī)/平板電腦的GPU,涉及到的知識面相對坊間的大多數(shù)文章而言要更深入一些,例如ImgTec的PowerVR、高通的Adreno、ARM的Mali雖然都屬于TBR,但是具體的實(shí)現(xiàn)卻有著各自的特色。
ImgTec的PowerVR是三個(gè)TBR架構(gòu)中歷史最長的,也是10年GPU大戰(zhàn)中少數(shù)幸存下來并且活的還比較滋潤的廠商之一,PowerVR在TBDR方面擁有非常豐富的實(shí)作經(jīng)驗(yàn),憑借 TBDR 的高能效比特點(diǎn),在移動(dòng)設(shè)備中站穩(wěn)了腳跟,成為包括蘋果在內(nèi)眾多手機(jī)廠商選擇的GPU方案。
高通的 Adreno 從3xx系列開始引入了名為FlexRender的渲染技術(shù),能動(dòng)態(tài)在IMR和TBDR渲染模式之間切換,前者可以在兼容性、響應(yīng)時(shí)延方面提供最佳的保證,而后者可以在性能耗電比方面達(dá)到更佳的體驗(yàn)效果。
Mali的渲染架構(gòu)相對簡單,屬于TBIMR,也就是分塊式立即渲染,對遞交的三角形順序不作篩選處理,分塊的主要目的是節(jié)省帶寬,不過它的某些型號具備名為 Forward Pixel Kill的技術(shù),能夠隨時(shí)停掉“預(yù)見”到的無效像素(線程)的渲染,號稱可以達(dá)到媲美PowerVR TBDR 的效果。同時(shí),Mali采用了“完整弱GPU內(nèi)核”(相對于其他廠商的“完整可延伸GPU內(nèi)核”而言)設(shè)計(jì),內(nèi)核中的渲染單元不能擴(kuò)展,性能的規(guī)模延伸是透過增加內(nèi)核數(shù)來達(dá)到。
我們在本文中沒有對NVIDIA的GeForce ULP和Intel的GenX進(jìn)行介紹,不過它們其實(shí)基本上就是同架構(gòu)的臺式機(jī)版本的規(guī)模縮減版,當(dāng)然,由于針對的移動(dòng)設(shè)備,其中還有一些省電措施,遺憾的是,這兩家廠商的GPU雖然性能不錯(cuò),但是在手機(jī)市場上由于各自自身的因素而缺乏整機(jī)廠商的支持。
對大多數(shù)讀者來說,GPU架構(gòu)甚至GPU是啥,的確完全可以不需要了解,只要媒體或者朋友介紹說哪一部手機(jī)好用甚至是看上去外觀比較合眼緣就可以讓他們毫不猶豫地掏腰包購買。
所以,本文從一開始就不打算透過這篇文章來影響讀者的購買意向,這只是一篇有科普性質(zhì)的文章,盡可能地較少功利的因素,但求看起來資料盡可能詳細(xì)有趣同時(shí)又能增加一些見識就行。
(審核編輯: 滄海一土)
分享