科普:關(guān)于GPU 的二三事(上)
除了 CPU(中央處理器)以外,SoC(System On a Chip:片上系統(tǒng))另一個重要的組成部分是圖像處理單元(Graphical Processing Unit),就是俗稱的 GPU。大家或許都知道玩 3D 游戲少不了它,但具體發(fā)揮什么作用也許說不清楚,這回我們就來揭開 GPU 的神秘面紗。
本文引用地址:http://www.ex-cimer.com/article/201605/291994.htm
GPU 專門用于快速完成一些特定類型的數(shù)學運算,特別是對于浮點、矢量和矩陣的計算,能將 3D 模型的信息轉(zhuǎn)換為 2D 表示,同時添加不同的紋理和陰影效果,所以 GPU 在硬件里也是比較特殊的存在。
3D 模型是由許許多多小三角形組成的,通過 X、Y、Z 坐標定義每個三角形的頂點。實際處理中,小三角形的頂點會相互重合,如果一個復(fù)雜的模型由 500 個小三角形組成,最后需要定義的頂點數(shù)并沒有 1500 個那么多。而要將一個抽象的 3D 模型展現(xiàn)出來,三種要素不可缺少:位移、旋轉(zhuǎn)(三軸)和縮放,所有這些操作統(tǒng)稱為轉(zhuǎn)換(transformation)。為了不陷入復(fù)雜繁瑣的數(shù)學運算,處理轉(zhuǎn)換(transformation)最佳的方式就是運用 4x4 的矩陣。
從 3D 建模到最終顯示在屏幕上,GPU 渲染場景使用的是流水線操作。早些時候流水線操作是固定不能作任何改動的,整個操作由讀取三角形的頂點數(shù)據(jù)開始,接著 GPU 處理完后進入幀緩沖區(qū)(frame buffer),準備發(fā)送給顯示器。GPU 也能對場景進行某些特定效果的處理,不過這些都是由工程師設(shè)計固定好的,能提供的選項很少。
可編程著色器(Programmable shaders)
在 Android 仍在萌芽之時,桌面級的 GPU 就開始可以對流水線部分的操作進行編程。隨著 OpenGL ES 2.0 標準的推出,移動版的 GPU 也開始支持可編程操作,這些可編程的部分被稱作著色器(shaders),最重要的兩個著色器是頂點著色器(vertex shader)和片段著色器(fragment shader)。每個頂點都會調(diào)用一次頂點著色器,所以在渲染一個三角形時頂點著色器需要被調(diào)用三次;而片段著色器,我們可以簡單的將每個片段(fragment)想象成屏幕上的每一個像素點,因此每生成一個像素片段著色器就被會調(diào)用一次。
兩個著色器充當不同的角色,頂點著色器主要負責將 3D 模型的數(shù)據(jù)轉(zhuǎn)化為現(xiàn)實世界中的位置以及紋理貼圖或者光源,再進行轉(zhuǎn)換(transformation);片段著色器則用于為每個像素設(shè)置相關(guān)的顏色。簡單一點的說明:頂點著色器就是處理頂點相關(guān)的信息,片段著色器就是處理畫面的顏色信息。
仔細觀察你會注意到每個頂點的處理都是相互獨立的,同樣每個片段的處理也是如此,這意味著 GPU 能夠并行運行著色器,事實上 GPU 也是這么干的,絕大多數(shù)的移動 GPU 都有多個著色器核心(可編程執(zhí)行著色器功能的獨立單元稱之為著色器核心),至于 GPU 廠商宣稱對于著色器調(diào)用優(yōu)于別家則屬于市場營銷的問題了。
以 ARM 的 Mali GPU 為例,其系列 GPU 名稱后綴的“MPx”中的 x 代表有多少個著色器核心,Mali T880 MP12 就代表有 12 個著色器核心。每一個核心里面都有一條復(fù)雜的流水線,代表著每完成一個著色器操作,新的操作指令就會立刻發(fā)出,同時核心里面不止一個算術(shù)單元,所以在相同的時間內(nèi)能完成多個操作。ARM Mali GPU(包括 Mali T600、T700 和 T800 系列)能在每一條流水線每個時鐘周期發(fā)出一條指令,所以一個典型的著色器核心能并行發(fā)出 4 條指令,Mali GPU 目前最高支持 16 個核心,也就是說可以并行發(fā)出最多 64 條指令。
所有的一切意味著 GPU 是并行處理大量數(shù)據(jù)的工作方式,與 CPU 非常不同,不是一般的順序操作。但這只是一個小問題,嚴峻的事實在于可編程的著色器核心代表著每個核心的實際表現(xiàn)不再由 GPU 工程師設(shè)定好,而是取決于 app 開發(fā)者。于是一個質(zhì)量較差的著色器代碼能讓 GPU 的表現(xiàn)直線下降,幸運的是大多數(shù)的 3D 游戲開發(fā)者都明白這個道理,會為著色器運行做最佳的優(yōu)化。
評論