天天看點

Shader入門(1.1)GPU的高并行結構和為什麼可以有渲染流水線

基礎知識點

1.CPU和GPU都可以從邏輯上劃分為3個子產品:控制子產品、運算子產品、儲存子產品。

2.控制子產品由指令寄存器、指令譯碼器、操作控制器組成。CPU工作時從記憶體中讀取指令,存放在指令寄存器中,指令譯碼器分析寄存器的指令如何操作,然後由操作控制器向相應的部件發出控制信号。

3.運算子產品接收控制子產品的指令執行各種運算,有算數運算(比如加減乘除等基本運算)和邏輯運算(比如邏輯測試或比較兩個值)。運算子產品的所有動作都是由控制單元的控制信号來進行的,它是個執行部件。

4.儲存子產品是cpu中暫時存放資料的地方,裡面儲存着所有未處理和處理過的資料。寄存器可以減少CPU讀取記憶體的作用,是以提高CPU的運算速度。

5.RAM指的是記憶體,DRAM指的是動态記憶體,SDRAM指的是靜态記憶體,也就是記憶體條。而GPU所使用的記憶體叫做顯存VRAM。

GPU的高并行結構

Shader入門(1.1)GPU的高并行結構和為什麼可以有渲染流水線

這是一張非常多人使用的示意圖,可以很好的解釋CPU和GPU之間的差別。

*上圖中黃色方塊Control指的是控制子產品,綠色ALU指的是運算子產品,橙色Cache指的是儲存子產品,而DRAM指的的動态記憶體。

*CPU執行計算的時候,一個時刻隻能處理一個資料,但是可以對這個資料進行非常複雜的運算。因為CPU對每個資料的處理方式都是不一樣的,這就像是在搞創作,你畫的上一幅畫和這一幅畫不能是一個樣子,否則沒人看,你畫上一張的時候可能畫的是鳥,而這次畫的是花,這就需要不同的邏輯。難以并行運算。

*GPU執行計算的時候要處理的資料往往是同一個模型的數萬個頂點的變換,同一個紋理的數萬個像素的運算,這些計算中,往往除了頂點本身的位置不同,要執行的操作是一模一樣的。寫到這裡忽然就聯想到了一句話“你伸頭也是一刀,縮頭也是一刀。”

由于這種對一批資料進行一模一樣的運算模式,就有了并行結構的産生基礎。

*GPU繪制圖像的方式其實一般是有個确定的起點和終點的,起點就是應用階段準備好渲染資料傳送到緩存中後,GPU開始計算,終點就是繪制完了一幀圖像顯示在螢幕上。在這個繪制階段當中也有一定的順序,比如正常來說要先完成幾何階段,再進行光栅化階段。正是這種比較确定的流程給了GPU很大的計算優化空間。

上面的示意圖中,GPU的計算子產品要比CPU大很多,而控制子產品要小很多,正是這種比較确定的計算流程導緻的。可以這麼說,CPU中的計算像是野外探險,道路曲折,終點不明,這就需要優秀的向導;而GPU中的中的計算像是田徑場上的賽跑,終點明确,距離清晰,你隻需要一把發令槍。

*再有一個方面是,GPU進行運算的時候有個概念叫做“對資料進行獨立計算”,意思是同一階段的運算過程中,任意元素的計算不依賴于其他同類型的資料。舉例如:想要把一個頂點從模型空間變換到世界空間,隻需要準備好變換矩陣和頂點資料,就可以進行計算了,在計算過程中不需要知道另一個頂點到底在哪裡,也不需要去考慮我這個頂點和光源的位置關系。但是CPU他不同啊,有的人就想要先算一算你這個頂點和其他頂點的關系,再來做頂點空間變換,有的人他寫的程式裡又有了其他的奇思妙想,這就讓一個普通的頂點表示壓力很大。

渲染流水線

在了解了GPU有着什麼樣的結構之後,也就可以很快地了解為什麼渲染可以是流水線,為什麼這個渲染還必須要專門的硬體而不是直接拿CPU來算。

上面的文中我寫到GPU有比較明确的計算流程,這個固定的計算流程就是渲染流水線。流水線的工序都是很明确很固定的,你隻能對工序上的一些操作進行修改,而不能直接把流水線掀翻了重擺,關于流水線裡到底有什麼工序,則可以參考https://zhuanlan.zhihu.com/p/97498781

繼續閱讀