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