GPU管線的最前端一般是一個指令獲取與譯碼單元。這個單元從內存取出CPU傳遞過來的指令,將其進行譯碼。一些命令發送給後面的微核心進行執行,好比DMA數據傳輸、和CPU之間的通訊同步等等;另一些命令則對GPU內的數百個狀態寄存器進行設置,至關於配置流水線上各個環節的參數。前端
這些參數每每並不是是直接配置到流水線做業當中的實際硬件上,而是做爲一個寄存器文件保存在內部。這樣的寄存器文件會有多個,從而能夠保存多套不一樣的流水線配置。性能
想象一下你有一個食品加工廠,如今流水上正在生產山楂糕。這時有一個新的訂單過來,須要你生產怪味花生。若是你這個時候就當即改生產線,則必然會影響還呆在流水線上的山楂糕半成品。因此,你每每會作的事情是將生產怪味花生的參數錄入一個配置文件當中,而後放在那裏,等待山楂糕生產完畢,就讀入這個配置文件開始生產怪味花生。動畫
這個接受訂單而且錄入生產所需配置信息的,就是GPU最前端的ME(Micro Engine)spa
ME在性能上主要須要注意的問題有兩點:對象
- 一些可能會長時間阻塞ME的命令。好比DMA命令。若是須要DMA的數據很大,好比Unity當中的Grab PASS,這個PASS使用DMA將整個渲染結果拷貝回CPU可讀的空間,由於這個DMA發生在ME,那麼就會長時間阻塞命令隊列,也就是堵在了下水道入口,後面的下水道管道當中的殘水流光以後,雖然處於無水狀態,可是水池裏的水也進不來。還有一種命令就是同步命令,這種命令每每是必要的,好比用於與CPU的同步,或者是等待GPU上一批的處理,等等。可是,因爲GPU的管線有必定的長度,是否必定須要在入口處等待,仍是說能夠在中間或者出口的某個地方等待,從而保持管線裏面有水,這是值得思考的。
- 寄存器文件的大小。由於ME會將不一樣的管線配置寫入不一樣的配置文件(術語稱爲context),而這個配置文件由於是一種GPU片上存儲,因此容量十分有限。一般,GPU同時能夠支持的配置文件總數也就是幾個,這樣的數量級。因此,若是命令隊列當中頻繁切換管線配置(術語稱爲context roll),那麼當配置文件用完以後,ME將暫時沒法繼續執行命令隊列,進入等待狀態,直到ME以後的管線部分完成排出一些工做量,釋放context爲止。打個比喻的話,也就是若是把來伊份的某個店頭的零售終端直接接在工廠的生產訂單系統上的話,那麼就會出現好幾十種,每種一兩個這種訂單。在這種狀況下,即使生產線採用了某種外星科技能夠瞬間切換配置,可是若是生產線一次只能記住10個配置,那麼仍是會遇到須要頻繁中止從新輸入配置參數的問題。並且,產線的切換須要等待產線上全部貨物出來。如今一種貨物就一、2包,整個長長的產線空空如也,只能乾巴巴看着這2包從頭跑到尾。現代汽車製造業可能每幾分鐘就能有一臺車下產線,可是這並不意味着一臺車只在產線上呆幾分鐘。將使用相同配置的生產對象合併,儘可能填充滿產線,是關鍵。
當產線配置好以後,須要準備待加工的生料,也就是原材料。GPU當中會有專門的硬件模塊負責從內存讀取頂點信息。讀取頂點信息以後,會有硬件模塊將這些頂點按照必定尺寸進行分組,而後以組爲單位送入管線。索引
這就比如咱們的食品加工產線上,每次提取原材料必定是有一個固定的量:好比每次提取1公斤山楂,或者花生。這1公斤(1份)做爲後面加工環節的一個基本單位,會被同時處理。目的就是經過增長帶寬換取高性能。隊列
接下來GPU就會利用其強大的並行計算能力,對同一組當中的數據,用一樣的代碼進行並行處理。目前咱們的數據是頂點,GPU接下來就是執行咱們所提供的VS shader,也就是頂點着色器程序,將以object space記錄的各個模型頂點座標,轉換成場景座標,也就是將模型放入場景當中。內存
當這步完成以後,咱們獲得了一系列場景座標當中的頂點。接下來是一個被稱爲PA(Primitive Assembler)的機構,將這些頂點按照index buffer當中的index的順序,組裝成爲三角形。而後送入光柵化模塊(rasterizer)。同步
在這個讀取頂點、進行座標變換(VS計算)、而且組裝三角形的過程中,可能出現的性能瓶頸有3處:it
- GPU讀取頂點數據、索引數據的性能。由於這本質上也是內存訪問,因此其受到內存訪問帶寬的制約。這個制約具體是多少,取決於GPU當中負責該功能的模塊與內存的鏈接方式,以及該模塊自身工做方式,不一樣的GPU型號不一樣。可是,有一點是共通的,那就是這個性能的單位是(字節/時鐘週期),而不是(頂點/時鐘週期)或者(索引/時鐘週期)。這就是說,頂點和索引數據的存儲格式很是重要。一個16bit的索引,相比較32bit的索引,在這裏速度會快一倍。
- VS程序自身的複雜度,特別是是否含有內存訪問指令。一般來講,相對於內存讀寫,計算是很是快的。因此在必定範圍內,VS程序不會是瓶頸。可是,若是VS程序當中包括內存訪問,好比訪問地形數據,或者動畫數據,或者別的什麼,那麼狀況就極可能反轉,VS自身的執行時間成爲這個階段的瓶頸。
- VS執行結果的保存。VS輸出的結果是中間結果,因此一般並不會回寫到內存(固然,當代GPU已經有能力經過特殊指令回寫),而是存儲到片上空間。這個片上空間一般容量也十分有限,因此若是VS爲每一個頂點輸出的屬性不少,那麼這個片上空間所能容納的頂點數也就減小,當其滿了的時候,VS將進入等待,直到GPU當中的後續環節消耗掉這些內容的一部分,釋放出足夠空間。