新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 科普:關于GPU 的二三事

        科普:關于GPU 的二三事

        作者: 時間:2018-08-10 來源:網絡 收藏

        除了 CPU(中央處理器)以外,SoC(System On a Chip:片上系統)另一個重要的組成部分是圖像處理單元(Graphical Processing Unit),就是俗稱的 GPU。大家或許都知道玩 3D 游戲少不了它,但具體發揮什么作用也許說不清楚,這回我們就來揭開 GPU 的神秘面紗。

        本文引用地址:http://www.104case.com/article/201808/386196.htm

        GPU 專門用于快速完成一些特定類型的數學運算,特別是對于浮點、矢量和矩陣的計算,能將 3D 模型的信息轉換為 2D 表示,同時添加不同的紋理和陰影效果,所以 GPU 在硬件里也是比較特殊的存在。

        3D 模型是由許許多多小三角形組成的,通過 X、Y、Z 坐標定義每個三角形的頂點。實際處理中,小三角形的頂點會相互重合,如果一個復雜的模型由 500 個小三角形組成,最后需要定義的頂點數并沒有 1500 個那么多。而要將一個抽象的 3D 模型展現出來,三種要素不可缺少:位移、旋轉(三軸)和縮放,所有這些操作統稱為轉換(transformation)。為了不陷入復雜繁瑣的數學運算,處理轉換(transformation)最佳的方式就是運用 4x4 的矩陣。

        從 3D 建模到最終顯示在屏幕上,GPU 渲染場景使用的是流水線操作。早些時候流水線操作是固定不能作任何改動的,整個操作由讀取三角形的頂點數據開始,接著 GPU 處理完后進入幀緩沖區(frame buffer),準備發送給顯示器。GPU 也能對場景進行某些特定效果的處理,不過這些都是由工程師設計固定好的,能提供的選項很少。

        可編程著色器(Programmable shaders)

        在 Android 仍在萌芽之時,桌面級的 GPU 就開始可以對流水線部分的操作進行編程。隨著 OpenGL ES 2.0 標準的推出,移動版的 GPU 也開始支持可編程操作,這些可編程的部分被稱作著色器(shaders),最重要的兩個著色器是頂點著色器(vertex shader)和片段著色器(fragment shader)。每個頂點都會調用一次頂點著色器,所以在渲染一個三角形時頂點著色器需要被調用三次;而片段著色器,我們可以簡單的將每個片段(fragment)想象成屏幕上的每一個像素點,因此每生成一個像素片段著色器就被會調用一次。

        兩個著色器充當不同的角色,頂點著色器主要負責將 3D 模型的數據轉化為現實世界中的位置以及紋理貼圖或者光源,再進行轉換(transformation);片段著色器則用于為每個像素設置相關的顏色。簡單一點的說明:頂點著色器就是處理頂點相關的信息,片段著色器就是處理畫面的顏色信息。

        仔細觀察你會注意到每個頂點的處理都是相互獨立的,同樣每個片段的處理也是如此,這意味著 GPU 能夠并行運行著色器,事實上 GPU 也是這么干的,絕大多數的移動 GPU 都有多個著色器核心(可編程執行著色器功能的獨立單元稱之為著色器核心),至于 GPU 廠商宣稱對于著色器調用優于別家則屬于市場營銷的問題了。

        以 ARM 的 Mali GPU 為例,其系列 GPU 名稱后綴的“MPx”中的 x 代表有多少個著色器核心,Mali T880 MP12 就代表有 12 個著色器核心。每一個核心里面都有一條復雜的流水線,代表著每完成一個著色器操作,新的操作指令就會立刻發出,同時核心里面不止一個算術單元,所以在相同的時間內能完成多個操作。ARM Mali GPU(包括 Mali T600、T700 和 T800 系列)能在每一條流水線每個時鐘周期發出一條指令,所以一個典型的著色器核心能并行發出 4 條指令,Mali GPU 目前最高支持 16 個核心,也就是說可以并行發出最多 64 條指令。

        所有的一切意味著 GPU 是并行處理大量數據的工作方式,與 CPU 非常不同,不是一般的順序操作。但這只是一個小問題,嚴峻的事實在于可編程的著色器核心代表著每個核心的實際表現不再由 GPU 工程師設定好,而是取決于 app 開發者。于是一個質量較差的著色器代碼能讓 GPU 的表現直線下降,幸運的是大多數的 3D 游戲開發者都明白這個道理,會為著色器運行做最佳的優化。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 石台县| 高陵县| 顺义区| 佛山市| 泰安市| 大竹县| 乌什县| 鄂温| 泽库县| 苍梧县| 双柏县| 日照市| 清河县| 乌恰县| 岳池县| 凤山县| 勃利县| 怀宁县| 深州市| 宁乡县| 沙雅县| 南京市| 白水县| 涿州市| 海口市| 天镇县| 新巴尔虎左旗| 根河市| 池州市| 泰州市| 云龙县| 阿勒泰市| 达日县| 晋城| 嘉荫县| 呼和浩特市| 子洲县| 六盘水市| 九龙县| 泰安市| 永济市|