這次我們取得 HD 7970,除了一般性效能測試以外,還要測試所謂第一張「PCI-E 3.0」顯卡有什麼能耐。而針對 GCN 架構,我們精心繪製了指令運作圖,讓大家了解 GPU 在多個 Wavefront 下,如何動態調度指令讓效率更高,也能看出 VLIW 4 跟 GCN 架構的差異。
GCN(Graphic Core Next)是AMD用於HD 7970的新架構,會讓AMD想要修改行之已久的架構,得要從先前VLIW(Very Long Instruction Word,超長指令集)體系說起。AMD從R600也就是Radeon HD 2900系列之後,都使用SIMD(Single Instruction Multiple Data,單指令流多數據流)架構,也就是VLIW 5。到Cayman也就是Radeon HD 6970之後,才改為VLIW 4,但是架構設計上還是有缺憾。
VLIW 5的特色在於使用4D+1D向量(vector)架構,對於經過最佳化的指令,能夠比NVIDIA使用的MIMD(Multiple Instruction Multiple Data,多指令流多數據流)更有效率。而VLIW 4則是拿掉4D+1D架構中的個1D成了4D架構,且透過升級後的4D,運算效能比傳統4D+1D更好,但是缺點就是電晶體數量增加,且功耗提升。
關鍵字:純量與向量
3D物件的成像過程中,VS(Vertex Shader,頂點著色引擎)與PS(Pixel Shader,像素著色引擎)最主要的作用就是運算座標(XYZW)與顏色(RGBA)。此時數據的基本單位是scalar(純量),1個單位的變量操作,稱之為1D純量或簡稱1D。
而跟純量相對的就是vector(向量),向量是由多個純量構成。例如每個週期可執行4個向量平行運算,就稱為4D向量架構。若GPU指令發射口只有1個,卻可執行4個數據的平行運算,這就是SIMD架構。
理論上的最有效率不一定會印證在實際表現上,受到驅動程式與環境等限制,通常無法達到理論水準。更重要的是,以往VLIW 4或VLIW 5,在GPGPU(General-Purpose Computing on Graphics Processing Units,通用繪圖處理器)應用方面並不出色。
相對地,NVIDIA於GF 100使用的Fermi架構,對通用運算相當有力,讓這個領域的差距更為明顯,也興起AMD改變架構的想法。早在去年AMD公佈GCN架構時,就已經喊出「圖形就是運算,運算就是圖形」的口號,透過架構升級,讓GCN能兼具圖形與通用運算。
(點小圖看大圖)
▲為了看出前後代差異,又得把這2張老圖拿出來。VLIW 5具備用於特殊運算的T unit(圖中體積較大者),而VLIW 4雖然看似精簡,但是每個ALU都能達到T unit的運算效能,因此表現會更好。而換架構也不是沒有缺點,即便ALU數量差不多,但是發射口與branch unit等元件增加,電晶體數量更多,不只拉高成本,功耗也跟著提升。HD 5870官方耗電量為188W,而HD 6970則是250W。
通用運算要強,除了架構支持,還得靠記憶體配合。首先是增加ECC(Error Checking and Correcting,錯誤檢查及校正)功能,可強化現有的EDC(Error Detection and Correction,錯誤檢測及校正)機制。
這2項設計都是為了保證高速GDDR5記憶體與系統記憶體資料交換的準確性, NVIDIA早在GF 110時就已經具備ECC機制,而AMD到Cayman之前只有EDC而沒有ECC。
此外,針對精確度,AMD也將FP64(double precision floating point,FP64,雙精度浮點數)納入新架構的標準,雖然FP64的峰值效能遠遜於FP32,但對於通用運算仍有其必要性。NVIDIA從GT 200之後支援FP64,而AMD則是從Cypress、也就是HD 5870開始支援。但是意外的是Barts(HD 6800系列)不支援FP64,直到Cayman(HD 6900系列)才又恢復支援。
關鍵字:FP32與FP64
▲經常聽到的單精度浮點數(single precision floating point,FP32)與雙精度浮點數(double precision floating point,FP64),都是IEEE 754二進位浮點算數標準的表示方式。其中單精度與雙精度的差異,主要在於前者的紀錄單位為32位元,後者則是64位元。依照紀錄位數的多寡,會影響到數值的精確度。因而在運算交換量龐大的通用計算中,具有更精準的雙精度運算會更好。
名詞對照 sign bit(符號) 用於表示正負號 exponent(指數) 用於表示次方數 mantissa(尾數) 用於表示精確度
想要修正架構必定有其誘因,除了通用運算之外,先前的VLIW 5與VLIW 4效能不彰也是個問題。AMD會採用VLIW體系,主要是受到3D影像的特性所影響。3D物件最重要的就是顏色與座標,其中顏色可由RGB三原色配上半透明通道alpha構成。而位置則是由三維座標XYZ,加上遠近參數W所構成的齊次座標來
3D物件變化時,顏色與座標的完全轉換都是4D純量,因此理論上用4D+1D的VLIW 5或4D的VLIW 4都能擁有最佳的效率。然而事實上並非如此,簡單來說,若要把黃色的皮卡丘變成淡黃色的皮卡丘,不用動到RGBA的4個參數,只要調整alpha參數即可得到淡黃色的皮卡丘。當需要運算1D純量時,架構內卻有3~4個ALU(Arithmetic Logic Unit,算數邏輯單元,等同Stream Processor)沒事幹,使用效率自然就不彰,偏偏這種情況又不算少。
或許有人會說,那全都砍掉做成1D純量運算,問題不就解決了?的確如此,NVIDIA走的就是這個方式,將所有運算需求全部透過硬體將4D、3D、2D全都拆成1D,哪個CUDA Core(位階等同ALU或SP)閒著沒事就丟給它運算,實際使用率會比VLIW架構還好。
如果VLIW 5架構同時碰到1D、2D、3D與4D運算需求,最佳解就是將運算需求合併成1D+4D與2D+3D。如此一來只要1組運算單元跑2個週期或2組運算單元跑1個週期就能完成。AMD不透過硬體拆分指令串,便嚴格考驗驅動程式的最佳化能力,這也是為什麼有時AMD驅動程式一更新,效能立刻暴漲的原因,因為最初的版本最佳化肯定不好,得靠時間慢慢修正。
AMD(或是當初的ATI)會將架構設計為VLIW 5或VLIW 4,除了先前提到的效率之外,另一方面則是成本考量。不論VLIW 5或4都是透過驅動程式進行指令重組,並不像NVIDIA使用硬體架構進行重組。
這種架構好處是理論效率與效能很高,又沒了用於重組指令的硬體架構,更省電晶體。簡化硬體架構對於擴增ALU相對容易,尤其是更改製程的世代,能先透過擴增ALU的方式提高效能,把簡單的硬體架構先做出來,後期再靠驅動程式最佳化,還能把重組指令的硬體成本轉嫁到驅動程式上。
前後代卡王規格比較 |
||
HD 6970 | HD 7970 | |
研發代號 | Cayman | Tahiti |
架構 | VLIW 4 | GCN |
製程 | 40nm | 28nm |
核心時脈 | 880 MHz | 925MHz |
SP數量 | 1536 | 2048 |
Texture Units | 96 | 128 |
ROPs |
32 | 32 |
記憶體規格 | GDDR5 | GDDR5 |
記憶體容量 | 2GB | 3GB |
記憶體頻寬 | 176GB/s | 264GB/s |
最大電力需求 | 250W | 250W |
NVIDIA則是先設計完整的硬體架構,指令分配、運算都由硬體負責,驅動程式的重要性就不如AMD,可節省驅動程式的開發費用。化整為零的方式,運算上較為單純,但是設計上較為複雜,算是一勞永逸的設計方式。
從過去同時期的核心來看,AMD的特色就是ALU數量多,但是跑的慢。代表的例子就是R600有320個ALU,時脈卻只有743MHz。NVIDIA的特色就是CUDA Core數量少,但是跑的快。代表核心G80只有128個CUDA Core,不過Shader時脈就有1.35GHz,可看出兩者設計上的差異。
(點小圖看大圖)
▲在GCN出現之前,Cayman與Fermi的基本運算核心不太相同,Cayman是以SIMD陣列為主,而Fermi則是以SM或是GPC為單位。同陣營顯卡中,若SIMD越多,或GPC、SM數量越多,通常就是效能的保證。但不同陣營的架構不同,比較兩者的ALU或CUDA Core是沒有意義的行為。
AMD與NVIDIA的設計架構之間沒有絕對的優劣,各有擅長的領域跟成本考量。不過以架構的壽命來說,或許是擴增相對容易,AMD使用VLIW體系非常久,直到今日才大改成GCN,而NVIDIA在GT200後就改為Fermi架構,與最初G80的設計又大為不同。從架構的使用壽命來看,不難看出簡化硬體架構所帶來的設計優勢。雖然設計相對容易,但是要達到革命性的效能,還得要後期驅動程式配合,這也是AMD的弱項。近幾個世代,不論AMD或NVIDIA都沒有早期「半年架構一更新,核心效能倍增」的理想曲線,若要大幅提升效能,只強化既有架構是不夠的。
▲AMD這次不只架構改進,另外也將核心製程從40nm提升為28nm。顯而易見的好處就是耗電量、溫度更低,且超頻性表現也更好。
AMD HD 7970 之 GCN 架構完全解析,帶來 GPU 革命
沒有什麼架構可以用一輩子,遲早得面對效能不彰、擴增不易的問題,GCN架構也就應運而生。為了解決通用運算以及VLIW 5、VLIW 4效率不彰的問題,GCN架構試圖在改革與延續之間取得平衡點,兼具SIMD(Single Instruction Multiple Data,單指令流多數據流)與MIMD(Multiple Instruction Multiple Data,多指令流多數據流)的特性。
先前VLIW 4是採用SIMD架構,特色是單一發射口對上4個ALU,因為共用發射口,所以電晶體數量較少。雖然每週期可執行4次操作(operations),但是仍為1條指令。而NVIDIA的GF 100與GF 110則是MIMD架構,每個CUDA Core都有自己的發射口,電晶體數量較多,每個CUDA Core都能獨立運算指令。
這次GCN也就是所謂Non-VLIW架構中,過去VLIW特性將會大幅改變,但是從根本上來說還是非常相似,而效率卻是天差地遠。VLIW所採用的是指令平行(instruction level parallelism),GCN則是執行緒平行(thread level parallelism)。就是為了改善通用計算的瓶頸,強化指令編譯的靈活性。
VLIW效率不佳,有很大的因素是受到編譯器限制,無法動態調整指令。雖然理論效能極佳,但是得在特定環境與編譯器最佳化的情況下才能實現。舉例而言,VLIW架構運作時,指令執行過程只能依照既有的順序進行運算,若有額外加入或是相關性指令,都只能僵化地依照順序執行,無法動態調整以提高效率。
為了改善編譯器問題,GCN在架構上做了強化。攤開架構圖,可看到核心內藏32個CU(Compute Unit),這些CU是GCN也是Tahiti核心的基本運算區塊。每個CU內包含4個SIMD陣列、1個純量運算單元(Scalar Unit)、Instruction Fetch Arbitration、Control and Decode、快取記憶體等單元,還有用於抽取、編譯、調度Wavefront與指令的Branch & Message Unit。
每個SIMD陣列則由16個向量運算單元(Vector Unit)構成,1個週期內SIMD可執行16個single precision multiply-add(單精度乘加)運算。若以CU來計算,每個週期則可執行64次,也就是4條單精度乘加運算,因此可說是具備MIMD的特性。
先前提到的指令調度問題,靈活性方面,可透過CU內的硬體分支單元Branch & Message Unit解決,這硬體的角色可稱之為調度器(hardware scheduler)。當指令集(instruction set)來到編譯器,編譯器會將指令打散成Wavefront(NVIDIA則是Warp),並排列出高低順位。在實作中AMD的Wavefront是64個為1組,理想狀態下,Wavefront依序進入ALU中平行運算,可讓ALU使用率達到100%,可惜事實上並沒有這麼簡單。
現在需要動態調度的原因是,當編譯器決定Wavefront的順序後,只能依序將指令丟入ALU運算。然而在實際運算中,Wavefront之間存在相依性(dependency),也就是必須等到順位高的Wavefront運算完畢後,才能運算順位低的Wavefront,而相依性會造成流水線塞車,導致ALU效率偏低。
相依性的原因有點像是解方程式,假設B+2=4,B+C=6,必須先算出B才能解出C。問題是VLIW 4架構中,編譯器不能改變既定的Wavefront順位,空下來的閒置ALU就會造成效率不彰的問題。
透過動態調度,假設原本VLIW 4運算A~O共15個Wavefront共要6個週期,而透過GCN的CU只需要4個週期就能運算完畢。若指令越零散或相關性越高,透過CU運算的效益就越明顯。
上述介紹中不難看出以往在VLIW 4架構中,效率高低的關鍵是編譯器的能力。以往缺乏硬體調度的情況下,Wavefront排列後只能依序運算,新增hardware scheduler之後,可讓Wavefront調度更有彈性,碰到彼此有相依性的Wavefront也能透過更改優先順序提高運算效率。
▲GCN內含32組CU,而CU內又有4個SIMD陣列,每個SIMD陣列又由16個ALU構成,所以總計有2048個ALU。其中CU內的Branch & Message Unit用於指令調度,是這次新架構的重要硬體元件。先前有廠商洩漏出40個CU的HD 7970,不過AMD官方也立刻回應Tahiti沒有任何被遮蔽的核心。依照往常的經驗,更換65nm、40nm都有良率問題,加上NVIDIA在GF 100時期,讓GTX 480架構精簡,很難想像28nm的HD 7970沒有遮蔽任何元件。或許是天生神力,加上良率穩定且設計出色,才沒有遮蔽的需要。
(下一頁:圖解編譯器指令集排程)
假設有A~O共15條Wavefront,順序是由A到O,且部分Wavefront存在相依性。其中C必須依賴B,也就是Wavefront C必須等到Wavefront B運算完畢之後,才能算Wavefront C。有點類似B+2=4,B+C=6,必須先求得B的解才能解第二個方程式。其餘E與F、F與G、L與K都是相同情況。
在VLIW 4架構中缺乏動態調度功能,某些環境使用率相當低。在週期一當中,由於Wavefront C必須依賴Wavefront B,因此SIMD的第三與第四組ALU處在閒置狀態。同樣的情況在週期二、三、五都出現,特別是週期三與五效率特差,只有執行1組Wavefront。理 想中的高效率滿載狀態,只有週期四與六可達到。
▲Wavefront B與C的相依性並未解決,加上缺乏動態調度,只能讓第三與第四組ALU閒置。
▲上個週期未處理的Wavefront C,被留到這個週期運算。由於Wavefront E與F又存在相依性,因此F不能在這個週期處理,使得第四組ALU閒置。
▲這個週期依序處理Wavefront F,由於Wavefront G依賴Wavefront F,因此Wavefront G、H、I只能延後處理。
▲由於此週期沒有相依性,因此能依序處理Wavefront G、H、I、J。這也是VLIW 4架構最理想的狀態。
▲依序處理Wavefront K,但是Wavefront K與L又有相依性,週期五只能單獨處理Wavefront K。
▲剩下的Wavefront L、M、N、O都沒有相依性,因此能執行4個Wavefront。VLIW 4架構處理15個Wavefront總計花費6個週期。
透過GCN的CU運算,由於具備動態調度功能,因此在允許的行況下,可先執行順位較低的Wavefront。像是週期一當中,可先略過依賴 Wavefront B的Wavefront C,先執行Wavefront D與E。如此一來,15條Wavefront只需要1組CU花費4個週期就能處理完畢,足足比VLIW 4少了2個週期。
▲由於Wavefront B與C存在相依性,透過動態調度功能,可讓排程在後面的Wavefront D與E先行運算,讓CU的SIMD陣列滿載。
▲週期二接著處理Wavefront C,其中依照順序應該接著處理Wavefront F、G、H,不過Wavefront G與F有相依性,因此捨棄Wavefront G先行處理Wavefront I。
▲週期三繼續運算Wavefront G,Wavefront L跟K有相依性,因此先處理順位中的Wavefront M。
▲最後一個週期將剩下的Wavefront處理完畢,一共花費4個週期就處理完畢。其中週期一、二與三都是滿載。
(下一頁:GCN:率先使用新規格)
看到AMD的新架構,很難不去跟NVIDIA先前發表的Fermi比較,不過架構只是追求效能與節省成本的手段。論斷好壞並不客觀,但是在設計上倒是可以比較一下兩者的異同。
比較值得一提的是兩者的快取架構,Fermi每個SM(Streaming Multiprocessors)有64KB的L1快取,而所有SM則是共享768KB的L2快取。GCN設計上則較為複雜,CU有獨立64KB的L1快取,每4個CU還可共享16KB的指令快取(instruction cache)以及32KB的純量資料快取(scalar data cache)。L2則是每個記憶體控制器(memory controller)可支援64或128KB,HD 7970內具備6個記憶體控制器,因此L2快取與Fermi同為768KB。
▲新架構的快取共享機制很複雜,每個CU有獨立也有共享的快取。重視數據共享是GCN的特點之一,加上X86虛擬記憶體技術,讓複雜程度再上一層。
GCN架構的L1快取都是與L2共通的,且能跟顯卡上的GDDR5記憶體同步數據。GCN比Fermi更為注重資料同步,L1與L2、L2與顯卡記憶體、L2與系統記憶體都能同步數據。另外還有首次出現的X86 Virtual Memory(X86虛擬記憶體),可讓顯卡上的記憶體虛擬為系統記憶體。即使是X79用的四通道記憶體頻寬(memory bandwidth)不過30~50GB/s左右,HD 7970上的GDDR5記憶體頻寬可高達264GB/s,是系統記憶體的數倍,有助於通用運算與少部分遊戲。
除了X86虛擬記憶體外,這次HD 7970也支援了不少新規格,舉凡PCI-E 3.0、DirectX 11.1,而且又是第一款28nm製程的顯卡。PCI-E 3.0部分,下個章節會搭配效能實測介紹,在此我們先來了解能看不能玩的DirectX 11.1。
會說能看不能玩,主要還是因為目前微軟並不支援DirectX 11.1,大多猜測會到了Windows 8之後才會搭配新版API。從MSDN(Microsoft Developer Network)提供的資料來看,這次DirectX 11.1跟以往小改版相同,目的不在於增加新技術,大多是除錯與擴展功能。
資料來源:MSDN
目前DirectX 11.1有15項新功能,其中比較值得注意的是子項目DoublePrecisionFloatShaderOps,也就是較常聽到的DP Shader。DP指的是Double Precision,也就是雙精度運算。是微軟在DirectX中首度加入的Shader類型,可在運算當中加入雙精度規則。
先前有提過,雙精度比起單精度運算精確度更高,先前所有Shader運算都是採用FP32也就是單精度運算,應用面來說單精度運算已經足以使用,轉換成雙精度提升的精確度是多餘的。那為什麼要支援雙精度?能想到最直接的例子就是ray tracing(光線追蹤)。
在模擬ray tracing的過程中,必須依靠雙精度運算維持數據的精確性。Ray tracing特色在於物體與光線之間的高度模擬,依照現有的處理精確度,讓物體與光線交互作用數次就會產生不可忽略的誤差,對於交互次數多達數十次的ray tracing只用單精度是絕對不夠的,可能會造成模擬失真,於是只能靠雙精度技術加強。
關鍵字:Ray Tracing(光線追蹤)
▲光線追蹤是幾何光學的技術,主要是計算光線碰到物體時的折射與反射,由於物體與物體、物體與光線、光線與光線之間都會互相影響,因此運算的數據量十分龐大。高階顯卡跑起來可能都不太夠力,且未來加入雙精度運算,雖精確度提升但是效能可能還要打折扣。圖中的車輛即是用光線追蹤模擬出來,板金上的光影十分逼真。
傳 AMD 將於12月5日發表新 GPU:Radeon HD 7000
AMD HD 7970 之 GCN 架構完全解析,帶來 GPU 革命
新卡王 Radeon HD 7970 實測:效能強大,驅動有待完善