天天看點

How GPUs Work

http://blog.csdn.net/key_ring/article/details/7958120

   在90年代之前,那種無所不在的互動式3D圖形隻能充斥于科幻小說中。而在90年代末,幾乎每一台新計算機都包含了一個圖形處理單元(GPU)——專用于提供高性能的、富有視覺性的、互動式的3D體驗。

    這種戲劇性的轉變其實是消費者對視訊遊戲的要求、制造技術的進步和前向圖形流水線固有的并行開發所導緻的必然結果。如今,一個GPU的計算能力遠勝于大部分強勁的CPU,而且差距在逐漸拉開。

    此外,GPU已由傳統的固定圖形流水線慢慢轉向靈活的通用計算引擎。現在,GPU可以直接使用圖形硬體來實作很多并行算法。所有受基礎計算效率影響的算法便能是以得到巨大的加速。事實上,GPU是首個廣泛部署于桌面并行計算機上的東西。

圖形流水線     

    任何3D圖形系統的任務都是将一個場景描述(比如像遊戲這種每秒60幀的實時圖形)合成一幅圖像。這個場景包含了用于觀察的幾何基元、用于照明場景的光照——表明每一個對象的反射光,和觀察點的位置與方向。

    GPU設計者習慣上将這種合成圖像處理方式表示成一種具有專門階段的硬體流水線。這裡,我們對經典(傳統)圖形流水線進行一個高度概括。我們的重點是突出實時渲染計算方面。在這個領域,圖形應用程式開發人員可以利用現代GPU作為通用并行計算引擎。

流水線輸入     

    大部分實時圖形系統假設所有事物均由三角形構成,他們會将任何更複雜的圖形比如四邊形或者曲面,先分解成三角形。開發人員使用一個計算機圖形庫(如OpenGL、Direct3D)以一次一頂點的方式為圖形流水線提供每一個三角形;GPU會将三角形所需的頂點集合裝配。

模型變換          一個GPU可以為場景中每一個邏輯對象指定它的局部坐标系系統,這很友善為對象進行自然地、分層次地定義。這種友善的價值在于:渲染之前,GPU必須首先将所有對象變換至一個共同坐标系統。為了保證三角形不會被彎曲或扭曲成曲面形狀,這個變換被限制為簡單的仿射操作,如旋轉、平移、縮放等等。

    就像附錄中“齊次坐标系”的解釋,通過将每一個頂點表示在齊次坐标系中,圖形系統可以隻用執行一個矩陣向量乘法便可以表示全部變換模式。每秒百萬級頂點所需的浮點矢量計算對硬體效率的需求正在驅動GPU并行計算革命。

    流水線階段的輸出是一條三角形流,這些都表示在一個共同的3D坐标系統中,這個坐标系統的觀察點位于原點,觀察方向與Z軸對齊。

光照         一旦一個三角形處于全局坐标系統,GPU就可以基于場景光照來計算它的顔色。例如,我們來描述一個基于單點光源(想象一個非常小的燈泡)的計算。GPU合并所有有效單個光線來處理多重光線。傳統圖形流水線支援Phong光照模型,一種表面看起來近似塑膠的模型。生成的材質結合了無光的基礎漫反射和有光澤的高光鏡面反射。Phong光照方程計算結果為輸出的顔色,C = Kd × Li × (N.L)+ Ks × Li × (R.V)^S。     Table 1定義了方程中每一個術語。這裡的數學計算并沒有計算的結構重要。為了評估這個方程的效率,GPU必須直接在向量上進行重複操作。是以,我們要不斷地計算兩個向量的點積,進行四元乘和加的操作。

How GPUs Work

錄影機模拟

    圖形流水線接下來要在虛拟錄影機膠片平面表達每一個有色的3D三角形。就像模型變換一樣,GPU也使用矩陣向量相乘,再次受益于硬體上的矢量操作的高效率。該階段的輸出是螢幕坐标系上的三角形流,時刻準備轉變成像素。

光栅化

    每一個螢幕空間可見的三角形在顯示時會有像素重疊;決定這些像素的就是光栅化。這些年來,GPU設計者已經将很多光栅化算法合并,進而得到一個很重要的觀點:每一個像素可以有别于其他像素而獨立對待。是以,機器可以并行處理所有像素——的确,一些獨特的機器早已為每一個像素提供一個處理器。這種内在的獨立性引導GPU設計者去建造越來越多的并行集合流水線。

紋理

    每一個像素的實際顔色可以直接來自光照計算,但為了更逼真,圖像,也叫紋理經常覆寫在幾何體上來展現錯覺般的細節。GPU将這些紋理存儲在高速記憶體中,每一次像素計算均會通路該記憶體來修改并決定最終像素的顔色。     在實際中,GPU可能需要多種大小的的紋理圖,這樣比原生分辨率小了或者大了的紋理出現在螢幕上可以更逼真。紋理記憶體中圖案的通路是很有規律的(相近像素趨于通路相近的紋理圖位置),有專門的高速緩存幫助隐藏記憶體通路的潛伏期。

隐藏面

    在大多數場景中,一些對象會遮擋其他對象。如果每個像素被簡單地寫入顯示記憶體中,則最後送出的三角形會出現在最前面。是以,在每個視圖正确消除隐藏面需要将所有三角形從後到前的排序,這個操作昂貴到完全不可能用于所有場景。

    所有現代GPU均提供一個深度緩存,用于存儲每個像素到觀察點距離的一個記憶體區域。在寫入螢幕之前,GPU先比較已有像素距離和新的像素距離的大小,然後隻會在新的像素距離更近時更新螢幕記憶體。

圖形流水線的進化

    GPU已由固定圖形流水線進化到支援底層可程式設計計算。用于變換頂點和填充像素的固定功能單元已經歸為一個統一的網格單元,或者叫着色器單元(Shaders)。Shader可以完成這些任務甚至更多。這種用越來越多的可程式設計單元來逐漸取代單個流水線階段的進化已經演變了好幾代了。例如,釋出于2001年二月的NVIDIA GeForce 3,引入了可程式設計頂點着色器。這些着色器提供可程式設計單元用于執行矩陣向量相乘,求幂和求平方根等計算。而且一段簡短的預設程式也可使用這些單元來執行頂點變換和光照計算。     GeForce 3還引入了像素處理的可重構性限制,揭示了硬體功能可作為一系列組合寄存器,用來實作新奇的視覺效果,如肥皂膜的彩色折射效果(Figure 1)。随後的GPU引入了更強的靈活性,添加對更長程式的支援,更多的寄存器和流控操作如分支、循環和子程式。

    ATI Radeon 9700(2002.7)和NVIDIA GeForce FX(2003.1)又将經常不适用的組合寄存器替換為純粹的可程式設計像素着色器。NVIDIA其後的晶片,GeForce 8800(2006.11),又為基元輸入階段添加了可程式設計能力,允許開發人員自由控制如何用已變換的頂點構造三角形。如Figure 2,現代GPU實作了極好的拟真視覺表現。

    随着可程式設計性的增加,數值精度也随之提高。傳統圖形流水線隻為每個顔色通道提供8位整數精度,所允許的值為0—255。ATI Radeon 9700将可用顔色範圍提高到了24位浮點精度,随後的NVIDIA GeForce FX可同時支援16位和32位浮點精度。兩家供應商都已宣布計劃在接下來的晶片中支援64位雙精度浮點。

    為了趕上圖形性能不斷的要求,GPU已經強勢進入并行化設計領域。GPU一直使用四維向量寄存器就像Intel的CPU一直使用SSE指令。而在并行化時代,執行的四維處理器數目更是有了顯著增長。從GeForce FX的4個到 GeForce 6800(2004.4)的16個,再到GeForce 7800(2005.5)的24個。而GeForce 8800擁有128個标量着色處理器,它們也可以運作在專用着色時鐘上,是以前晶片時鐘頻率的2.5倍。是以,其計算性能相當于128×2.5/4=80個四維像素着色器。

How GPUs Work
How GPUs Work

統一着色器

    從固定流水線到靈活計算模型的最新進化腳步是統一着色器的引入。統一着色器最先在ATI為Xbox 360遊戲機提供的Xenos晶片上實作,随後NVIDIA 的GeForce 8800晶片将其帶到了PC機上。

    不同于為頂點着色器,幾何着色器,像素着色器分别定制處理器,一個統一着色器架構提供一個很大的通用并行資料浮點處理器網格,足夠承載運作所有這些着色器的工作量。如Figure 3所示,頂點,三角形和像素循環通過網格,而不是依次流過固定寬度的各個流水線階段。

   由于不同的應用程式對各種着色器的要求有很大變動,甚至一個程式僅一種架構,是以這種配置(統一着色器架構)能得到更好的整體使用率。例如,一個視訊遊戲可能使用大量三角形形成一幅圖像來繪制天空和遙遠的地勢。這在傳統流水線中,像素着色器會迅速飽和,而大量頂點着色器處于空閑。一毫秒之後,遊戲可能使用高度精細的幾何體來繪制複雜的人物和物體。這種行為會立刻讓頂點着色器陷入負荷,而大部分像素着色器處于空閑。

    對遊戲設計人員而言,要将每幅圖像上戲劇性振動的資源要求達到負載平衡是非常可怕的事,而且随着玩家視點和動作的改變還會出現不可預知的需求變化。另一方面,統一着色器架構卻能從它的處理器池中給每種着色器類型按變化的百分比進行配置設定處理器。     在這個例子中,繪制天空時,一個GeForce 8800可能會将它128個處理器的90%作為像素着色器,10%作為頂點着色器,而在繪制人物的幾何體時,則将比例反過來。直接結果就是靈活的并行架構可以提高GPU的使用率而且為遊戲設計者提供更好的靈活性。

How GPUs Work

GPGPU(基于圖形硬體的通用計算)

    實時計算機圖形學的高度并行化工作量極度要求很高的算法吞吐量和流存儲帶寬,但可以容忍單個計算的延遲,因為最終的圖像僅僅顯示16毫秒。這些工作特點發展成GPU架構的基礎:由于CPU為低延遲而優化,GPU則為高吞吐量而優化。

    GPU的原始計算功率是巨大的:單個GeForce 8800晶片在簡單的基準數值測試上能達到持續性每秒3300億次浮點操作。功率不斷增加的,可程式設計的,高精度的GPU正積極參與大型通用計算領域的處理研究。GPGPU研究人員和開發者使用GPU作為一個計算協處理器而不是一個綜合圖像的裝置。

    GPU的特有架構不适合每一個算法。很多應用程式基于串行而且以不連貫的随機的記憶體通路為特點。盡管如此,很多重要的問題依然需要大量的計算資源,剛好映射到GPU的衆核計算強度;或者它們需要通過大量的資料流,這剛好映射到GPU的流存儲系統。

    向GPU移植一個選擇算法比起為CPU專門優化的代碼常常會有5到20倍的加速。有報道稱,一些映射特别好的算法甚至有超過100倍的加速。

    著名的GPGPU成功故事包括斯坦福大學的Folding項目,這個項目使用全世界使用者捐贈的多餘器官研究蛋白質折疊加工。項目中一台新的GPU加速客戶機在2006年10月釋出後的一個月裡進行了28000Gfops的計算量。這比自2000年10月以來運作在Windows上的CPU客戶機的總運算量還要高出18%。

    另一個GPGPU的成功例子是,北卡羅琳娜大學與微軟使用基于GPU的代碼赢得了2006年TeraSort比賽IndyPennySort項目的冠軍,該項目是用資料庫操作标準排序來測試性能。在GPU商業領域,HavokFX使用GPGPU技術讓實體計算提高了十倍,用于為計算機遊戲中的物體添加更真實的行為動作。

    現代GPU可被看作第一代資料并行處理器産品。它們巨大的計算能力和快速增長曲線遠遠超過傳統CPU,在資料并行計算專業領域有着顯著的優勢。

    我們期待未來GPU架構可以無限制增強可程式設計性與一般性,畢竟供應商和使用者都不願意犧牲讓GPU一炮而紅的專用架構。如今,GPU開發人員在大規模多線程并行計算上需要新的高層次程式設計模型,這個問題接下來也會影響多核CPU供應商。

    在未來,GPU供應商,圖形開發者和GPGPU研究人員能否基于他們在商用并行計算的成功來超越計算機圖形學起源,并為桌面并行計算環境開發出計算風格、技術和架構。

附錄

How GPUs Work

PS:有些術語我也懵了。。。

繼續閱讀