統一渲染器架構 (Unified Shader Architecture)

而另一項重要改變則是大家耳熟能詳的 Unified Shader Architecture (統一渲染器架構),顧名思義就是從 DirectX 10 開始,GPU 內的電路設計將不再有 Pixel Shader、Geometry Shader 與 Vertex Shader 之分,取而代之的則是「一堆完全一樣的 Shader 單元」,這同時也是 DirectX 10 世代當中顯示卡架構變化最大的部分。

sxa1031

至於為什麼要這樣做呢?可以從生產與應用兩個角度來看,首先是應用的部分,下圖是 GPU 在處理遊戲的過程當中,VS 與 PS 使用率的即時記錄。

scd9808

從上圖當中可以發現 VS 與 PS 的使用率變化波動是非常劇烈的,有些時候 VS 很忙但 PS 根本沒事可做,也有些時候反過來是 VS 在納涼,這樣不是很浪費嗎?我們花錢買了 GPU 電路也花了電費可不是要讓電腦有某些部分閒在那邊沒事的吧,但因為 VS 沒辦法做 PS 的工作、PS 也沒辦法做 VS 的工作,於是這樣的資源浪費便變得無法避免。

sma6856

要解決這個問題的話,最直覺的方式就是打破 VS 與 PS 的分別,讓 GPU 得以自行根據安排隨機調用 Shader 資源,讓每個 Shader 都有事做,這就是人們開始思考採用統一渲染器架構的原因之一。

axa1011

而採用統一著色器架構的另一個重要因素則是出現在生產方面,當著色器被統一之後,意味著 GPU 電路當中會有大量的「重複單元」(每個渲染器長得都一樣,而且數量很多),這對生產良率上的提升與開發過程中問題的發現與解決其實是大有幫助的,我們知道晶圓廠基本上升級製程之後第一個試產的就是記憶體晶片,其實原因就是記憶體晶片的電路重複度非常的高,而且相對而言非常單純因此容易發現與解決問題的關係。

同時這也讓 GPU 廠商可以更容易透過使用屏蔽統一著色器數量的方式來製作針對高階、中階與入門市場等不同等級的產品,並且可以更加動態的將受制於良率而產生輕微瑕疵無法作為高階型號出售的晶片運用於生產中低階的產品 (其實就是高度模組化的概念,後來 CPU 也幾乎都走這個方向)。

GPGPU (通用用途圖形處理單元)

GPU 在發展到 Shader Model 4.0 的統一著色器架構之後有著架構易於延伸的特性,加上大量相同的著色器運算單元非常適合處理平行度高的運算,加上 GPU 的性能在過去幾年始終維持著相當高的成長率,而 CPU 由於本身複雜度很高,在架構上反而沒有太大的長進 (下圖中的綠線是 GPU 的浮點運算能力成長曲線,藍線則是 CPU 的),因此人們開始思考是不是能夠讓 GPU 開始分攤一些圖形運算處理以外的工作 (比較激進的想法甚至認為 GPU 在未來有朝一日可能可以取代現有的 CPU,不過現階段看起來其實不太可能,但超級電腦市場的採購金額基本上已經翻轉為 GPU 大於 CPU 了,實際負責運算的主力也是 GPU 為主,CPU 則退居為控制與輔助的角色),在這樣的思維底下 General Purpose Graphics Processing Unit (GPGPU) 的概念就浮出水面了。

sca6855

最早提出 GPGPU 概念的是 ATI,當年 ATI 曾經運用 Radeon R500 架構來投入 Folding@Home 計畫協助運用 GPU 來模擬蛋白質的合成,透過大規模的分散式運算技術來讓全世界無數的一般電腦得以共同合作創造出類似超級電腦的運算能力以協助科學研究的進行,當時使用的 ATI Radeon X1900 GPU 可以提供將近當時同期 CPU 70 倍的運算性能 (因為這類科學研究的運算平行化程度很高,特別適合用 GPU 處理)。

scx6058

不過 ATI 當時使用的方式是運用原有的 DirectX API 來呼叫 GPU 處理相關的工作,並沒有真正自己發展一套用於 GPU 的通用計算介面,因此實際上還無法完整發揮性能,真正第一個將通用計算技術應用到自家 GPU 的則是 NVIDIA 提出的 CUDA (Compute Unified Device Architecture,統一計算架構) 運算標準。

NVIDIA CUDA

cuda

由於 NVIDIA 本身在宣傳產品的時候經常使用 CUDA 這個字眼,因此因該絕大多數人對 CUDA 這四個字並不陌生,但由於 NVIDIA 把運算技術取名叫 CUDA 的同時,也把 NVIDIA 自家的通用運算程式語言稱為 CUDA C Code,後來更把運算核心也改名叫 CUDA Core,又把 GPU 的架構稱為 CUDA Architecture,但在宣傳物與文件上卻常常忘記後面的後綴而經常造成嚴重的混淆,在開始之前我想先強調接下來我所談的是以「整組 CUDA」為主的觀點 (提及個別單位的時候我會加後綴)。

sxa8081

整體來說「CUDA 運算技術」這個概念實際上是由上層的開發者撰寫的 CUDA 程式、程式語言與 API (包含 CUDA C Code 與等一下會介紹的 OpenCL、DirectCompute)、基於 CUDA Architecture 設計的 NVIDIA GPU 三層結構所組成,由於最初的 CUDA 1.0 主要是使用 NVIDIA 自家發展的 C 語言延伸版本實作,因此才會有「CUDA C Code」這個名詞的出現。