深刻淺出計算機組成原理學習筆記:第三十講

1、引子

講完了CPU,我帶你一塊兒來看一看計算機裏的另一個處理器,也就是被稱之爲GPU的圖形處理器。過去幾年裏,由於深度學習的大發展,GPU一會兒火起來了,
彷佛GPU成了一個專爲深度學習而設計的處理器。那GPU的架構到底是怎麼回事兒呢?它最先是用來作什麼而被設計出來的呢?編程

想要理解GPU的設計,咱們就要從GPU的老本行圖形處理提及。由於圖形處理纔是GPU設計用來作的事情。只有瞭解了圖形處理的流程,咱們才能搞明白,
爲何GPU要設計成如今這樣;爲何在深度學習上,GPU比起CPU有那麼大的優點。瀏覽器

2、GPU的歷史進程

GPU是隨着咱們開始在計算機裏面須要渲染三維圖形的出現,而發展起來的設備。圖形渲染和設備的先驅,第一個要算是SGI(Silicon Graphics Inc.)這家公司。
SGI的名字翻譯成中文就是「硅谷圖形公司」。這家公司從80年代起就開發了不少基於Unix操做系統的工做站。它的創始人Jim Clark是斯坦福的教授,也是圖形學的專家。架構

後來,他也是網景公司(Netscape)的創始人之一。而Netscape,就是那個曾經和IE大戰300回合的瀏覽器公司,雖然最終敗在微軟的Windows免費捆綁IE的策略下,
可是也留下了Firefox這個徹底由開源基金會管理的瀏覽器。不過這個都是後話了。性能

到了90年代中期,隨着我的電腦的性能愈來愈好,PC遊戲玩家們開始有了「3D顯卡」的需求。那個時代以前的3D遊戲,其實都是僞3D。好比,
大神卡馬克開發的著名Wolfenstein 3D(德軍總部3D),從不一樣視角看到的是8幅不一樣的貼圖,實際上並非經過圖形學繪製渲染出來的多邊形。學習

這樣的狀況下,遊戲玩家的視角旋轉個10度,看到的畫面並無變化。可是若是轉了45度,看到的畫面就變成了另一幅圖片。而若是咱們能實時渲染基於多邊形的3D畫面的話,動畫

那麼任何一點點的視角變化,都會實時在畫面裏面體現出來,就好像你在真實世界裏面看到的同樣。操作系統

而在90年代中期,隨着硬件和技術的進步,咱們終於能夠在PC上用硬件直接實時渲染多邊形了。「真3D」遊戲開始登上歷史舞臺了。「古墓麗影」「最終幻想7」,這些遊戲都是在那個時代誕生的。
當時,不少國內的計算機愛好者求之不得的,是一塊Voodoo FX的顯卡。那爲何CPU的性能已經大幅度提高了,可是咱們還須要單獨的GPU呢?想要了解這個問題,咱們先來看一翻譯

看三維圖像實際經過計算機渲染出來的流程。設計

3、圖形渲染的流程

如今咱們電腦裏面顯示出來的3D的畫面,實際上是經過多邊形組合出來的。你能夠看看下面這張圖,你在玩的各類遊戲,裏面的人物的臉,並非那個相機或者攝像頭拍出來的,
而是經過多邊形建模(PolygonModeling)建立出來的。3d

 

而實際這些人物在畫面裏面的移動、動做,乃至根據光線發生的變化,都是經過計算機根據圖形學的各類計算,實時渲染出來的。這個對於圖像進行實時渲染的過程,能夠被分解成下面這樣5個步驟:

1. 頂點處理(Vertex Processing)
2. 圖元處理(Primitive Processing)
3. 柵格化(Rasterization)
4. 片斷處理(Fragment Processing)
5. 像素操做(Pixel Operations)

1. 頂點處理(Vertex Processing)

圖形渲染的第一步是頂點處理。構成多邊形建模的每個多邊形呢,都有多個頂點(Vertex)。這些頂點都有一個在三維空間裏的座標。可是咱們的屏幕是二維的,
因此在肯定當前視角的時候,咱們須要把這些頂點在三維空間裏面的位置,轉化到屏幕這個二維空間裏面。這個轉換的操做,就被叫做頂點處理。

若是你稍微學過一點圖形學的話,應該知道,這樣的轉化都是經過線性代數的計算來進行的。能夠想見,咱們的建模約精細,須要轉換的頂點數量就越多,
計算量就越大。 並且,這裏面每個頂點位置的轉換,互相之間沒有依賴,是能夠並行獨立計算的。

2. 圖元處理(Primitive Processing)

在頂點處理完成以後呢,咱們須要開始進行第二步,也就是圖元處理。圖元處理,其實就是要把頂點處理完成以後的各個頂點連起來,變成多邊形。其實轉化後的頂點,
仍然是在一個三維空間裏,只是第三維的Z軸,是正對屏幕的「深度」。因此咱們針對這些多邊形,須要作一個操做,叫剔除和裁剪(Cull andClip),也就是把不在屏幕裏面,
或者一部分不在屏幕裏面的內容給去掉,減小接下來流程的工做量。

3. 柵格化(Rasterization)

在圖元處理完成以後呢,渲染還遠遠沒有完成。咱們的屏幕分辨率是有限的。它通常是經過一個個「像素(Pixel)」來顯示出內容的。因此,對於作完圖元處理的多邊形,
咱們要開始進行第三步操做。這個操做就是把它們轉換成屏幕裏面的一個個像素點。這個操做呢,就叫做柵格化。 這個柵格化操做,有一個特色和
上面的頂點處理是同樣的,就是每個圖元均可以並行獨立地柵格化。

4. 片斷處理(Fragment Processing)

在柵格化變成了像素點以後,咱們的圖仍是「黑白」的。咱們還須要計算每個像素的顏色、透明度等信息,給像素點上色。這步操做,就是片斷處理。 這步操做,
一樣也能夠每一個片斷並行、獨立進行,和上面的頂點處理和柵格化同樣。

5. 像素操做(Pixel Operations)

在柵格化變成了像素點以後,咱們的圖仍是「黑白」的。咱們還須要計算每個像素的顏色、透明度等信息,給像素點上色。這步操做,就是片斷處理。
 這步操做,一樣也能夠每一個片斷並行、獨立進行,和上面的頂點處理和柵格化同樣。

通過這完整的5個步驟以後,咱們就完成了從三維空間裏的數據的渲染,變成屏幕上你能夠看到的3D動畫了。這樣5個步驟的渲染流程呢,

通常也被稱之爲 圖形流水線(Graphic Pipeline)。這個名字和咱們講解CPU裏面的流水線很是類似,都叫 Pipeline。

 

 

4、解放圖形渲染的GPU

咱們能夠想想,若是用CPU來進行這個渲染過程,須要花上多少資源呢?咱們能夠經過一些數據來作個粗略的估算。

在上世紀90年代的時候,屏幕的分辨率尚未如今那麼高。通常的CRT顯示器也就是640×480的分辨率。這意味着屏幕上有30萬個像素須要渲染。
爲了讓咱們的眼睛看到畫面不暈眩,咱們但願畫面能有60幀。因而,每秒咱們就要從新渲染60次這個畫面。也就是說,每秒咱們須要完成1800萬次單個像素的渲染。
從柵格化開始,每一個像素有3個流水線步驟,即便每次步驟只有1個指令,那咱們也須要5400萬條指令,也就是54M條指令。

90年代的CPU的性能是多少呢?93年出貨的第一代Pentium處理器,主頻是60MHz,後續逐步推出了66MHz、75MHz、100MHz的處理器。以這個性能來看,
用CPU來渲染3D圖形,基本上就要把CPU的性能用完了。由於實際的每個渲染步驟可能不止一個指令,咱們的CPU可能根本就跑不動這樣的三維圖形渲染。

也就是在這個時候,Voodoo FX這樣的圖形加速卡登上了歷史舞臺。既然圖形渲染的流程是固定的,那咱們直接用硬件來處理這部分過程,不用CPU來計算是否是就行了?
很顯然,這樣的硬件會比製造有一樣計算性能的CPU要便宜得多。由於整個計算流程是徹底固定的,不須要流水線停頓、亂序執行等等的各種致使CPU計算變得複雜的問題。
咱們也不須要有什麼可編程能力,只要讓硬件按照寫好的邏輯進行運算就行了。

那個時候,整個頂點處理的過程仍是都由CPU進行的,不事後續全部到圖元和像素級別的處理都是經過Voodoo FX或者TNT這樣的顯卡去處理的。
也就是從這個時代開始,咱們能玩上「真3D」的遊戲了。

不過,不管是Voodoo FX仍是NVidia TNT。整個顯卡的架構還不一樣於咱們現代的顯卡,也沒有現代顯卡去進Voodoo FX或者TNT這樣的顯卡去處理的。行各類加速深度學習的能力。這個能力,要到NVidia提出Unified Shader Archicture纔開始具有。這也是咱們下一講要講的內容。

5、總結延伸

這一講裏,我帶你瞭解了一個基於多邊形建模的三維圖形的渲染過程。這個渲染過程須要通過頂點處理、圖元處理、柵格化、片斷處理以及像素操做這5個步驟。
這5個步驟把存儲在內存裏面的多邊形數據變成了渲染在屏幕上的畫面。由於裏面的不少步驟,都須要渲染整個畫面裏面的每個像素,因此其實計算量是很大
的。咱們的CPU這個時候,就有點跑不動了。

因而,像3dfx和NVidia這樣的廠商就推出了3D加速卡,用硬件來完成圖元處理開始的渲染流程。這些加速卡和現代的顯卡還不太同樣,它們是用固定的處理流程來完成整個3D圖形渲染的過程。不過,由於不用像CPU那樣考慮計算和處理能力的通用性。咱們就能夠用比起CPU芯片更低的成本,更好地完成3D圖形的渲染工做。而3D遊戲的時代也是從這個時候開始的。

相關文章
相關標籤/搜索