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