【編者按】:本文作者為愛搞機特約作者、技術達人“炮神”@ioncannon。 本文將從移動GPU的結構、參數、相容性、跑分幾方面讓讀者全方位對移動GPU有一定的概念。由於篇幅較長,分成兩部分介紹,這是第一部分,講解的是移動GPU的結構和相關參數。 前言現在行動裝置的“核戰”越來越激烈,已經從CPU引發到了GPU上,於是“16核”、“8管線”、“MP4”、“三角形產生率”和“填充率”等各種吸引眼球的宣傳鋪天蓋地而來。一直很希望能有些文章來介紹科普下,但或許是專業人士都覺得這些太基礎,最後忍不住,只能由我這個半桶水的非專業人士來寫點啥了。本文參考和引用了網上的一些資料,篇幅有限恕不一一列舉。內容儘可能的科普淺顯,但限於個人的知識層次、理解能力和表達能力,如果有不確切或者錯誤的地方,還請多多指正。 基本的3D流水線首先我們來簡單的介紹下3D的畫面是如何產生的,一個基本的3D流水線如所示: 首先,運行在CPU上遊戲引擎根據遊戲中的一些參數,產生一系列的圖元,將它們的頂點資料發送給GPU。 第二步,頂點處理器(Vertex Processor)對頂點資料進行一系列的變換和光照處理。簡單的想想,遊戲中的各個物體的座標都是參照遊戲中的全局座標系的,而實際顯示的畫面是玩家視角或者攝像機視角,這中間就有許多座標系的轉換。這些活就需要頂點處理器來做,最終我們得到了我們所需要視角的畫面。 但是,到這一步,畫面還只是一些多邊形,而實際顯示在螢幕上的是一個個像素,這裡就需要Rasterizer進行光柵化(Rasterization,3),從而將畫面變成一個像素圖。 第四步,對這些像素進行上色,Fragment Processor中的像素著色器(Pixel Shader)按照程式規定的演算法,計算出畫面中每個像素的顏色,之後第五步就是把結果輸出到記憶體中,全部完成後拿去顯示。當然在這整個過程中,還跟紋理貼圖6有關係。所謂貼圖就是把紋理(一個二維的靜態圖片)按照一定的演算法給貼到遊戲裡的三角形表面上去。 參數,究竟靠不靠譜?終端廠商在宣傳他們手機晶片的GPU如何強勁時,往往會提到一些參數,最常見的就是三角形產生率和填充率。但實際上,不同公司的GPU,他們的這些理論參數,並不具有直接的可比性。我們也可以發現,有些GPU可能給出的理論參數很高,但實際表現卻很一般,甚至不如一些參數低的GPU。這是因為,各個GPU的供應商,比如IMGtec(PowerVR SGX),高通(Adreno),Vivante(GC系列),ARM(Mali),nVIDIA(GeForce),他們給出這些理論資料的測試方式,可能不太一樣。 比如三角形產生率,本身就受到很多測試因素的影響。例如,有些三角形在一開始就會被剔除掉(比如在螢幕外,或者太小了根本覆蓋不到一個像素),不會被顯示也不會需要執行太多的運算,那麼這部分三角形到底應該算嗎?如果算進去的話,三角形產生率自然就高了。或者,測試程式把一些已經計算好的座標提交給GPU,那麼GPU的Vertex Shader就不需要進行複雜的計算,數值自然就高了。再或者,並非產生一個三角形就一定需要處理三個頂點。如果有三角形共用頂點,用indexed的辦法繪製,頂點的數目就可以減少。就像,2個三角形只需要處理4個頂點。如果測試的時候大量使用這種方式,也可以提高三角形產生率的數值。 同樣,填充率反映了GPU的像素輸出能力。但是廠家給出的理論值,很多都是沒有貼圖,沒有Shader計算,僅僅是產生無色點的能力,跟實際使用的情況有較大的差距。又比如Imagination Technologies 的PowerVR SGX系列給出的填充率,並不是實際值,而是實際值乘以了一個2.5x的係數。這是由於PVR GPU架構的特殊性,可以剔除畫面中被遮蔽的部分,不作渲染,減少了無用功。200MHz的SGX540,原生的填充率是400M,而由於這種技術的存在,IMG認為其等效填充率相當於1000M。在實際的情境中,如果遮蔽的部分較多,這個係數可能遠超過2.5x。當然,如果情境中遮蔽較少,這個係數相應的也會變小。 事實上三角形產生率和像素填充率作為衡量GPU效能的參數,在PC平台上,幾年前就已經被淘汰了。由於從DX8開始,現代GPU都已經由可程式化的Shader來代替固定功能的單元實現各種特效,所以Shader的計算能力成為很重要的一點,在移動平台也是一樣的。 移動平台的特點和移動GPU的架構不過呢,移動平台相比於PC平台,還是有很多不同的。從本質上看,是由功耗和體積兩方面限制的,對於圖形處理來說,主要是兩點: 第一,是有限的頻寬。實際上,要增加計算能力,在功耗允許的情況下,堆核心並不是一件難事,事實上我們也看到了不少SOC整合了四核乃至“16核”GPU。但是痛點在於,需要有足夠的頻寬去滿足這顆強大的GPU,避免其出現“餓死”的情況。在左圖的移動平台中,CPU、GPU和匯流排被共同整合在一顆晶片上,稱之為SOC。整個SOC,包括其中的CPU和GPU,共用有限的記憶體頻寬。即使是相對高端的,採用64bit記憶體位寬的一些SOC,如三星4412,高通8064等,也只是6.4 - 8.5GB/s的頻寬,相比起PC平台主記憶體十幾GB/s的頻寬,和PC GPU GDDR5顯存動輒幾十,不少都超過100GB/s的頻寬,只能說是少的可憐。相對另類的蘋果在iPad4中,給A6X晶片搭配了128bit的LPDDR2-1066,頻寬達到了17GB/s,用以餵飽強大的SGX 554 MP4 GPU,但相比PC平台依舊是小巫見大巫。因此,移動平台要在有限的頻寬下實現合理的效能,在不少時候,瓶頸可能並不在於計算能力上,而在於頻寬上。 第二,相比PC平台的CPU,移動平台的CPU浮點較弱,在Cortex-A9開始雖然有所好轉,但64bit的NEON跟案頭128bit甚至256bit的SIMD還是有顯著差距,外加主頻的差別。因此更多的計算也依賴硬體Vertex Shader去完成。 因此,移動平台的GPU相對於PC平台,也會有一些不同。我們回過頭來看一下移動平台的GPU的一些架構。 首先是傳統的IMR(Immediate Mode Rendering)架構 目前幾乎所有的案頭GPU(nVIDIA,AMD)都是IMR架構,在移動領域,nVIDIA的GeForce ULP和Vivante的GC系列GPU都是屬於IMR架構。IMR架構的GPU渲染完物體後,都會把結果寫到系統記憶體中的幀緩衝裡,因此就可能出現GPU花了大量的時間渲染了一個被遮擋的看不見的物體,而最後這些結果在渲染完遮擋物後被覆蓋,做了無用功。這個問題稱之為Overdraw。雖然現代的IMR架構GPU在一定程度上可以避免這個問題,但要求應用程式將情境裡的三角形按照嚴格的從前往後的順序提交給GPU,要完全避免Overdraw還是很困難的。 另一方面,由於IMR架構的GPU頻繁的讀寫和修改幀緩衝,因此對頻寬的要求比較高,同時也增加了電力的消耗。 所以,大部分的移動GPU都採用TBR(Tile Based Rendering)的架構 ARM的Mali GPU和高通的Adreno GPU採用TBR(分塊渲染)架構,實際上IMG的PowerVR也是分塊渲染的。TBR架構在把三角形情境變成像素圖(光柵化)前,先把整個畫面分成小塊,這些小塊的渲染在GPU上的快取裡進行,這樣就避免了對幀緩衝(位於系統記憶體裡)的頻繁讀寫和修改。當然,由於一個三角形可能被分在幾個不同的塊裡,三角形的資料(幾何資料)可能被需要多次讀取,但總的來說還是能大大減少對系統記憶體的訪問,節約了頻寬的同時也減少了電力消耗。 當然,不同的GPU分塊的大小也有所不同,PowerVR和Mali一般是16*16像素的塊大小,而大部分的高通Adreno都帶有256K的緩衝,以256K作為塊的大小進行渲染,高通稱之為binning。 但是,除去PowerVR外的TBR GPU同IMR一樣,還是不能避免Overdraw的問題。 而PowerVR的不同之處在於,它採用的TBDR(Tile Based Deferred Rendering)架構,可以徹底避免Overdraw的問題。 相比TBR更進一步的是,TBDR在光柵化之後,有一個HSR(Hidden Surface Removal))硬體單元,通過對一個塊內的三角形進行測試,剔除掉被遮擋的三角形,合成一幅由所有可見部分組成的畫面,交給後續的流水線去渲染。這樣不可見部分就不需要Pixel Shader去做相應的計算,也不需要去拾取相應的紋理,節省了計算量的同時也節省了頻寬,對行動裝置來說有很大的協助。 |