1. 程式人生 > >移動GPU全解讀(二)

移動GPU全解讀(二)

分表 標量 2.0 特效 one 高精 上一個 能夠 兩個

技術分享【編者按】:本文作者為愛搞機特約作者、技術達人“炮神”@ioncannon。

在上一篇移動GPU解讀中,對移動GPU的架構、相關參數進行了介紹,本部分介紹的則是移動GPU的Shader、GPU兼容性、“多核”的真相以及跑分問題。

說說被忽略的Shader

接下來我們回到Shader。Shader是GPU裏負責計算的主要部分,同一時候占得面積最大。耗電也最多。

當今的桌面GPU往往都不再談三角形生成率。或是像素填充率了,給的指標都是Shader的計算能力——GFLOPS。可見,Shader性能會越來越重要。

移動GPU也有著這種趨勢。我們看一下Anandtech測試的各款GPU的GLBenchmark的Egypt HD 1080p Offscreen得分:技術分享

右邊的綠色數字是該GPU在FP16精度下大致的計算性能,單位為GFLOPS。

能夠看到除去個別的GPU,Egypt成績跟Shader計算能力的相關性還是比較明顯的。

先做一點鋪墊:

首先。對於浮點數做一次加法或者乘法,都算是一次操作。記作1 FLOPS。

浮點數是有一定的精度的,比方16bit的浮點數。精度就是FP16。再高一點的FP32就是32bit的浮點數。也就是常說的單精度;更高的就是64bit的雙精度FP64了。一般來說,僅僅有FP32和FP64的操作才幹算是FLOPS。

在移動平臺的OpenGL ES裏,能夠指定高、中、低三種不同的精度。

對不同的GPU來說,高、中、低精度的實際值略有區別。

例如以下圖所看到的:技術分享

對於Adreno和GC系列,不管何種選擇何種精度,都會依照FP32精度進行計算

而Mali-400和Tegra的ULP GeForce的Pixel Shader部分不支持高精度。最高僅僅支持中等的FP16精度

絕大部分遊戲的Pixel Shader計算都採用中等(FP16)的精度,而Vertex Shader的計算通常是FP32的精度。

其次,關於統一渲染架構(Unified Shader)和分離的渲染架構(Discrete Shader)。前者的Shader既能進行Vertex的計算,也能進行Pixel的計算,比如PowerVR。Adreno,GC系列。

後者的Vertex Shader和Pixel Shader是分開的。典型的比方Mali-400和ULP GeForce。相對來說,統一渲染架構的Shader利用率會高些,在遇到三角形特別多像素特別少,或者相反的情況下,Shader的計算能力不easy被浪費。

技術分享

最後,因為頂點坐標(xyzw)和像素顏色(rgba)都具有四個屬性,為了提高效率,Shader往往被設計成Vec4的SIMD,也就是能夠對四個數據進行打包。然後用一條指令相同的處理。當然假設數據少於四個。計算能力就被浪費了。也有設計成一次僅僅能處理一個數據的標量(scalar)單元。

各家GPU的Shader組成

1. 高通Adreno系列技術分享

Adreno系列為統一渲染架構。shader ALU為典型的Vec4 + Scalar,Vec4每周期能夠處理4個FP32的MAD運算(乘加運算。記為2 FLOPS)。Scalar單元不能做MAD。所以,

一個Adreno的Shader單元,每周期可提供的浮點操作數為4×2 + 1= 9 FLOPS。

主流Adreno GPU運算能力:

Adreno 200, 2 Vec4+1。 133MHz,2.4GFLOPS

Adreno 205。 4 Vec4+1, 266MHz。9.5GFLOPS

Adreno 220, 8 Vec4+1, 266MHz,19.1GFLOPS

Adreno 225, 8 Vec4+1, 400MHz,28.8GFLOPS

Adreno 320, 假設是16Vec4+1, 跑400MHz的話。就是57GFLOPS

以上都是FP32的計算能力。因為OPENGL ES裏。高中低精度Adreno都是依照FP32跑,因此在低精度的情況下,也不能獲得性能提升。

2. PowerVR SGX系列

2.1 舊的SGX5系列

包含SGX530/531/535/540/545,其Shader計算單元為USSE。

USSE一個周期。能夠對4個FX10(10bit的定點數,比FP16精度更低) 或者 2個FP16 或者 1個FP32 進行MADD操作。因為FP32才算是正常意義上的FLOPS,所以其性能每周期2 FLOPS。可是當兩個FP32的操作共享一個操作數時。USSE也能夠在一個周期裏處理,此時就是2個FP32的MAD操作,4 FLOPS。所以。USSE的FP32性能,每周期為2~4 FLOPS。

主流SGX5 GPU運算能力:

SGX530, 2USSE,200MHz,0.8~1.6 GFLOPS

MTK的SGX531,2USSE,300MHz。2USSE,1.2~2.4 GFLOPS

三星蜂鳥SGX540,4USSE,200MHz,1.6~3.2 GFLOPS

OMAP4460,ATOM Z2460的SGX540 400MHz。 4USSE,3.2~6.4 GFLOPS

只是在FP16下,也就是大多數遊戲的Pixel Shader精度下。相比FP32的最差情況下就能翻倍了。相同在更低精度的FX10下,還能再翻倍。

2.2 SGX 5XT系列

包含SGX543/544/554,和它們的各種多核版本號。

其Shader計算單元為USSE2。

USSE2不像之前那樣了。是個Vec4+scalar的架構,單周期支持4個FP32的MAD操作,外加一個簡單的scalar操作(ADD/MUL),這樣跟Adreno一樣,每周期 9 FLOPS。

單個543/544包括4個USSE2,性能基本一樣,544多一些DX的API支持。

單個554則包括8個USSE2。

主流SGX5XT GPU運算能力:

iPhone 4S裏的543MP2,2×4=8個USSE2,200MHz,14.4 GFLOPS

OMAP4470裏的單個544,384MHz,4USSE2,跟上面類似

全誌A31裏的544MP2,所謂的8管線就是8USSE2,300MHz,也有21.6 GFLOPS

iPad3裏的A5X。543MP4。16USSE2,250MHz,36 GFLOPS

iPad4的A6X。554MP4,32USSE2,280MHz,就突破80 GFLOPS了


在運算較低精度的FP16時。USSE2的性能還能有一定的提升。

3. ARM Mali系列

3.1 Mali-400

Mali-400並不是Unified Shader。是頂點和像素處理分開的

一個頂點處理器包括一個Vertex Shader 。Vec4,支持FP32精度

一個像素處理器包括一個Vec4的Pixel Shader,以及一個TMU, Shader支持FP16精度

主流Mali GPU運算能力:

一個Mali-400“單核”。400MHz下,計算能力為6.4 GFLOPS

Exynos 4210的Mali-400 MP4,266MHz,則為10.6 GFLOPS

Galaxy S3的Mali-400 MP4。 440MHz,則為17.6 GFLOPS

Note2的Mali-400 MP4,執行在533MHz,則為21 GFLOPS

當然這些都是FP16…… 由於Mali-400的Pixel Shader不支持FP32精度。

3.2 Mali-T6xx系列

T6xx採用新架構。Shader為統一渲染架構。

當中T604/624/628 ,一個核心含有2個ALU,而T658/678,為強化計算型,一個core含有4個ALU。技術分享

每一個ALU是個128bit wide的Vector Unit加上一個32bit的Scalar單元組成。技術分享

所以,單精度(FP32)性能為每周期9個。同USSE2。

那麽Exynos 5250裏533MHz的Mali-T604 四核。FP32的計算能力為 38.4 GFLOPS

相同,由於遊戲裏用的多的Pixel Shader是FP16精度。而T604的VU ALU此時處理能力能翻倍變成8個,這樣每周期就是8*2 + 1 =17個。

符合ARM宣稱的500MHz下單個T604核心17GFLOPS。四核心68GFLOPS的數據。

那麽Exynos 5250裏533MHz的Mali-T604 四核,FP16的計算能力為 72.5 GFLOPS

4. GeForce ULP

GeForce ULP同Mali-400。是分離的Shader架構。其Vertex Shader和Pixel Shader都是Scalar的,並不是Vec4。頂點支持FP32精度,像素部分支持FP20和FX10精度。所以。

“8核”Tegra 2, 4VS + 4PS,300MHz,計算能力為4.8 GFLOPS

“12核”Terga3,4VS + 8PS,520MHz。計算能力為12.5 GFLOPS

5. Vivante的GC系列

跟Adreno差點兒相同,也是Vec4 +1的結構。相同高中低精度都依照FP32計算,低精度下不會有提升。

RK29的GC800, 1Vec4+1, 450MHz,4 GFLOPS

飛思卡爾i.MX6的GC2000, 4Vec4+1,600MHz。21.6 GFLOPS

海思K3V2的GC4000,8Vec4+1。480MHz,34.6 GFLOPS

GPU“兼容性”

如今還有個常常被提到的是GPU的“兼容性”問題,這裏就要涉及到各個GPU支持的紋理格式了。

首先是ETC1,這個是OPENGL ES 2.0支持的紋理格式。大家都得支持。但這個紋理的一個缺點是不支持alpha通道,所以對於有alpha通道的紋理。就要拆成2個紋理去讀取。效率低,浪費了帶寬。

而PVRTC是PowerVR自家的紋理格式。相同ATITC是高通Adreno的紋理格式,此外S3TC就是桌面非經常見的DXT,微軟DirectX 3D的紋理格式,這些都是支持alpha通道的。

PowerVR GPU支持自家的PVRTC和通用的ETC1(iOS下的PVR GPU僅僅支持PVRTC),Adreno支持自家的ATITC和通用的ETC1。NV的GeForce和Vivante的GC系列支持DXT和ETC1。剩下Mali-400僅僅支持ETC1。

所以。相應不同的GPU,會有不同的遊戲數據包。通用數據包,一般都會採用ETC1,盡管通用,但因為不支持alpha通道要貼圖2次,對於非Mali的GPU事實上都算是吃虧了。假設用自己支持的其它格式。就不用受這個苦了。對於貼圖單元(TMU,Texture Mapping Unit)數目相對較少的Adreno 2xx系列,恐怕更是吃虧。

當然,紋理的支持度僅僅是兼容性的一方面,並非兼容性問題的所有。技術分享

各家的“多核”

GPU硬件的部分基本說完了,這裏總結一個表格,同一時候給出了GPU廠商官方定義的一個“核”的內容,誰的核裏料多,誰比較不厚道,應該也是一目了然了吧。面對各種“16核”“8管線”的宣傳,大家也應該能比較清楚的辨別了吧。技術分享

跑分跟實際表現不一樣?優化非常重要!

最後。規格僅僅是GPU的一個方面。實際表現跟架構也有非常大的關系。

更進一步的,就算是Benchmark中跑分差點兒相同的GPU。在不同的遊戲中,實際表現也會有區別。

首先,Benchmark程序,大部分都是公平的,所以本質上。Benchmark都是“零優化”程序,公平起見,他們的紋理會用RGBA的PNG,TGA。或者ETC1紋理。不會用到各個GPU自家的格式。

可是遊戲不一樣,遊戲能夠做對應的優化

比如PVR的GPU。能夠用4bpp甚至2bpp的PVRTC紋理,相比於未壓縮的貼圖就能夠節省8倍甚至16倍的帶寬。

而沒有被優化到的情況下。可能僅僅能跟著Mali用不支持alpha通道的ETC1。做2次貼圖,浪費帶寬。部分廠商甚至在通用數據包裏放了一些未壓縮貼圖,那差距就更大了。同款遊戲。跑分接近的GPU。iOS上的特效更好,流暢度更佳,就有優化的原因。

其次。Benchmark在一定程度上都是相對超前的。

大部分GPU跑Benchmark的幀率,都不會到流暢的級別(要是滿幀了還怎麽測出差別)。早期的Benchmark可能更加側重貼圖和像素部分。新一代的Benchmark則提升了場景復雜度,對多邊形和Shader計算的壓力進一步增大。比如GLBenchmark 從2.1到2.5的提升。因此。一些三角形生成能力和原生Shader計算能力高的GPU。比方Adreno 220/225。得分提升就會比較明顯。而Mali-400則在2.5中遇到三角形生成的瓶頸。得分表現不如之前。

而遊戲是給人玩的,終端廠商或是SOC廠商能夠跟遊戲廠商合作,針對GPU的特點進行對應的優化。不同GPU側重非常不一樣,比方Mali-400。三角形非常弱,像素部分,填充率強。高通Adreno 2xx,Vivante的GPU。多邊形非常強,Shader計算強,但填充率較弱。

假設場景對Mali優化,遊戲商能夠降低畫面中多邊形的量,用貼圖和像素部分實現很多其它的特效。這樣對Adreno 2xx系列不利。假設對Adreno優化,則能夠添加場景復雜度。用很多其它的三角形進行更精細的建模,但這樣對Mali則不利。這僅僅是一方面,在一些細節上。還能夠進行更深層次的優化,各家的GPU也都會提供對應的工具。技術分享

最後,GPU的跑分在一定程度上能反映GPU的實際性能,但終於在遊戲中的表現還是非常看廠商優化的。所以也不要一味的盯著跑分,多問問玩過的朋友,多看看實測。會更有幫助。

移動GPU全解讀(二)