上篇看完 2006 年個人計算機 3D 圖形方面的巨大革新之後,接下來我打算回到產品的部分,不同於過去幾代廠商在命名上沒有太多同代產品改名甚至交錯的情況,從 2006 年開始每代 GPU 架構幾乎都還蠻長壽而且橫跨多個不同系列,所以沒辦法再繼續用系列當成產品之間的分界了,基於這樣的理由,從這篇開始我會改用「GPU 架構為單位」,一次介紹一間廠商的一代架構,並且輪流介紹 NVIDIA 與 AMD 的產品。
NVIDIA Tesla Microarchitecture
本篇要介紹的是 NVIDIA 的第一款基於統一渲染器架構的 GPU 架構設計,也就是在 2006 年推出的 Tesla 架構,從此代架構之後 NVIDIA 都使用歷代知名科學家的名字來做為架構的研發代號,這同時也是 NVIDIA 史上最為長壽的架構,從 2006 年開始一路到 2011 年都還能見到基於此架構的產品,Tesla 架構同時也是未來十年內 NVIDIA 所有 GPU 架構的基礎原型。
Tesla 架構由於生存年代很長,因此先後更換過許多次製程,也經歷的數次小幅的改版,因此大致上可以分為前期與後期,其中前期的部分由 G8x 與 G9x 兩個核心系列組成,後者則是由 GT200 系列核心所組成,接下來我打算以此為區分,將 Tesla 世代架構分成二代分別介紹。
第 1 代 Tesla 架構:G8x 系列核心
- 推出日期:2006 年 11 月 (G8x)
- 所屬系列編成:GeForce 8 系列
- API 支援:DirectX 10.0、OpenGL 3.3
- Shader Model 支援:SM 4.0
還記得上一篇我們談了 DirectX 10.0 帶來的大量改變,這理所當然的意味著 GPU 廠商得對他們的架構進行一番大改造才能完整支援新一代的 DirectX,對 NVIDIA 來說,他們給出的答案就是 GeForce 8 系列 (2006 年 11 月就端出來了,AMD 陣營則是被上一代的 R500 拖累並且忙於合併事宜因此要等 2007 年才會端出這世代的產品)。
大幅翻新的架構規劃
由於前代產品 G70 已經是好一陣子之前介紹的了,所以在開始深入談這代架構之前,讓我們稍微先複習一下 G70 的架構規劃吧 (上圖),像是多達 8 組頂點渲染器、多達 6 x 4 組畫素渲染器與底下的 16 組 ROUs 之類的,是典型的可程式化管線設計。
接下來讓我們回頭看看第一世代 Tesla 所帶來的全新架構設計吧,相信明眼人都能看得出來兩者之間差異非常的大,受到統一渲染架構的影響,Tesla 架構跟上一代幾乎沒有太多相似之處,除了中央繪圖管線的架構全部重新洗牌且看不出不同種類 Shader 的分別之外,連同快取記憶體的規劃也產生了巨大的變化,TMU 與 ROP 的部分也和以前大不相同了。
單從上面的架構圖,一般人應該除了發現中間多了一大堆的綠色方塊之外甚麼也看不出來吧?實際上這些五顏六色、各種大小的方塊就是 Tesla 架構最大的變革所在,NVIDIA 稱它們為 Texture Processor Cluster (材質處理單元叢集,TPC),這 8 大組 TPC 在這裡完整取代了以往的繪圖渲染管線成為 NVIDIA GPU 最重要的核心部分 (所以從 G80 開始我們就不討論 NVIDIA GPU 有幾條繪圖管線了),接下來讓我們拉近距離了解一組 TPC 當中到底有著哪些東西。
從上圖當中我們可以很明顯地注意到每組 TPC 當中都包含了兩大組稱之為 Streaming Multiprocessor (串流複合處理器,SM) 的運算單元與一大塊用於存放貼圖材質的 L1 快取 (在 Tesla 架構中每個 TPC 之間的 L1 快取是各自獨立的) 與貼圖單元,而每組 SM 單元之中都各自擁有一份 L1 指令快取與 L1 資料快取,在兩種快取之間有負責存取與譯碼指令的單元。
至於實際負責運算工作的則是每組 SM 當中所包含的八個串流處理器 (Streaming Processor,SP,在 G80 當中最多有 128 組之多) 與兩組用於處理複雜數學函式 (例如指對數、三角函式等) 的特殊功能單元 (Special Function Unit,SFU),這十個運算單元彼此之間還設計了一小塊共享記憶體用於讓這些運算單元得以互相溝通、傳遞資料。
透過大量的通用浮點運算單元來取代以往具專用色彩的 Vertex Shader、Pixel Shader 與 Geometry Shader 實際上就是 NVIDIA 用來實作 Unified Shader Architecture 的基本精神。
SP 數量大增背後的涵義
在瞭解新的運算單元配置之後,或許你腦中會浮現這個疑問:我們以前說影響 GPU 效能最直接的指標就是繪圖管線 (或是 VS、PS) 的多寡,得益於 3D 圖形運算的高度平行性,我們幾乎可以認為在架構不變的狀況下繪圖管線 (或是 VS、PS) 的數量會與處理器的效能成正比成長,但上一代的 G70 只有 24 條畫素管線,G80 的 128 個核心這數字是怎麼來的?難道 G80 一口氣比 G70 快了 5.33 倍嗎?顯然不可能嘛,其實問題的癥結點是在於 VS、PS、SP、繪圖管線這四個名詞所代表的東西,其實根本是完全不同的事情。
但要解答這個疑問之前,我們得先了解在過去幾代 GPU 當中,繪圖管線中的運算單元是怎麼運算傳進來的資訊的。實際上以往我們的 GPU 大致都是設計成能夠同步處理一個三維向量與一個純量,也就是一次最多能處理四個維度的意思,這被我們稱為「一組 ALU」,也就是過去我們所談的 Pixel Shader (PS) (上圖)。
不過在 G80 的架構中 NVIDIA 決定不這麼做,改成全部只使用「純量運算單元」,讓每個 SP 簡化成只由「一組純量乘加運算單元」與「一組純量乘法運算單元」組成,由於每個 SP 只能處理一個維度的資料,在理論值上只有過去的 1/4 (粗略而言你可以想象成 4 組 SP 才相當於一個 PS),因此才會發生 SP 數量突然暴增的情況 (其實 NVIDIA 應該也有意藉此讓使用者產生 G80 比起以往產品效能強大數倍的錯覺吧?)。
至於為什麼要這麼做呢?其實有很多理由,首先在以往的架構當中,由於繪圖管線本身是一個具有 4 個維度的運算單元,在單一週期內雖然可以同時處理一個三維度的向量與一個純量,但在實務上卻不是隨時都有這些資料能夠充分「餵飽」這些運算單元,在這種情況下就類似以往的非統一渲染器架構,會發生有些部分在納涼的資源閒置浪費情形。
而在新的架構當中,雖然每次都只能處理一個維度,在遇到向量指令的時候得「分次處理」,但由於 G80 架構當中本身有一堆 SP 可以做事,因此在效率上造成了不減反增的效果,而且還能解決過去在處理純量或低維度指令時的閒置問題,每分每秒都能完整利用所有的 SP,壓榨出 GPU 的效能極限。
而另一個重要的理由則是大幅簡化「單一 SP」的電路複雜度,這讓 NVIDIA 得以在 G80 架構當中運用分頻技術來讓 SP 運作於比 GPU 本身還要高上許多的頻率設定 (這點有點像 Pentium 4 的快速執行引擎,後面介紹 Tesla 架構產品的時候頻率數字有三個,第二個就是 SP 的頻率),更降低了 NVIDIA 在 GPU 當中塞入更多 SP 的困難度 (相較於以往增加 VS、PS 的難度而言)。
Lumenex Engine,TMU 一分為二並採不對稱設計
除了在運算單元的部分有著大幅度的調整之外,在 G80 架構當中 NVIDIA 還將原本的 TMU (Texture Mapping Unit,材質對應單元) 一分為二,分為 Texture Addressing Unit (TAU,材質定址單元) 與 Texture Filtering Unit (TFU,雙線性材質過濾單元) 兩個部分。
而最特別的地方則是 TAU 與 TFU 的數量並不相等,G80 當中的 TFU 數量是 TAU 的兩倍,主要是基於當時預期 GPU 對記憶體索取紋理的機會變少,而處理 HDR 等操作時所需要的雙線性過濾操作頻率增加的考慮。
至於要說到 Lumenex Engine 與前作在處理材質貼圖上的差異,其實主要只是體現 DirectX 10.0 當中關於 HDR 與反鋸齒的變更與新要求而已,從 Tesla 架構開始 NVIDIA 的 GPU 就不再有以往受制於 HDR 會佔用 MSAA/FSAA 所需要的緩衝儲存器位置而無法同時處理 OpenEXR HDR 與多重取樣反鋸齒 (MSAA/FSAA) 的情況了。
Tesla 架構對平行化的要求與敏感度大增
看了前面的架構設計你應該可以很清楚的感受到 NVIDIA 在設計 Tesla 架構的時候完全是朝著為高度平行運算最佳化的方向進行的,花費了非常多的努力在降低可能導致 GPU 部分運算單元閒置情形的發生機率,這意味著對新的 Tesla 架構來說指令與運算操作的平行度與相依性就是影響效能的最大關鍵因素,因此在 Tesla 架構當中,下圖當中橘色的 Thread Execution Manager (後來被改稱為 GigaThread Technology) 扮演了非常重要的角色。
在 Tesla 架構當中的很多地方都體現了充分運用多執行緒的特性,舉例來說我們剛剛提過的 SM 就是這樣的狀況,在 Multithreading 運作成功且高效的狀況下,可以弭平將運算單元全部拆分為純量單元所造成的額外延遲,但相對來說也讓 Tesla 架構對所執行的程式之平行化程度更加敏感。
所以在設計上 NVIDIA 是朝單一指令多執行緒 (SIMT) 的方向思考,透過讓每個 SM 都能高效執行大量的執行緒來弭平內部的各種延遲問題,這正是剛剛提到過的 TEM 所負責的重要工作,TEM 會將所有指令與資料拆分為數千個平行執行緒,使 GPU 能在其最適應的狀況下 (也就是高平行度運算) 來高速執行工作。
除此之外 TEM 還會隨時監測是否有閒置的運算單元出現,當發現這種情況時 TEM 就會立刻發出新的指令給閒置的運算單元處理,以求最大程度的降低硬體閒置發生的機率。
除此之外 NVIDIA 還給每個運算單元提供了快取器,當 TEM 發現有運算單元因為在等待記憶體存取或其他相依指令的時候,會要求運算單元將目前準備執行但卡住的工作存到快取器中,並直接指派新的工作給運算單元處理,直到剛剛卡住的指令所需要的資料或條件齊全之後,才會繼續把快取器內儲存的工作拿出來繼續完成,這使得 SP 幾乎不需要等待其他指令或是延遲解決,在運作過程當中可以持續以最高效率 (高平行度) 的狀況運轉,改進了過去繪圖管線可能經常會因延遲而整個停頓的狀況。
G80 核心
簡單看過第一代 Tesla 架構之後 (Tesla 的另一個重點-CUDA 通用運算技術在上一篇我們談過很多了所以在此不再贅述),讓我們回到實際的產品上,基於第一代 Tesla 架構的第一款產品是 G80 核心 (也就是剛剛在圖片中出現很多次的樣板,因為 G80 是最完整的第一代 Tesla 架構核心)。
跟上一代 G70 的情況一樣,NVIDIA 記取過去過於積極提升製程結果被良率整到產品出不來的教訓,因此 G80 並沒有急於採用更高階的製程,而是維持與上一代 G71 相同的 90 奈米制造工藝,不過由於全新的架構與大量的 Streaming Processor,G80 的電晶體數量非常驚人,來到了誇張的 6.81 億個,將近是上代產品 G71 2.78 億的 2.5 倍了,因此 G80 一舉突破了歷代 NVIDIA GPU 面積的最高紀錄 (也超越所有當代的頂級 CPU 了,同期的 Core 2 Duo 只有 2.3 億左右個電晶體)。
如果你夠眼尖的話應該會發現上圖當中 GPU 左邊還有一顆比較小的晶片,實際上它是 G80 的 RAMDAC 與 TMDS,由於 G80 的面積實在太大了,對於 NVIDIA 來說控制 G80 的功率與良率都是非常大的挑戰,因此 NVIDIA 只好想盡辦法把一些可以不放在核心內部的東西拉到外面去做,最後的結果就是這顆 NVIO-1 晶片。
G80 最在 2006 年 11 月被命名為 GeForce 8800 系列推出,最初有 8800 GTX 與 8800 GTS 兩個型號 (這是 NVIDIA 第一次使用 GTS 命名自家的 GPU),並在來年追加了運作頻率提高的 8800 Ultra 做為旗艦產品,這一世代的顯示介面卡除了 GPU 面積突破紀錄之外,顯示介面卡本身的 PCB 長度也創下了歷史紀錄。
還記得當年我們曾經說 GeForce FX 佔用雙槽的散熱器很糟、Flow FX 多麼的不堪、GeForce FX 的耗電量與發熱量超大嗎?NVIDIA 確實也因為這樣所以在 GeForce 6 系列與 GeForce 7 系列前期的產品上都只使用了單槽散熱器,而且極力控制功耗來避免 GeForce FX 的黑歷史重演,不過到了 GeForce 8 系列 (還有 7 系列後期的 7900 系列),為了追求效能而導致的龐大發熱量與芯片面積還是讓 NVIDIA 不得不再次拿出雙槽散熱器設計了。
除此之外 G80 的耗電量也不容小覷,如果站長沒記錯的話 8800 GTX (575/1350/1800 MHz) 應該是 NVIDIA 第一款需要兩組 6-pin 外接電源才足以驅動的顯示介面卡,甚至比上代由兩顆 GPU 組成的 7950 GX2 還要耗電 (8800 Ultra 的 TDP 高達 145 W,而 7950 GX2 反而只有 110 W),基本上 G80 顯示介面卡會這麼長,最大的功臣就是右邊那一大片的高階供電模組。
至於頻率更高的 8800 Ultra (612/1500/2160 MHz) 在耗電方面則是更加誇張,TDP 高達 175 W,甚至需要 6-pin + 8-pin 的外接電源接頭組合才足以推動 (其實會吃到 8-pin 插座的顯示介面卡並不多見),而且 NVIDIA 還特別設計了個長得很奇葩的散熱器給 8800 Ultra 用 (上圖)。
最後要提的是 GeForce 8800 GTS 雖然也是使用 G80 核心,但有兩組 TPC 是被遮蔽的,頻率也被降低到 513/1188/1600 MHz,記憶體控制器也被砍了一組,因此記憶體頻寬是 320-bit 而非 384-bit。
G84/G86 核心
接下來登場的則是面向中階市場的 G84 與面向入門市場的 G86 核心,NVIDIA 在 G80 上市之後花了將近半年的時間才把新的 Tesla 架構推向中、低階市場,相較於 G80 如此壯觀的電晶體數量與面積來說,G84、G86 就顯得正常許多了,除此之外 G84、G86 也是 NVIDIA 首次在自家產品中匯入 80 奈米制程 (與 G70 時代的模式如出一轍)。
由於 G84 與 G86 核心基本上是由 G80 簡化而來,同樣都是基於第一代 Tesla 架構,因此在架構設計方面其實很相似,最主要的不同出現在 TPC 與記憶體控制器 (MC) 的數量上 (連帶影響了 SM、SP、SFU、Cache 的數量配置),這正好印證了我在前面曾經提過的,從 Tesla 架構開始的模組化觀點。
老實說 NVIDIA 在第一代 Tesla 世代內砍中階產品這一刀的時候下手真的很狠,上面這張圖可不是入門級的 G86,他其實是中階級的 G84!在 G84 這一級當中 NVIDIA 一口氣把原本的八組 TPC 砍到剩下兩組,所以 SP 的數量也連帶只剩下 32 個了,記憶體控制器的部分也砍掉了 2/3,所以記憶體頻寬從原本的 384-bit 一口氣跌到只剩下 128-bit。
至於 G86 的部分呢,其實已經沒剩下甚麼東西可以砍了,所以 G86 的規劃很簡單,就是把 G84 的 TPC 再閹掉一半,只剩下單獨一組 TPC (也就是 16 個 SP),從上面這些資訊你應該也能很容易得知 G84 與 G86 沒有面積過大的問題,甚至也不太有散熱問題,因此 G84 與 G86 是沒有把 RAMDAC 與 TMDS 拉出來外面的,在成卡上也就看不到 NVIO 這顆晶片。
不過可能是基於砍了太多良心發現吧?NVIDIA 在 G84 與 G86 當中針對 TMU 的規劃跟 G80 不一樣,G84 與 G86 當中的 TAU 與 TFU 數量是一致的,並沒有像 G80 一樣設定成 1:2。