GPU加速原理
關於GPU是如何加速的?
它的加速原理?
以及它的演變歷史?
都是自己的經驗之談。如有不妥之處請指正!
- 3D顯卡是幹什麼的?
通過計算機的3D圖形計算卡,將模型空間計算完成的結果投射到2D的顯示屏上:由點線面組成封閉多邊形,封閉多邊形光柵化後,具有位置、顏色、法線和紋理等屬性。將模型拓撲化後,賦予各種材質。最終生成的數字化的場景模型。該技術在CAD/CAM、影視動畫製作、遊戲製作領域使用的最多、最廣泛。
數字化的場景模型中會有上百萬個點組成的物體,當滑鼠旋轉時(看人機交互的方式,例如VR/AR就只是用6軸加速度感測器代替滑鼠控制畫面旋轉),場景中上百萬的點同時旋轉,需要的是大量並行計算能力。
而頂點旋轉的公式(矩陣模型)只需要一個,將上百萬個點逐個代入公式中計算,最終獲得旋轉後的模型顯示結果。(重複工作量)
2.GPU是個什麼東西,為何以前是顯卡現在可以應用於那麼多領域?
以前的3D顯卡最主要的目的是為了在2D的顯示屏中顯示三維的物體。生成多邊形、對多邊形對象的渲染,和一些特效的處理。
CPU就是可以做不同解算公式任務的計算硬體。而顯卡是只能同時重複解算一個公式的計算硬體。
有個通俗的比喻:CPU是一個博士啥都懂,顯卡是千萬個小學生同時計算一個公式。
CPU只能一件件的解算,顯卡可以千萬(上億)個同時解算。
舉個栗子:(用3D引擎原理做個模擬圖形顯核)
在CAD中建立模型,英文字元FK的拉伸體。使用AUTODESKCAD中的插入->提取數據,來提取模型中的直線信息。
提取數據中只選擇幾何圖形特性中的起點和端點的XYZ坐標,保存為EXCEL格式文件。因為建模打散後都是直線,導出的是點與點的連接信息,所以還需要進一步對數據篩選,刪除重複坐標點,給每一個坐標設置唯一的ID號。通過比對XYZ坐標獲取起點和端點的ID號,作為線段的頂點連接順序。
按照顯卡的工作原理,將梳理後的頂點坐標和頂點連接通過轉存CSV格式,轉化為自定義的結構體(數組)。之後將頂點坐標數組和頂點連接數組放入顯核代碼中。代碼總共261行,圖形數組佔用了112行代碼。將代碼燒錄後,可以看到視頻效果。喝水不忘挖井人,3D顯核教程鏈接,作者比較厲害,大疆還沒做VR眼鏡控制飛機時,他自己做了一個玩兒。剛實現了通過WIFI模塊遠程控制大疆的Tello無人機,啥時候能商業化就不用出差取樣了。
https://www.zhihu.com/video/982743896350208000由視頻可以看到圖像在實時的旋轉,後台在不停的計算頂點和連接線,FK(作者英文FredKhoo縮寫)這兩個字,由44個頂點,66條連接線組成的場景,在模擬的3D引擎中選擇比較低端的晶元,32 KB的快閃記憶體,在燒錄程序時提示:可用內存偏低,可能出現穩定性問題!哈哈,可以想像如果是遊戲場景幾百萬個頂點實時計算是多麼龐大的工作量,除了計算頂點、連線,還要建立多邊形,渲染面,燈光。
在計算機幾何中間中,無非就是點線面的問題,到這兒,還沒有看到為何Nvidia的顯卡就變成了無所不能的GPU呢??
現實中很多複雜問題都能通過數學建模來解決,數學建模就是把實際問題抽象為數學問題的工作,簡化後很多數學問題都像上圖所示變為了點和線的連接關係問題,是不是有點接近顯卡的工作原理了(定義數據集)。
而數學模型一般都由設計變數、目標函數和約束條件三部分構成。如果把這些部分也加入到顯卡工作集中,就可以實現優化演算法巨量求解了。定義連線規則、設置界限、定義對比值(經驗值)等現在可以通過Nvidia的CUDA編程模型來設計。這一系列問題Nvidia創始人黃仁勛在設計製造顯卡的時候想到了,並且實現了(2001的GeForce 3實現了可編程頂點)將顯卡並行運算的功能應用到各個領域。做優化計算對GPU而言只是做了頂點旋轉,重複工作用它提升計算速度,那是輕而易舉啊。
記得當年ATI還挖苦過Nvidia說他們不務正業,不知現在有何感想?
Nvidia創始人黃仁勛才是推動整個時代大躍進的教父。他不僅發現了顯卡的特點,並實現了可編程顯卡。他把顯卡變為數據發動機,大數據就順理成章的變為驅動燃料。但是如果沒有很好的梳理的數據,這些所謂的大數據就和垃圾沒啥區別。計算機編程的規則是:輸人的是垃圾,輸出的必然是垃圾。如果模擬模型輸入了垃圾數據,那出來的必定是垃圾結果。不用想著人工智慧能幫助你整理數據垃圾,如果哪天真的能了,那要人何用?
在對每一張照片拾取特徵點,將70多萬個特徵點在計算機中連接,不斷的重複工作後,最終生成3D模型。
總結
圖 9 參數化描述
同樣描述一個10個單位正方形,左圖是直接描述,右圖為參數化描述。
當我要修改模型時,最直接的差異是左圖需要修改兩次,右圖只要修改一次。如果模型的某個參數是有規則的,左圖無法設置規則,只能將計算結果寫入模型。而右圖可以定義參數公式,保留建模規則。由此可見:參數化讓模型更智能。
參數化模型與編程中的函數功能如出一轍,當某些功能多次使用時。將該功能寫成函數,多次調用。當功能需要改變時,只要修改一次函數,就能保證所有調用都同時修改了。有時修改後該函數無法滿足特定要求時,就可以由此函數派生出另外一個函數,或者增加函數的變數,實現重複利用。
推薦閱讀: