電腦達人養成計畫 5-25:策略轉向再創高峰-NVIDIA Kepler 架構

www.hdnicewallpapers.com

在介紹完 NVIDIA 越走越極端的 Fermi 架構之後,接下來我打算繼續介紹在 Fermi 上市兩年後負責接檔的 Kepler 架構 (由於 AMD 陣營的部分從 Terascale 3 之後以降全部的架構都是 Graphics Core Next 架構小改而來因此我正在考慮是否要先講完 NVIDIA 的部分之後再一次談完 GCN)。

NVIDIA Kepler Microarchitecture

在上回我們討論 Fermi 架構的時候提到 NVIDIA 終於開始受到追求大核心發展戰略的困難影響而面臨產品不斷延期、良率表現不佳、成本居高不下、成品高溫高功耗低效率的問題而倍感壓力,因此在接下來的 Kepler 架構當中 NVIDIA 顯然得對自家產品的發展規劃進行一些調整,因此類似的歷史就這麼再次發生了,NVIDIA 從 Kepler 架構開始,比起晶片組成規模的提升更加在意性能與功耗之間的平衡 (就像 2006 年的 Intel 與 AMD 發展 Terascale 使用的小核心戰略一般),Kepler 架構主要的改進項目大多也圍繞在這點上。

PCI Express 3.0 支援

Kepler 架構是 NVIDIA 第一款支援 PCI Express 3.0 介面的 GPU 家族 (但不是所有成員都能夠支援 PCI Express 3.0)。

製程大躍進

相較於 Fermi 架構所使用的 40 奈米製造工藝來說,Kepler 採用的 28 奈米製造工藝算是一個比較大的進展,以總電晶體數量差不多的 GK104 核心與上代的 GF110 核心為例,GK104 核心在內建略多於 GF110 核心一些之電晶體數量的情況下,面積卻只有 GF110 核心的一半多一些,這對於良率與生產成本的改善有著相當關鍵的影響 (不過從型號中也可以很容易看得出來其實 GK104 之上應該本來還有更大的核心要發佈,至少有 GK100 跟 GK102 兩款,不過這兩款晶片後來都被取消了,直到事隔兩年後的 GK110 核心才有更大規模的版本推出)。

GPC 重組,SM 模組合二為一進化為密度更高的 SMX

如同 Tesla 架構到 Fermi 架構之間的發展一般,Kepler 架構與 Fermi 架構之間最直觀的差異同樣是出現在 GPC 內部的運算元件編排上,在開始談 Kepler 架構的新規劃之前,我們得先從 Fermi 架構的設計開始看起,下圖就是 Fermi 架構中的標準型架構 (GK110、GK100,圖左) 與緊湊型架構 (GK104、GK114,圖右)。

而實際上 Kepler 架構的演化方向與 GK100/GK110 標準型架構往 GK104/GK114 緊湊型架構發展的方向很類似,同樣是採進一步增加單組 SM 模組 (從 Kepler 開始改稱為 SMX) 內 CUDA Core、特殊功能單元的數量為主,而且增加的幅度非常明顯 (CUDA Core 的數量從 48 個增加到 192 個、特殊功能單元的數量也從 8 個增加到 32 個)。

而且從上面的架構中可以發現一件事情:在 Kepler 架構中每組 CUDA Core 所能分配到的控制單元 (例如 Load/Store 單元、快取記憶體、Wrap 排程器、執行緒分派單元) 的比例是有明顯下降的,其實看起來很像把 Fermi 中階版配置中的兩組 SM 模組合併為一組 SMX 之後在將其內的 CUDA Core 數量加倍的結果,然而其實這就是 Kepler 架構的發展主軸-透過大幅增加 CUDA Core 數量而不增加控制單元使得 Kepler 架構可以在不大量增加電晶體數與電路複雜度的情況下有效提升性能 (還記得我在介紹 Tesla 架構的時候談過 NVIDIA 把 CUDA Core 設計成個體電路相當簡單的純量運算單元,因此在提升 CUDA Core 的時候相對而言比較容易而且不會額外耗用太多電晶體嗎?)。

如果你還沒反應過來 Kepler 架構到底為什麼要做這樣的改變的話,或許下面這張表格能夠讓你更清楚的明白新舊架構之間的差異:

架構 Fermi Kepler
核心 GF110 GK104
製造工藝 40 奈米 28 奈米
GPC 數量 4 4
SM/SMX 數量 4 x 4 = 16 2 x 4 = 8
CUDA Core 數量 16 x 32 = 512 8 x 192 = 1,536
Warp 排程器數量 2 x 16 = 32 4 x 8 = 32
指令分派單元數量 4 x 16 = 64 8 x 8 = 64
材質單元數量 4 x 16 = 64 16 x 8 = 128
SM 記憶體 64 KB x 16 = 1 MB 64 KB x 8 = 0.5 MB

乍看之下 GK104 的 CUDA Core 數量足足是 GF110 的三倍之多,但在實際電路上的電晶體數差異呢?其實只從 30 億「小幅增加」到 35 億而已 (看起來 5 億個電晶體好像很多,但從比例觀點其實只多了 16.7% 就讓 CUDA Core 的數量成長了三倍)。

除此之外 Fermi 架構當中首次引入的 PolyMorph 引擎也得到了更新,據官方說法新的 PolyMorph Engine 2.0 的效率比起前代來說提升了不少,官方說法表示最多可以省下高達 50% 的能耗。

犧牲面積換取節能

至於為什麼要一口氣把 CUDA Core 的數量增加到三倍呢?其實也是基於同樣的設計理念發展出來的結果,我們知道打從 Tesla 架構開始 CUDA Core (或者你想叫他 Shader 也行) 的運作時脈就比 GPU 本身還要高出許多 (至少兩倍,甚至將近三倍),這樣的設計當然有提升渲染性能的效果,但是代價也很明顯 (其實就很像 Netburst 架構中的倍速執行引擎 Rapid Execution Engine)。

拉高 CUDA Core 時脈最明顯的缺點當然就是很大程度限制了 GPU 本身運作時脈的成長,除此之外對於功耗與發熱量而言也絕對不是好事,也會提高增加 CUDA Core 數量的困難度並且造成發熱量不均的問題,因此在 Kepler 架構當中 NVIDIA 選擇捨棄過去將 CUDA Core 時脈拉高的作法,從 Kepler 開始 CUDA Core 將與 GPU 同頻運作。

不過 NVIDIA 當然不可能那麼天才直接把 CUDA Core 的時脈減半而不做其他處理 (否則 Kepler 的性能豈不是只剩下 Fermi 的一半嗎?),考慮到 Kepler 產品在製程方面有大幅的提升,所以 NVIDIA 的如意算盤便是用數量來彌補時脈下降之後的性能衰減。

然而得益於製程的提升,Kepler 在 CUDA Core 方面數量的提升量得以高達三倍,這樣高幅度的數量增長所能達成的效益其實是超過時脈減半帶來的損失的,而且 Kepler 架構 GPU 的時脈又能拉得比 Fermi 還要高一些,所以一來一往之後造就了 Kepler 在性能上還是能夠遠遠勝出 Fermi 架構產品的基礎。

不過為了把 CUDA Core 的數量提升這麼多,其實 NVIDIA 還是做了妥協,那就是將原本相當複雜的硬體排程器電路改為大幅簡化之後的軟體排程器,從 Fermi 當中的動態排程改回傳統的靜態排程 (Static Scheduling)。

GPU Boost

接下來要談的是 Kepler 架構相較於 Fermi 與 Tesla 而言在運作機制上比較明顯的差異,也就是 GPU Boost 技術的支援。

在電腦的世界裡看到 Boost 這個字眼你會先想到甚麼?絕大多數人的回答大概都會是 Intel 的 Turbo Boost 吧,確實這兩個技術在結果上其實很類似,說穿了都是一種「動態超頻」的技術,但其實在運作方式上其實是有一些不同的。

讓我們從大家比較熟悉的 Turbo Boost 開始談起吧,基本上 CPU 的 Turbo Boost 是根據當下的負載來對 CPU 的各個核心進行動態的時脈調整,而根據工作負載是否落在特定幾個核心上而主要可分為兩種不同的情況,假設工作負載平均分配在每個核心上,那 Turbo Boost 的動作其實很單純,就只是把整個 CPU 的倍頻拉高到 Intel 預先定義的 Boost Multiplier 而已。

但如果負載分布不均呢?這種情況下就比較複雜一些了,我們舉最極端的例子來看,若負載只集中在單獨一個核心,那 Turbo Boost 就會將其他沒事幹的核心降頻甚至完全關閉,把供電與發熱上限集中給正忙於工作的那個核心,並把該核心的倍頻拉高到比 Boost Multiplier 還要來得更高的 Max Boost Multiplier。

然而 Turbo Boost 還是有前提的,自動超頻的作動都不能超越 Intel 給 CPU 預先設定的「熱設計功耗」(Thermal Design Power),也就是如果本身處理器的功耗已經超過 TDP 設定的數值的情況下,Turbo Boost 是無法進一步提升倍頻的 (之所以要考慮這件事情,而無法單純用最高時脈訂死的原因是在運算的內容相同的情況下,受到使用的電路單元與路徑不同、個別晶片的體質好壞差異等因素影響其實是有可能導致運算熱功耗出現一定差距的,此外,即便是在同個晶片負載百分比相同的情況下,若運算內容不同也很可能會產生一定的熱功耗差距)。

對 Turbo Boost 有一定的瞭解之後要理解 GPU Boost 就不是那麼困難了,首先我們要知道相對於 CPU 而言 GPU 有兩點很重要的不同:

因為這兩點不同所以我們可以知道 GPU Boost 控制的肯定不是倍頻也不是單一 CUDA Core 的運作時脈,而是「整個 GPU」的運作時脈,而且與 Turbo Boost 不同,GPU Boost 並沒有「預先定義 Turbo 時脈」這樣的概念存在。

既然如此,那 GPU Boost 的超頻依據到底是甚麼呢?其實很類似剛剛討論 Turbo Boost 時提到的熱設計功耗,主要的差別是 GPU 看的是「耗電量」而不是「發熱量」,在這裡 NVIDIA 把它稱為 Power Target (白話就是 GPU 本身設計所能容許的最高耗電量限制),因此將整個 GPU Boost 技術歸納成一句話其實就是「在 GPU 本身還沒達到 Power Target 的情況下,系統可以自動動態提升 GPU 的運作時脈直到耗電量撞到 Power Target 這天花板為止」。

然而剛剛提到的「在運算的內容相同的情況下,受到使用的電路單元與路徑不同、個別晶片的體質好壞差異等因素影響,有可能導致運算功耗、耗電量出現一定差距」也適用於 GPU 上,所以實際上每張相同的顯示卡雖然在 NVIDIA 方面設定的預設 Power Target 都相同 (除非板卡廠有特別調整),但跑相同的負載時能夠動態調升的時脈多寡其實會受到晶片體質影響,因此是無法像以前那樣簡單從設定參數預測實際運作時脈的 (基本上你只能確定運作時脈會比 NVIDIA 設定的基礎時脈 Base Clock 來的高而已)。

然而由於決定運作時脈的方式改變,所以從 Kepler 開始 NVIDIA GPU 的超頻方式也比起以前有很大的不同,基本上已經不能像之前那樣直接指定目標時脈,而是得透過調整 Power Target 的位置來允許 GPU 本身動態超頻直到在更高的耗電量下運作為主、直接設定時脈位差 (Offset) 為輔兩種方式來進行超頻。

3D Vision Surround 改進

接下來在開始談 Kepler 架構的各款核心產品之前,我想談的是 Kepler 架構在輸出方面的改進,這方面主要體現於多螢幕輸出,也就是被 NVIDIA 稱為 3D Vision Surround 的技術。

其實 3D Vision Surround 最早在 Fermi 架構中就已經出現了,只是當時並沒辦法單靠一張 Fermi 顯示卡就做到三螢幕環繞輸出,而在 Kepler 架構的時代當中,只需要單獨一張 Kepler 顯示卡就具備同時輸出 3+1 台螢幕的能力了 (為什麼說 3+1 呢,因為 NVIDIA 方便把第四螢幕標示為 Accessory Display,本意是給你底下三台螢幕玩 3D 遊戲環繞,上面還可以放一台螢幕看個 Facebook 或逛個網站用)。

GK104 核心

談完 Kepler 架構的重要特性之後接下來照慣例從產品看起,GK104 核心是 NVIDIA 第一款基於 Kepler 架構的 GPU 核心,如果你還記得過去幾代 NVIDIA 的 GPU 核心慣用的命名法則的話,應該會覺得蠻有意思的,GK104 聽起來並不像是旗艦大核心的代號,但卻是 Kepler 家族當中的第一款核心,而且從中階一路到高階頂級產品都是使用這款核心 (這樣的作法是否有點眼熟?跟 AMD 的做法坦白說真的挺像的)。

而看到晶片本身的外觀,第一個想法大概就是「怎麼這麼小」吧?雖然以晶片的角度來說 GK104 也不是甚麼小晶片,但相較於 Fermi 架構的 GF110 來說面積從 520 平方公分一舉縮減為 294 平方公分,甚至比 GF114 還要小顆,怎麼看都不像是信奉大核心戰略的 NVIDIA 會拿來當旗艦 GPU 的東西,感覺上面應該還要有一顆 GK100 對吧?

就目前散落與洩漏的資料看起來,當年應該是真的有 GK100 這計畫存在的 (2011 年有許多消息都是同時傳 GK100 與 GK104),只是可能因為良率、設計困難或性能提升不如預期等因素最終沒能來得及付諸實現,直到後來才做為 Kepler 半代更新產品 GK110 推出,而在 GeForce 600 系列這一世代 NVIDIA 就採取了以 GK104 中核心擔綱中高階產品,旗艦產品則用上雙 GK104 核心設計這樣類似 AMD 的作法,回顧起來因為 GK104 本身性能就相當不錯,先以 GK104 上市而不拘泥於生出 GK100 使得 Kepler 得以順利上市這樣的策略算是相當成功。

接下來讓我們回到 GK104 核心本身,從上面的架構圖可以看到 GK104 核心本身是由 4 組 Graphic Processing Cluster (GPC) 組成,每組 GPC 當中包含了 2 組 SMX,因此總共有多達 1,536 個 CUDA Core 與 128 組 TMU、32 組 ROP,最早發布於 2012 年 03 月 22 日,由於 GK104 本身需要同時擔綱中高階產品線,因此基於 GK104 核心的衍生型有非常多種,一共有採雙晶片架構的 GTX 690、單晶片旗艦 GTX 680、高階 GTX 670、中階 GTX 660 與 GTX 660 Ti 以及後來的 GTX 760、GTX 760 Ti 這幾款。

首先看到的是單晶片旗艦 GTX 680 (1006 MHz / 6008 MHz),是系列編成當中唯一具備完整版 GK104 核心的單晶片產品,同時也是 Kepler 家族的第一款產品,得益於 Kepler 架構在節能方面的努力,因此是難得不需要 8-pin + 6-pin 電源輸入的旗艦級顯示卡,只需要兩組 6-pin 電源輸入即可。

GTX 680 本身並不算太特別的產品,但有一點特別值得一提,那就是 GTX 680 是 NVIDIA 頭一張有為媒體測試樣品設計包裝盒讓記者可以表演開箱的旗艦卡 XD。

至於稍低一階的產品則是當年五月推出的 GTX 670 (915 MHz / 6008 MHz),相較於 GTX 680 而言主要的差異是 GTX 670 閹割了一組 SMX,因此 CUDA Core 只剩下 1,344 個,TMU 也小幅縮減為 112 個,但由於 GPC 仍然是分成四組,因此 ROP 的部分沒有減少。比較值得注意的是在 GeForce 600 系列這一世代裡 NVIDIA 沒讓 GTX 670 與 GTX 680 共用 PCB Layout 與散熱器,而且 GTX 670 的設計非常的有意思。

單從正面圖看可能看不出來哪裡有意思,但翻到背面就很明顯了。

看出問題在哪裡了嗎?原來 GTX 670 的卡長有將近 1/4 其實是不必要的,NVIDIA 大概是出於當年大家看旗艦卡比長、比大張、比重看習慣了怕大家看不起 GTX 670 所以才用散熱模組增重並把長度拉到跟 GTX 680 平起平坐吧,不過 GTX 670 居然可以省下這麼多電路也是讓人驚訝,要不是 GTX 670 偷料偷很大就是其實 GTX 680 有很多料根本不必堆 (應該是後者)。

而在同年八月 NVIDIA 又將 GTX 670 進一步閹割之後推出 GTX 660 Ti (823 MHz / 5800 MHz),基本上從 PCB Layout 與散熱器設計上是看不太出來 GTX 660 Ti 與 GTX 670 之間有甚麼不同的,但是 NVIDIA 在閹割出 GTX 660 Ti 時使用了頗為特別的閹割方式 (見上圖),GTX 660 Ti 的記憶體控制器由四組減少為三組 (頻寬自 256-bit 縮減為 128 + 64 bit),除此之外還使用非對稱的方式閹割了共享快取記憶體,這導致 GTX 660 Ti 的 ROP 數量從 32 組大幅下降為 24 組,並且在存取記憶體時會發生有一部分記憶體容量存取速度不及其他區域的問題 (肇因於每組記憶體控制器所連結的記憶體容量不均等)。

而使用 GK104 核心的產品當中位階最低的則是 GTX 660 (915 MHz / 6008 MHz),儘管進一步將 SMX 的數量減少為六組,但卻沒有 GTX 660 Ti 上出現的記憶體配置不對稱問題,至於 PCB Layout 與散熱器則是繼續與 GTX 670 共用同款設計。

接下來要介紹的則是作為 GeForce 600 系列當家旗艦的 GTX 690 (915 MHz / 6008 MHz),由兩顆完整版 GK104 核心組成,從上圖中可以發現近年來 NVIDIA 高階顯示卡的散熱器設計基本上都是從 GTX 690 這款衍伸而來的。

其實 GTX 690 的 Layout 與 GTX 590 非常的相似,包含周圍 MOSFET 與記憶體顆粒的排列方式都如出一轍,但最值得注意的地方是在 GeForce 600 系列步入 PCI Express 3.0 時代時,NVIDIA 並沒有再另外設計用於 PCI Express 3.0 的橋接晶片,而是選擇直接向 PLX Technology (現以為 Broadcom 收購) 採購 PEX 8747 橋接晶片代替。

而在進入 GeForce 700 系列世代之後,GK104 核心仍然被沿用於 GTX 770、GTX 760 Ti 與 GTX 760 三個型號上,其中定位最高的 GTX 770 (1046 MHz / 7008 MHz) 實際上就是時脈設定較高並換上新散熱器的 GTX 680,而 GTX 760 Ti (915 MHz / 6008 MHz) 則是僅針對 OEM 業者推出 (實際上就是 GTX 670 改名而來的版本)。

而定位最低的 GTX 760 (980 MHz / 6008 MHz) 則是以 GTX 770 為基礎額外減去一組 SMX 的版本 (見上圖),架構上與 GTX 660 很類似但是由於沒有減少快取與記憶體控制器的數量 (仍然保有 256-bit 的記憶體頻寬),因此並沒有 GTX 660 上的記憶體頻寬不對稱問題,但要特別注意的是「OEM」版本的 GTX 760 實際上規格比較接近 GTX 660,是有刪減記憶體頻寬且會出現頻寬不對稱問題的版本,而且時脈遠低於一般版本的 GTX 760,僅有 888 MHz / 5800 MHz。

GK106 核心

之後在 2013 年 NVIDIA 進一步推出了簡化版的 GK106 核心作為中階產品之用,共計有 GTX 660 (後期版本)、GTX 650 Ti 與 GTX 645 三款產品使用此款核心。

相較於 GK104 核心來說,GK106 核心將 GPC 從四組減為三組,並且規畫其中一組 GPC 僅有一組 SMX,因此總計 SMX 數量至多為 5 組,並且將記憶體控制器刪減為三組,L2 快取的部分也跟著減小。

其中 GTX 660 (後期版) 使用的是完整版的 GK106 核心,因此具備 960 個 CUDA Core、80 組 TMU 與 24 組 ROP,但受到記憶體控制器分配的影響,2 GB 版本與 GTX 660 Ti 一樣會遇到記憶體控制器分配不均的問題,最後 512 MB 的記憶體頻寬會明顯較小。

而 GTX 650 Ti 則有兩個版本,主要差異出現在是否支援 GPU Boost 功能上,Boost 版本時脈略高 980 MHz / 6008 MHz) 且具備 24 組 ROP 與 192-bit 的記憶體頻寬,而不支援 Boost 的版本 (928 MHz / 5400 MHz) 則是僅具備 16 組 ROP 且記憶體頻寬將只剩下 128-bit。

GTX 645 (後期版) 則是不支援 GPU Boost 並且只具備 576 個 CUDA Core 與 48 組 TMU,而在記憶體頻寬方面則是被進一步刪減為 128-bit。

GK107 核心

GK107 核心則是首批 Kepler 家族當中定位最低的一款核心,僅具備兩組 SMX 因此主要僅有兩種衍伸形 (分別具備 384 個或 192 個 CUDA Core)。

此款核心被用於 GTX 650、GT 640、GT 630 與 GT 740 四款型號上,其中定位最高者為 GTX 650 (1058 MHz / 5000 MHz),具備完整的 GK107 核心 (384 個 CUDA Core、32 組 TMU、16 組 ROP 與 128-bit 記憶體頻寬)。

而 GT 640 與 GT 630 的中後期版本也曾經使用 GK107 核心,前者均為完整版 GK107,後者則為 SMX、CUDA Core、TMU 均砍半的精簡版本,並且有推出搭配 DDR3 記憶體的低價產品。

至於 GT 740 的規格則是與 GTX 650 相仿,但運作時脈設定較低一些 (993 MHz / 5008 MHz),並且有搭配 DDR3 記憶體的版本推出。

Kepler 的「真。完全體」-GK110

接下來要介紹的是 Kepler 家族 GPU 當中的最終完整版-GK110,回顧當年的情況其實大家早在 2012 年上半 GK104 這款「中核心」推出之後就已經開始瘋狂的臆測上面應該還要有一顆「大核心」GK100 了,不過最終 NVIDIA 始終沒有推出代號為 GK100 的大核心 (或許是當時與 GK104 同步開發的 GK100 因為設計方面的問題難產,或是覺得 GK104 的性能就已經足以應付對手吧)。

直到 2012 年 05 月的 GTC (GPU Technology Conference) 上,NVIDIA 的 CEO 黃仁勳在發佈完基於兩顆 GK104 的 GTX 690 之後 (這時 GK104 已經上市 2 個多月了) 才終於發佈了首款基於完整版 GK110 大核心的產品-Tesla K20,這在 NVIDIA 的歷史上應該是第一次頂級顯示卡沒有用上自家最強大的 GPU,而最完整版的大核心只用於運算卡之上,某種程度上這標誌著 NVIDIA 由傳統圖形晶片領導廠商轉向以人工智慧、運算技術為主要發展方向的轉型已經開始付諸實踐 (不過發表當時 GK110 還沒完成)。

既然 Kepler 大核心被取名為 GK110 而不是 GK100,根據過去的慣例 (GF100 與 GF110) 在架構上 GK110 肯定不會單純只是 GK104 的放大版本,實際上也確實如此 (這也是我為什麼要把 GK110 特別抓出來獨立成一小節的原因),接下來就讓我們來看看到底是哪些地方不一樣吧。

強化雙精度浮點性能

 

在進行一般圖形應用運算 (例如遊戲) 的時候通常以單精度為準 (畢竟單純算圖其實不需要那麼精準),所以絕大多數的 GPU 都以強化單精度運算性能為主要目的 (其實很理所當然,畢竟單精度運算單元比起雙精度運算單元來得簡單很多,這意味著同樣面積下能塞入更多單精度運算單元,而更多的運算單元幾乎就意味著更高的性能,因此當然要選擇塞更多的單精度浮點單元,甚至犧牲雙精度性能也在所不惜)。

剛剛提過 NVIDIA 在 GTC 2012 上同時發佈了兩款運算卡 (Tesla K10 與 Tesla K20),其中 Tesla K10 的部分官方宣傳強調為「高達三倍的單精度浮點運算性能」,適合影像、訊號處理用途,其實這張 Tesla K10 就跟 GeForce GTX 690 一樣是基於兩顆 GK104 核心而來,因此同樣是強調單精度性能重於雙精度性能的產品 (基本上在 GK104 上雙精度運算性能只有單精度的 1/24),因此本質上來說其實 Tesla K10 比較不像「正規」的運算卡,硬要說的話其實反而比較像是 Quadro 系列的繪圖卡。

為什麼這麼說呢?實際上通常我們在談「運算」領域的時候比較強調的其實是專業運算、科學運算、金融運算這類比較重視精準度的用途,而這類用途通常除了單精度浮點運算之外也會有很多雙精度浮點運算的場合,在這種狀況下 Tesla K10 的設計是肯定是不敷使用的,這也就是為什麼用於組成 Tesla K20 的 GK110 核心勢必得大幅強化雙精度運算性能的原因。

至於具體的做法呢,要解釋之前我們得先回顧 GK104 的 SMX 布局 (上圖),實際上除了圖上可見的 192 個 CUDA Core 之外 NVIDIA 還在 GK104 的每組 SMX 之中安排了 8 個專門負責處理雙精度的運算單元,而在 GK104 上單雙精度性能如此懸殊的原因主要就來自於這裡 (數量相差 24 倍,實際上 GK104 的雙精度浮點運算性能 190.7 GFLOPS 就是單精度性能 4577 GFLOPS 的 1/24),然而前面提過這樣的狀況在正規運算用途中肯定是不夠的,所以到了 GK110 每組 SMX 的佈局就變成下面這樣。

沒錯,黃色方塊 DP Unit 就是 GK110 大幅增加的雙精度浮點運算單元,光是數量上就從 GK104 的 8 個一口氣提高到 64 個了,足足是 GK104 的八倍之多,因此在 GK110 上雙精度浮點運算 1175 GFLOPS 性能實際上大約是單精度浮點運算性能 3524 GFLOPS 的 1/3。

除此之外為了解決在性能提升之後平均每 GFLOPS 分配到的資料頻寬減少的問題,SMX 內的貼圖快取 (Texture Cache) 在進行通用運算任務時現在可以作為「唯讀資料快取」使用,並且將 GK110 每個執行緒所能支援的暫存器數量由 63 個提高為 255 個 (因此在 NVIDIA 的官方文件中,GK110 的 Compute Capability 等級是 3.5 而不是 3.0)。

GPU Boost 2.0

另一項在 GK110 當中引入的改進則是第二代的 GPU Boost 技術,如果你了解 GPU Boost 1.0的運作方式的話,其實 GPU Boost 2.0 的改進方向並不是甚麼很複雜的東西,還記得前面提過 GPU Boost 是以「Power Target」,也就是 GPU 耗電量作為動態調整時脈的依據嗎?

而第二代的 GPU Boost 技術其實就是把動態調整時脈的依據變得更多樣 (說穿了就是把溫度也納入調整依據) 而已,所以支援 GPU Boost 2.0 的 GPU 在運作時脈上會更難預測 (因為 GPU Boost 1.0 的電壓上限 Vrel 是由 NVIDIA 預先定義,而 GPU Boost 2.0 的 Vrel 則會根據溫度自動調整)。

這樣的結果在大多數情況下會允許顯示卡的 Vrel 上限動態調整到超過原先 NVIDIA 定義的 Vrel,所以通常可以允許顯示卡動態超頻到更高的時脈。

然而與 GPU Boost 剛被引入的時候類似,由於參考標準不再只侷限於 Power Target,因此在 GPU Boost 2.0 之後超頻設定時的調整依據將變成 Power Target 與 Temp. Target 共同參照,並且允許使用者決定要使用「溫度先決」或「耗電量先決」模式。

Hyper-Q 與動態平行化技術

除了前面提及的這些之外,GK110 核心還引入這兩個新特性,其中 Hyper-Q 主要是考慮到伺服器的 CPU 核心數越來越多,因此勢必得讓 GPU 能同時接受多個 CPU 下令以提高執行效率 (否則在等待處理器核心下令的空窗就會讓 GPU 閒著沒事做) 而做的改進,透過 Hyper-Q 能夠讓 GK110 至多同時受理來自 32 個處理器核心的命令。

至於動態平行化技術的主要目的則是讓 GPU 不必再像以前那樣只能被動聽令於處理器下達的平行指令進行作業,而是可以自行動態產生後續的運算核心資源與執行緒分配,以求盡可能省下花在 GPU 與 CPU 不斷來回溝通之間所耗掉的時間。

不過這兩個技術基本上只在 Tesla 運算卡上才能比較明顯見得到其優勢,對於本系列文章主要要談的顯示卡而言其實沒有太多意義,因此在此就不多贅述了。

GK110 核心

談完 GK110 在架構上的一些調整之後接下來讓我們回到 GK110 本身,下面這張圖就是 GK110 的配置圖,相對於 GK104 而言可說是十分的壯觀。

相較於 GK104 最多只由 4 個 GPC、8 組 SMX 組成來說,GK110 的規模足足增加了將近一倍,完整版 GK110 核心包含了高達 5 組 GPC、15 組 SMX,記憶體控制器也從四組增加為六組,因此其中所包含的 CUDA Core 數量可以高達 2,880 個,而暴漲的 CUDA Core 數量與大幅提高的雙精度浮點運算單元數量當然也意味著面積和電晶體數量的大幅提升,實際上 GK110 包含高達 71 億個電晶體,這足足是 GK104 的兩倍之多。

大致上 GK110 的介紹就到這邊,接下來就是產品的部分,其實當年在基於 GK110 的 Tesla 上市之後大家就一直猜測之後肯定會有基於 GK110 核心的 GeForce 顯示卡推出,而在幾個月之後,NVIDIA 終於在 2013 年 02 月給了大家解答,也就是擔綱當今 GeForce 頂級產品地位的 TITAN 家族的第一位成員-GTX TITAN。

之所以會特意取名為 GTX TITAN (837 MHz / 6008 MHz),其實由來並不難理解,因為對於 GK104 而言其實 GK110 應該算是同一世代的產品 (照慣例 Kepler 的半代更新應該叫做 GK2xx,而且 GK110 拖太久導致與下一代 Maxwell 架構之間的時程距離太近),畢竟 GK104 與 GK110 根本就是同一時間進行開發的 (甚至以 Fermi 的慣例來說 GK110 在還叫做 GK100 的時候很有可能其實根本就比 GK104 還早進行開發),所以 GTX TITAN 本來應該被劃分在 GeForce 600 系列當中,作為 GTX 690 推出才是 (BTW,第一張訂價破千美金的 NVIDIA 顯示卡不是 GTX TITAN,其實是 GTX 690)。

不過可能是後來發展不順利所以導致 GK110 沒能在 GK104 之前推出,甚至還要晚上將近一年才達到上市水準,因此後來 GeForce 600 系列的頂級產品就由兩顆 GK104 核心組成 GeForce GTX 690 擔綱了,而 GTX TITAN 本身的性能又比 GTX 690 高出太多,因此也就有為其取一個新名字的必要 (畢竟叫 GTX 695 無法彰顯 TITAN 比 690 強那麼多這點),而當時正好全世界最快的超級電腦就是基於 Tesla K20X 的 TITAN,這就是 GTX TITAN 命名的由來了 (畢竟在 GTX TITAN 上市的時候 GeForce 700 系列還沒推出,所以 GTX TITAN 一開始是被劃分在 GeForce 600 系列裡面的)。

在規格方面 GTX TITAN 本身採用的並不是完整版 GK110 核心,與 Tesla K20X 一樣是經過屏蔽一組 SMX 的版本,因此 CUDA Core 數量為 2,688 個,建議售價與 GTX 690 一樣都是 1,000 美元。

而第二款採用 GK110 核心的顯示卡則是 2013 年 05 月推出的 GTX 780 (這是 GeForce 700 系列的第一款產品,可能是 NVIDIA 發現 Maxwell 大核心無法如期推出所以決定在 GeForce 700 系列繼續使用 Kepler 架構為主吧,所以隨後 GTX TITAN 也被重新分類放到 GeForce 700 系列了),在 GTX 780 (863 MHz / 6008 MHz) 上所搭載的 GK110 核心是經過進一步刪減的版本,只具備 12 組 SMX (即 2,304 個 CUDA Core) 與 192 組 TMU,GK110 本來應該具備的額外雙精度浮點運算單元也被去除 (因此 GTX 780 的雙精度性能與 GK104 產品一樣是單精度的 1/24),值得注意的是 GTX 780 是歷代以 80 結尾的顯示卡當中唯一一款與 TITAN 系列共用核心的產品,之後基本上都要到 80 Ti 結尾的產品才有機會與 TITAN 共用核心。

而在同年 11 月 NVIDIA 又進一步推出定位比 GTX 780 還要高一階的 GTX 780 Ti (876 MHz / 7000 MHz),最特別的是 GTX 780 Ti 是第一款使用完整版 GK110 核心的產品,包含了完整的 15 組 SMX、2,880 個 CUDA Core (當然浮點運算單元也跟 GTX 780 一樣被省略了),由於時脈設定高於 GTX TITAN,在遊戲方面的性能甚至可以超過 GTX TITAN 讓當時的產品布局變得有些尷尬。

雖然 GTX TITAN 在雙精度方面的表現當時沒有任何 GPU 可以與之匹敵,但是自家價格最高昂的個人電腦顯示產品在性能排行上卻只能排第二總是一件讓人尷尬的事情,因此 NVIDIA 並沒有讓 GTX 780 Ti 稱王太久,在 2014 年 02 月 (也就是 GTX TITAN 上市一年後) 又推出了 GTX TITAN Black 昇級版。

這回 GTX TITAN Black 所搭配的 GK110 真的就是完整版本了,包含 15 組 SMX 而且在雙精度浮點運算單元的部分也沒有刪減,因此在浮點運算方面 GTX TITAN Black 的性能是遠比 GTX 780 與 GTX 780 Ti 要來得優異的,由於時脈設定也一舉提升到 889 MHz / 7000 MHz,因此 GTX TITAN Black 毫無疑問搶回了性能王者的寶座。

實際上單就外觀上要分辨 GTX TITAN 與 GTX TITAN Black 其實並不是一件容易的事情,在外型設計上其實只有 TITAN 字樣的顏色不同而已,除此之外幾乎是採用完全相同的設計,儘管在傳聞階段的時候 GTX TITAN Black 曾經謠傳會以全黑化的外觀設計上市,但最後並沒有付諸實現。

最後要談的則是 Kepler 架構下的最後一款高階顯示卡,同時也是 TITAN 家族迄今為止唯一一款雙晶片產品-GTX TITAN Z,由兩枚完整的 GK110 核心所組成,足足包含了 5,760個 CUDA Core (由 30 組 SMX 所組成),雖然運作時脈比起 GTX TITAN 還要略低一些 (705 MHz / 7000 MHz),但憑藉著雙倍的運算規模使其穩坐 NVIDIA 最強顯示卡位置好一陣子,價格方面也是極其驚人的 2,999 美金,就算是下一世代的 TITAN 也無法與之匹敵。

Kepler 半代更新

實際上 Kepler 架構還真的有半代更新產品推出 (也就是 GK2xx 系列核心),不過整個家族當中最後只有兩款推出 (畢竟第二代 Maxwell 架構的產品當時都已經上市了) 且其中的大核心 GK210 並沒有用於個人電腦顯示卡,而是只在 Tesla 系列當中現身。

Kepler 的半代更新產品變動幅度非常小,因此實際上若想將它們視為同一代也是可以的。

GK210 核心 (僅用於 Tesla)

不過為求完整我還是說明一下 GK210 核心與 GK110 核心之間的主要差異好了,實際上 GK210 只被使用於 Tesla K80 一款產品當中,並且與 TITAN Z 類似,採用了單卡雙晶片的設計。

大致上我們可以將 GK210 視為從 GK110 小幅修改而來的產物,在規格上可見的變化是出現在 Register File Size 的部分由 256 KB 翻倍為 512 KB、L1 快取與共享記憶體的總大小也從 64 KB 翻倍為 128 KB 兩點,之所以這麼修改主要是希望能提升在進行 CUDA 通運運算時的吞吐量 (因此 GK210 的 Compute Capability 等級為 3.7)。

值得注意的是為了功耗與發熱量控制及良率調整 (其實 NVIDIA 為了一款本來就不太可能大量銷售的運算卡特意流片一款新的核心這做法還蠻讓人費解的,畢竟這樣會讓 GK210 的成本很高,而且沒辦法被總量攤提掉) 所以 GK210 的時脈設定相對而言低了很多,並且全面屏蔽了兩組 SMX (因此單個 GK210 核心的 CUDA Core 數量為 2,496 個)。

GK208 核心

最後一款基於 Kepler 架構的核心是 GK208 核心,從代號上我們可以很容易得知這款核心主要是為了擔綱低階入門市場而設計的,實際上 GK208 與前面介紹的 GK107 在布局上完全一模一樣,都是由最高 2 組 SMX (最多具備 384 個 CUDA Core) 與兩組記憶體控制器 (頻寬至多 128-bit) 所組成。

至於 GK208 與 GK107 的具體差別到底在哪裡呢?實際上僅出現在 ROP 與 TMU 的數量配置,在 GK208 上分別被減半為 16 組 TMU 與 8 組 ROP,記憶體控制器也被減半為只剩下一組 (因此頻寬只剩下 64-bit),這樣的縮減使得 NVIDIA 得以進一步壓低 GK208 的核心面積與功耗。

一如往常在低階市場 NVIDIA 的布局一向都非常的混亂,各種核心互相流用、閹割以及換代時改名重出的情況可說是屢見不鮮,因此在這裡我只簡單列出採用 GK208 核心的產品,就不特別一一介紹了。

Exit mobile version