完全看懂 HD 7970 新架構,GPU 如何跑出更高的效能?

魯蛇實驗室

這次我們取得 HD 7970,除了一般性效能測試以外,還要測試所謂第一張「PCI-E 3.0」顯卡有什麼能耐。而針對 GCN 架構,我們精心繪製了指令運作圖,讓大家了解 GPU 在多個 Wavefront 下,如何動態調度指令讓效率更高,也能看出 VLIW 4 跟 GCN 架構的差異。

快速瀏覽: 

效率不彰的VLIW

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,但是架構設計上還是有缺憾。

4D架構還不夠好

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架構。

GCN:圖形就是運算

理論上的最有效率不一定會印證在實際表現上,受到驅動程式與環境等限制,通常無法達到理論水準。更重要的是,以往VLIW 4或VLIW 5,在GPGPU(General-Purpose Computing on Graphics Processing Units,通用繪圖處理器)應用方面並不出色。

相對地,NVIDIA於GF 100使用的Fermi架構,對通用運算相當有力,讓這個領域的差距更為明顯,也興起AMD改變架構的想法。早在去年AMD公佈GCN架構時,就已經喊出「圖形就是運算,運算就是圖形」的口號,透過架構升級,讓GCN能兼具圖形與通用運算。

VLIW 4/5架構對比圖

(點小圖看大圖)
▲為了看出前後代差異,又得把這2張老圖拿出來。VLIW 5具備用於特殊運算的T unit(圖中體積較大者),而VLIW 4雖然看似精簡,但是每個ALU都能達到T unit的運算效能,因此表現會更好。而換架構也不是沒有缺點,即便ALU數量差不多,但是發射口與branch unit等元件增加,電晶體數量更多,不只拉高成本,功耗也跟著提升。HD 5870官方耗電量為188W,而HD 6970則是250W。

新增ECC校正

通用運算要強,除了架構支持,還得靠記憶體配合。首先是增加ECC(Error Checking and Correcting,錯誤檢查及校正)功能,可強化現有的EDC(Error Detection and Correction,錯誤檢測及校正)機制。

這2項設計都是為了保證高速GDDR5記憶體與系統記憶體資料交換的準確性, NVIDIA早在GF 110時就已經具備ECC機制,而AMD到Cayman之前只有EDC而沒有ECC。

FP64納入架構標準

此外,針對精確度,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就好了

或許有人會說,那全都砍掉做成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:驅動成本高

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:硬體成本高

NVIDIA則是先設計完整的硬體架構,指令分配、運算都由硬體負責,驅動程式的重要性就不如AMD,可節省驅動程式的開發費用。化整為零的方式,運算上較為單純,但是設計上較為複雜,算是一勞永逸的設計方式。

從過去同時期的核心來看,AMD的特色就是ALU數量多,但是跑的慢。代表的例子就是R600有320個ALU,時脈卻只有743MHz。NVIDIA的特色就是CUDA Core數量少,但是跑的快。代表核心G80只有128個CUDA Core,不過Shader時脈就有1.35GHz,可看出兩者設計上的差異。

Cayman與Fermi,數大不是美?

(點小圖看大圖)
▲在GCN出現之前,Cayman與Fermi的基本運算核心不太相同,Cayman是以SIMD陣列為主,而Fermi則是以SM或是GPC為單位。同陣營顯卡中,若SIMD越多,或GPC、SM數量越多,通常就是效能的保證。但不同陣營的架構不同,比較兩者的ALU或CUDA Core是沒有意義的行為。

GPU成長趨緩

AMDNVIDIA的設計架構之間沒有絕對的優劣,各有擅長的領域跟成本考量。不過以架構的壽命來說,或許是擴增相對容易,AMD使用VLIW體系非常久,直到今日才大改成GCN,而NVIDIA在GT200後就改為Fermi架構,與最初G80的設計又大為不同。從架構的使用壽命來看,不難看出簡化硬體架構所帶來的設計優勢。雖然設計相對容易,但是要達到革命性的效能,還得要後期驅動程式配合,這也是AMD的弱項。近幾個世代,不論AMD或NVIDIA都沒有早期「半年架構一更新,核心效能倍增」的理想曲線,若要大幅提升效能,只強化既有架構是不夠的。


▲AMD這次不只架構改進,另外也將核心製程從40nm提升為28nm。顯而易見的好處就是耗電量、溫度更低,且超頻性表現也更好。

(下一頁:GCN:混血新架構)

延伸閱讀:

AMD HD 7970 之 GCN 架構完全解析,帶來 GPU 革命

GCN:混血新架構

沒有什麼架構可以用一輩子,遲早得面對效能不彰、擴增不易的問題,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架構運作時,指令執行過程只能依照既有的順序進行運算,若有額外加入或是相關性指令,都只能僵化地依照順序執行,無法動態調整以提高效率。

CU是基本運算區塊

為了改善編譯器問題,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也能透過更改優先順序提高運算效率。

沒有40個CU的Tahiti


▲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沒有遮蔽任何元件。或許是天生神力,加上良率穩定且設計出色,才沒有遮蔽的需要。

(下一頁:圖解編譯器指令集排程)

圖解編譯器指令集排程

編譯器Wavefront時程序列

假設有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

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個週期。

Compute Unit

透過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:率先使用新規格)

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虛擬記憶體技術,讓複雜程度再上一層。

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,是系統記憶體的數倍,有助於通用運算與少部分遊戲。 

DX 11.1能看不能玩

除了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跟以往小改版相同,目的不在於增加新技術,大多是除錯與擴展功能。

DirectX 11.1新功能

  1. Shader tracing
  2. Direct3D device sharing
  3. Check support of new Direct3D 11.1 features and formats
  4. Create larger constant buffers than a shader can access
  5. Use logical operations in a render target
  6. Force the sample count to create a rasterizer state
  7. Process video resources with shaders
  8. Change subresources with new copy options
  9. Discard resources and resource views
  10. Support a larger number of UAVs
  11. Bind a subrange of a constant buffer to a shader
  12. Retrieve the subrange of a constant buffer that is bound to a shader
  13. Clear all or part of a resource view
  14. Map SRVs of dynamic buffers with NO_OVERWRITE
  15. Use UAVs at every pipeline stage

資料來源: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 實測:效能強大,驅動有待完善

原文網址:https://t17.techbang.com/topics/12919-fully-understand-hd-7970-new-structure-how-to-run-gpu-higher-efficiency?page=1