輕松讀懂移動(dòng)處理器 CPU微架構(gòu)全解析
PowerVR 的渲染模式是 tile-based deferred rendering(分塊式延后渲染)。
分塊式渲染(TBR)并不難理解,就是把畫(huà)面切成若干個(gè) 16x32 或者 16x16 的像素塊進(jìn)行渲染,這樣的好處是可以在芯片上建立一個(gè)中間緩存(也可以稱(chēng)作 Tiler Buffer,分塊緩存,里面用于存放當(dāng)前渲染 Tiler(像素塊)的深度/蠟版幀緩存、色彩幀緩存、渲染對(duì)象等),不再需要片外的顯存來(lái)存放 Z-buffer,讓渲染過(guò)程中的讀寫(xiě)盡量在片上完成,減少內(nèi)存的讀寫(xiě)。
由于在中間緩存渲染的時(shí)候都是很高的精度(IEEE 32-bit),減少了以 16-bit(例如 R:G:B=5-bit:6-bit:5-bit)幀緩存模式時(shí)在內(nèi)存上進(jìn)行透明混合等操作時(shí)的精度損失,因此 TBR 可以較低的內(nèi)存讀寫(xiě)和占用實(shí)現(xiàn)高品質(zhì)的輸出。
ARM 的 Mali、當(dāng)年 Bitboys 的 Glaze3D 都屬于 TBR,不過(guò)也僅此如此,它們并非 TBDR,仍然屬于 IMR(立即渲染器),只有有限的 HSR 能力(例如 Early-Z、Hi-Z 之類(lèi)的技術(shù)),并不能完全消除無(wú)效渲染。
TBDR 是在上面的分塊式渲染(TBR)基礎(chǔ)上增加了對(duì)場(chǎng)景中當(dāng)前屏幕畫(huà)面三角形的篩選分倉(cāng)(binning)的步驟,將三角形的前后位置關(guān)系標(biāo)記起來(lái)并存放于片外的顯存中,這樣就能實(shí)現(xiàn)將不可見(jiàn)面在進(jìn)入著色渲染流水線(xiàn)之前剔除掉,實(shí)現(xiàn)完全消除無(wú)效渲染。
由于增加了分倉(cāng)動(dòng)作,貼圖和著色必須等待三角形可視性問(wèn)題解決后才渲染,渲染上增加了時(shí)延,所以這種渲染方式被稱(chēng)作分塊式延后渲染。
不過(guò)在 OpenGL 中缺乏專(zhuān)門(mén)的標(biāo)記來(lái)指示一幀畫(huà)面什么時(shí)候開(kāi)始和結(jié)束,所以 TBDR 對(duì)一幀畫(huà)面什么時(shí)候才接收到所有的三角形進(jìn)行偵測(cè)將會(huì)有點(diǎn)麻煩,這會(huì)導(dǎo)致三角形分倉(cāng)陷入迷失中。
在 Direct3D 中有 BeginScene() 和 EndScene() 這樣的標(biāo)記,但是由于在幾乎所有的硬件上都沒(méi)有效果,所以開(kāi)發(fā)人員都會(huì)懶得去用這些標(biāo)記并且隨意地在這些界限外使用 z-buffer,這會(huì)導(dǎo)致 API 無(wú)法確保 z-buffer 中存放有效的數(shù)據(jù)。PowerVR 硬件本體雖然可以把 Z-buffer 存放在片外顯存中,但是代碼必須編寫(xiě)正確。
TBDR 可以減少無(wú)效渲染、實(shí)現(xiàn)極高的低內(nèi)存占用渲染輸出品質(zhì),但是它的缺點(diǎn)是需要做一塊容量不小的片上緩存和大量的晶體管確保 TBDR 時(shí)候的兼容性,因此 PowerVR 的芯片面積一般都比 GeForce 這類(lèi) IMR(立即模式渲染器)大不少,另一個(gè)麻煩之處在于行銷(xiāo)的時(shí)候,PowerVR 的紙面規(guī)格相當(dāng)難看(當(dāng)年 PowerVR3 就是搭配 SDR 作為顯存上市的,而此時(shí)市場(chǎng)上的許多顯卡都已經(jīng)搭配 DDR 顯存了),當(dāng)然這個(gè)可以透過(guò)一些媒體測(cè)試實(shí)證加以解決。
上圖是 PowerVR SGX54X MP4 的微架構(gòu)圖,這個(gè)系列中的 PowerVR SGX 543 MP4 曾經(jīng)應(yīng)用于蘋(píng)果 iPad 3 中的 A5X 應(yīng)用處理器中,MP4 表示它是以四內(nèi)核形式組成的 GPU。
需要注意的是,PowerVR 說(shuō)的內(nèi)核是真正的內(nèi)核而非 NVIDIA/AMD 那樣的把單個(gè) ALU 都當(dāng)成 core 的市場(chǎng)行銷(xiāo)術(shù)語(yǔ),它這里的四個(gè)內(nèi)核可以并行處理四個(gè)三角形渲染,NVIDIA 到了 Fermi(GTX 480)開(kāi)始實(shí)現(xiàn)多三角形渲染,而 AMD 是在 Tahiti(7970)開(kāi)始實(shí)現(xiàn)。
在 PowerVR 54x MP4 中,每個(gè)圖芯渲染計(jì)算單元被稱(chēng)作 Multi-Threaded Co-Processor,對(duì)應(yīng) OpenCL 的術(shù)語(yǔ)就是 PE(Processing Element,處理部件)。每個(gè) PE 每個(gè)周期可以完成兩個(gè)浮點(diǎn)操作。
每四個(gè) PE 構(gòu)成一個(gè) Pipe(渲染流水線(xiàn),因此 Pipe 本質(zhì)上就是一個(gè)四路 SIMD),每個(gè) PowerVR SGX54X 內(nèi)核包括四個(gè)這樣的 Pipe,即 16 個(gè) PE,故此 PowerVR SGX54X MP4 就有 64 個(gè) PE。
因此如果 PowerVR SGX 54x MP4 運(yùn)行于 300MHz 的話(huà),浮點(diǎn)性能就是 38.4 GFLOPS。
即使是同一代的 PowerVR,不同的內(nèi)核版本具體的實(shí)現(xiàn)細(xì)節(jié)都可能有些差別,例如 Pipe 內(nèi)的 PE 數(shù)或者是每個(gè)內(nèi)核內(nèi)的 Pipe 數(shù),例如 PowerVR SGX 554 MP4(Apple A6X 采用該 GPU)的每個(gè)內(nèi)核有 8 條 Pipe 而非 PowerVR SGX 54x MP4 的四條。
PowerVR SGX 5 被設(shè)計(jì)成統(tǒng)一渲染結(jié)構(gòu),即幾何體頂點(diǎn)和屏幕像素計(jì)算都是由上面說(shuō)的 PE 執(zhí)行,這樣的好處是讓 GPU 內(nèi)的計(jì)算單元可以盡量保持運(yùn)作狀態(tài),而不是像分離式架構(gòu)那樣遇到非平衡負(fù)載的處理時(shí)候,VS(頂點(diǎn)計(jì)算單元)有時(shí)候在等 PS(像素著色計(jì)算單元)或者 PS 在等 VS。
根據(jù) PowerVR 的資料,SGX 54X 的每個(gè) Pipe 內(nèi)有一個(gè)線(xiàn)程調(diào)度器(Thread Scheduler),每個(gè)線(xiàn)程調(diào)度器內(nèi)有 16 個(gè)線(xiàn)程可供派發(fā),每次可以派發(fā)其中的 4 個(gè)線(xiàn)程給下面的 PE 執(zhí)行。
PowerVR SGX 5 系列中有明確的 API 支持規(guī)格的內(nèi)核基本上都是支持 DX9.X,但是有一個(gè)特例,那就是 PowerVR SGX 545,可以實(shí)現(xiàn) DX 10.1、OpenGL 3.2 支持。
如果資料沒(méi)有錯(cuò)誤的話(huà),PowerVR SGX 5 的 ALU:TEX 比例為 2:1,即每?jī)蓚€(gè) PE 就會(huì)配上一個(gè)紋理單元,因此我們這里的 PowerVR SGX 54x 單個(gè)內(nèi)核具備 8 個(gè)紋理單元。
雖然說(shuō) PowerVR 微架構(gòu)的資料并不是很多,但是相對(duì)于除了 Intel 的其他對(duì)手而言,已經(jīng)是非常大方了。
關(guān)注我們
