圖形與計算那些事 AMD次世代架構解析
泡泡網顯卡頻道1月6日 作為顯卡來說,AMD的Radeon自HD4000時代以來為游戲玩家提供了眾多優(yōu)秀的產品,HD5000/HD6000系列絲毫不輸給NVIDIA同級產品,性能、功能、價格、功耗等各方面表現(xiàn)得都很不錯。對于AMD下代HD7000系列,我們毫不懷疑它在3D游戲中會有更出色的表現(xiàn)。
但作為GPU來說,AMD的產品顯然要遜色很多,不支持物理加速、Stream通用計算性能不如CUDA,支持GPU加速的軟件也屈指可數(shù),這已經成為AMD最大的軟肋,并且成了NVIDIA和NFan們攻擊的對象。

隨著時間的推移,保守的AMD終于嘗到了固步自封的苦果:當NVIDIA的CUDA計算課程進入高校學堂、Tesla殺進超級計算市場、Quadro拿下95%的專業(yè)卡市場份額之時,AMD的Radeon還只能游弋在3D游戲領域,苦守來之不易的半壁江山。
想當年AMD率先提出GPU通用計算的概念,但最終卻在NVIDIA的CUDA手中發(fā)揚光大。很多人以為這是AMD收購ATI后自顧不暇的關系,其實根本原因還在于GPU的架構——傳統(tǒng)基于3D圖形處理的GPU不適合于進行大規(guī)模并行計算,AMD的GPU擁有恐怖的理論運算能力卻無從釋放。而NVIDIA則從G80時代完成了華麗的轉身,逐步完善了硬件和軟件的協(xié)同工作,使得GPU成為高性能計算必不可少的配件。
俗話說的好:苦海無涯、回頭是岸,亡羊補牢、為時不晚。AMD終于在代號為Southern Islands(南方群島)的新一代GPU中,啟用的全新的架構,AMD稱之為“Graphics Core Next”(GCN,次世代圖形核心),并冠以革命性的稱號。這是AMD收購ATI之后的近5年來第一次對GPU架構進行“傷筋動骨”的“手術”,而架構調整的核心內容則是為并行計算優(yōu)化設計。
那AMD的“次世代圖形核心”相比沿用了五年之久的架構到底有何改進?其并行計算性能相比對手NVIDIA有無優(yōu)勢?3D游戲性能會否受到影響呢?本文將為大家做一個全方位的解析,文中會穿插一些3D渲染原理以及顯卡基礎知識,并談談GPU圖形與計算的那些事兒……
微軟的DirectX 9.0C是一個神奇的圖形API,自2004年首款DX9C顯卡GeForce 6800 Ultra問世以來,至今已有將近8年時間,之后雖然微軟發(fā)布了DX10、DX10.1、DX11、還有現(xiàn)在的DX11.1等多個新版本,但DX9C游戲依然是絕對主流,DX10以后的游戲全部加起來也不過幾十款而已!
因此,當年的DX9C顯卡之戰(zhàn),很大程度上決定了此后很多年的顯卡研發(fā)策略。從最開始X800不支持DX9C對抗6800失利,到X1800支持DX9C卻性能不濟,再到X1900登上頂峰,還有半路殺出來XBOX360這個程咬金,ATI被AMD收購前的經歷猶如過山車般驚險刺激!
DXC如此長壽的原因,相信游戲玩家們已經猜到了,那就是游戲主機太長壽了——微軟XBOX360以及后來索尼PS3使用的GPU都是DX9C時代的產品。游戲開發(fā)商的主要盈利來源在主機平臺,所以根本沒心思把PC游戲做好,尤其對提高PC游戲的畫面及引擎優(yōu)化提不起興趣,個別以高畫質而著稱的PC游戲倍受打擊,很多DX10游戲續(xù)作倒退到DX9C就是很好的證明。
可以說,這么多年來PC 3D游戲圖形產業(yè)的發(fā)展,成也微軟、敗也微軟。
XBOX360的GPU——Xenos,由ATI設計

Xenos的核心架構圖
微軟XBOX360的成功,給GPU供應商ATI發(fā)出了一個信號,那就是今后N年內的游戲都將基于XBOX360的硬件而開發(fā)。當時ATI與Xenos同時研發(fā)的一顆GPU代號為R580,倆者擁有相似的架構,而R580在當年也成為DX9C顯卡的王者,這就讓ATI更加堅定了維持現(xiàn)有架構不變的決心。
下面我們就來看看R580的核心架構,也就是當年的王者X1900XTX/X1950XTX所使用的GPU,后來次高端RV570核心(X1950Pro)的架構也類似。
R580:8個頂點著色單元、48個像素著色單元、16個紋理單元
DX9C顯卡還沒有統(tǒng)一渲染架構的概念(XBOX360的Xenos是個特例),所以R580依然是頂點與像素分離式的設計。當時的GPU核心部分被稱為管線,比如7800GTX擁有24條像素渲染管線,但X1900XTX卻不能稱為擁有48條像素渲染管線,因為它的像素與紋理單元數(shù)量不對等。
GPU的工作原理:
顯卡的渲染流程是通過頂點單元構建模型骨架,紋理單元處理紋理貼圖,像素單元處理光影特效,光柵單元負責最終的像素輸出。
GPU的管線是什么:
在R580之前,GPU的像素單元與紋理單元還有光柵單元是綁定在一起的,數(shù)量一樣多,整個渲染過程就是流水線作業(yè),因此像素與紋理加起來稱為一條管線。
什么是3:1架構?
R520核心(X1800XT)的像素與紋理都是16個,但R580核心在紋理單元維持16個不變的情況下,把像素單元擴充了3倍達到了48個之多。ATI研發(fā)工程師發(fā)現(xiàn)新一代游戲中使用像素著色單元的頻率越來越高,各種光影特效(尤其HDR)吃掉了像素著色單元的所有資源,而紋理單元的負載并不高,繼續(xù)維持像素與紋理1:1的設計就是浪費資源,于是ATI根據(jù)3D游戲引擎的發(fā)展趨勢做出了改變,并把R580這種不對等的架構稱之為3:1黃金架構,管線的概念至此消失。
像素(算數(shù))與紋理的比例逐年提高
當年ATI前瞻性的架構在部分新游戲中得到了應驗,比如在優(yōu)品飛車10、細胞分裂4、上古卷軸4等游戲中X1900XTX的性能遠勝7900GTX。此外ATI專為HDR+AA優(yōu)化的架構與驅動也讓ATI風光無限。
但事實上,從1:1大躍進到3:1有點太激進了,在包括新游戲在內的絕大多數(shù)主流游戲中,都無法充分利用多達48個像素著色單元的能力。于是ATI的工程師們又有了新的想法:何不用這些像素單元來做一些非圖形渲染的計算呢?像素單元的核心其實就是ALU(算術邏輯單元),擁有十分可觀的浮點運算能力。
蛋白質折疊分布式計算開啟GPU計算大門:
2006年9月,在X1900XTX發(fā)布半年之后,ATI與斯坦福大學相關科研人員合作,開發(fā)了首款使用GPU浮點運算能力做非圖形渲染的軟件——Folding @ Home第一代GPU運算客戶端。
Folding@home是一個研究蛋白質折疊、誤折、聚合及由此引起的相關疾病的分布式計算工程。最開始F@H僅支持CPU,后來加入了對PS3游戲機的支持,但同樣是使用內置的CELL處理器做運算。F@H因ATI的加入為GPU計算翻開了新的一頁,當然F@H加入了對NVIDIA DX10 GPU的支持那是后話。
什么是通用計算?
當時的GPU計算被稱為GPGPU(General Purpose GPU),傳統(tǒng)的圖形處理器可以被用來做通用目的計算項目。所謂通用計算的大體流程就是:待處理的數(shù)據(jù)—〉轉換成圖形數(shù)據(jù)—〉GPU處理—〉處理后的圖形數(shù)據(jù)—〉轉換成所需數(shù)據(jù)。其實通用計算就是把數(shù)據(jù)轉換為GPU能夠“看懂”的圖形數(shù)據(jù),實際上是作為虛擬硬件層與GPU通訊,由于需要前后兩次編譯的過程,因此想要利用GPU強大的浮點運算能力,需要很強大的編譯器,程序員的開發(fā)難度可想而知,CPU的運算量也比較大。
除了蛋白質折疊分布式計算外,當年ATI還開發(fā)了AVIVO Video Converter這款使用GPU加速視頻轉碼的小工具,雖然效果一般,但也算是開了個好頭。
雖然GPU通用計算的實現(xiàn)難度很大,但至少GPU實現(xiàn)了非圖形計算的目的,而且其性能確實要比當時的CPU快十幾倍。小有所成的ATI被勝利沖昏了頭腦,他們認為自己研發(fā)出了非常先進的、最有前瞻性的GPU架構,還找到了讓GPU進行通用計算的捷徑、還有了AMD這座靠山……最終促使AMD-ATI做出了保守的決定——下代GPU繼續(xù)沿用R580的架構,不做深層次的改動。
R520->R580的成功,多達48個著色單元功不可沒,這讓ATI對龐大的ALU運算單元深信不疑。ATI認為只要繼續(xù)擴充著色單元,就能滿足新一代DX10及Shader Model 3.0的要求。
著色單元的結構:
在圖形處理中,最常見的像素都是由RGB(紅黃藍)三種顏色構成的,加上它們共有的信息說明(Alpha),總共是4個通道。而頂點數(shù)據(jù)一般是由XYZW四個坐標構成,這樣也是4個通道。在3D圖形進行渲染時,其實就是改變RGBA四個通道或者XYZW四個坐標的數(shù)值。為了一次性處理1個完整的像素渲染或幾何轉換,GPU的像素著色單元和頂點著色單元從一開始就被設計成為同時具備4次運算能力的運算器(ALU)。

數(shù)據(jù)的基本單元是Scalar(標量),就是指一個單獨的值,GPU的ALU進行一次這種變量操作,被稱做1D標量。由于傳統(tǒng)GPU的ALU在一個時鐘周期可以同時執(zhí)行4次這樣的并行運算,所以ALU的操作被稱做4D Vector(矢量)操作。一個矢量就是N個標量,一般來說絕大多數(shù)圖形指令中N=4。所以,GPU的ALU指令發(fā)射端只有一個,但卻可以同時運算4個通道的數(shù)據(jù),這就是SIMD(Single Instruction Multiple Data,單指令多數(shù)據(jù)流)架構。
R580的Shader單元結構
顯然,SIMD架構能夠有效提升GPU的矢量處理性能,由于VS和PS的絕大部分運算都是4D Vector,它只需要一個指令端口就能在單周期內完成4倍運算量,效率達到100%。但是4D SIMD架構一旦遇到1D標量指令時,效率就會下降到原來的1/4,3/4的模塊被完全浪費。為了緩解這個問題,ATI和NVIDIA在進入DX9時代后相繼采用混合型設計,比如R300就采用了3D+1D的架構,允許Co-issue操作(矢量指令和標量指令可以并行執(zhí)行),NV40以后的GPU支持2D+2D和3D+1D兩種模式,雖然很大程度上緩解了標量指令執(zhí)行效率低下的問題,但依然無法最大限度的發(fā)揮ALU運算能力,尤其是一旦遇上分支預測的情況,SIMD在矢量處理方面高效能的優(yōu)勢將會被損失殆盡。
DX10時代,混合型指令以及分支預測的情況更加頻繁,傳統(tǒng)的Shader結構必須做相應的改進以適應需求。NVIDIA的做法是將4D ALU全部打散,使用了MIMD(Multi Instruction Multiple Data,多指令多數(shù)據(jù)流),而AMD則繼續(xù)沿用SIMD架構,但對Shader微架構進行了調整,稱為超標量架構。
R600的5D超標量流處理器架構:
作為ATI的首款DX10 GPU,架構上還是有不少改進的,DX10統(tǒng)一渲染架構的引入,讓傳統(tǒng)的像素渲染單元和頂點渲染單元合二為一,統(tǒng)稱為流處理器。R600總共擁有64個Shader單元,每個Shader內部有5個ALU,這樣總計就是320個流處理器。
R600的Shader單元結構
R600的Shader有了很大幅度的改進,總共擁有5個ALU和1個分支執(zhí)行單元,這個5個ALU都可以執(zhí)行加法和乘加指令,其中1個"胖"的ALU除了乘加外之外還能夠進行一些函數(shù)(SIN、COS、LOG、EXP等)運算,在特殊條件下提高運算效率!
與R580不同的是,R600的ALU可以在動態(tài)流控制的支配下自由的處理任何組合形式的指令,諸如1+1+1+1+1、2+2+1、2+3、4+1等組合形式。所以AMD將R600的Shader架構稱作Superscalar(超標量),完美支持Co-issue(矢量指令和標量指令并行執(zhí)行)。
R600超長指令集的弊端:
從Shader內部結構來看,R600的確是超標量體系,但如果從整個GPU宏觀角度來看,R600依然是SIMD(單指令多數(shù)據(jù)流)的VLIW(超長指令集)體系:5個ALU被捆綁在一個SIMD Shader單元內部,所有的ALU共用一個指令發(fā)射端口,這就意味著Shader必須獲得完整的5D指令包,才能讓內部5個ALU同時運行,一旦獲得的數(shù)據(jù)包少于5條指令,或者存在條件指令,那么R600的執(zhí)行效率就會大打折扣。
例如:指令一:a=b+c;指令二:d=a*e。這兩條指令中,第二條指令中的a必須等待第一條指令的運算結果,出現(xiàn)這樣的情況時候,兩條指令大多數(shù)情況下就不能實現(xiàn)超標量執(zhí)行了。
顯然,想要完整發(fā)揮R600的性能必須滿足苛刻的條件,這個條件不僅對驅動和編譯器提出了額外的要求,而且要求程序必須讓條件指令不存在任何關聯(lián)性,難度可想而知。最終結果就是絕大多數(shù)情況下R600都無法發(fā)揮出的理論性能,而且其執(zhí)行效率會因為復雜指令的增多而不斷下降。
HD2900XT的失敗來自于很多方面,GPU核心架構只是冰山一角,就算保守的AMD沿用了DX9C時代的老架構,性能也不至于如此不濟。但無奈GPU架構已經定型,短期內是無法改變了,HD2000和HD3000一敗涂地,AMD咬牙硬抗了兩年之久。就在大家為R600的架構爭論不休,大談VLIW指令集的弊端有多么嚴重時,AMD終于迎來了翻身之作——RV770核心。
RV770核心:暴力擴充流處理器
RV770相比R600/RV670,核心部分依然沒有任何變化,沿用了之前的Shader單元設計,只是將數(shù)量擴充了2.5倍,流處理器達到了800個之多!
RV670/R600是4組SIMD,每組16個Shader,每個Shader 5個流處理器;RV770是10組SIMD,每組16個Shader,每個Shader 5個流處理器。流處理器部分直接擴充了2.5倍!
雖然對流處理器部分沒有改動,但AMD對流處理器以外的幾乎所有模塊都進行了改進,從而使得性能和效率有了質的提升,具體改動如下:
抗鋸齒算法改變,性能大幅提升
紋理單元和光柵單元部分,和流處理器一樣都是數(shù)量翻了2.5倍,但值得一提的是,抗鋸齒算法已經由R600/RV670的流處理器部分轉移至光柵單元部分,因此RV770的AA效率大幅提高,一舉超越了N卡重現(xiàn)X1000時代的輝煌,這也就是RV770表現(xiàn)令人驚異的主要原因。
在紋理單元與顯存控制器之間設有一級緩存,RV770核心相比RV670,L1 TC容量翻倍,再加上數(shù)量同比增加2.5倍,因此RV770的總L1容量達到了RV670/R600的五倍之多!
放棄環(huán)形顯存總線,改用交叉總線
RV770還放棄了使用多年的環(huán)形顯存總線,估計是因為高頻率下數(shù)據(jù)存取命中率的問題,回歸了交叉總線設計,有效提高了顯存利用率,并節(jié)約了顯存帶寬。還有GDDR5顯存的首次使用,瞬間將顯存位寬翻倍,256Bit GDDR5的帶寬達到了當時N卡512Bit GDDR3的水平。
總的來說,雖然流處理器部分沒有做改動,但RV770的非核心架構部分有了很大的改良,上代產品許多設計失誤得到了糾正,在流處理器數(shù)量暴增運算能力大大加強的情況下,消除了功能模塊的瓶頸,從而使得性能有了大幅改進。
VLIW并未降低3D效率,只是妨礙了GPU計算
HD4870/HD4850打了一場漂亮的翻身仗,也讓唱衰VLIW的人看傻了眼,之前大家普遍認為R600/RV670失敗的主要原因是VLIW的低下效率,事實證明VLIW并沒有錯,其效率問題并沒有嚴重到失控的地步,畢竟DX9C游戲還是主流,頂點與像素操作指令還是大頭。AMD只是錯誤的判斷了抗鋸齒的算法和效率,導致第一代DX10 GPU性能不如預期。
但最關鍵的問題不在3D游戲性能方面,AMD對GPU并行計算依然沒有投入足夠多的重視,AMD一方面在鼓吹自家Stream通用計算并不輸給CUDA,各種商業(yè)軟件未來將會加入支持,另一方面GPU架構未做任何調整,API編程接口支持也舉步維艱。結果就是Stream軟件無論數(shù)量、質量、性能還是發(fā)布時間都要遠遠落后于CUDA軟件。
R600的失敗讓AMD明白了一個道理:從哪跌倒要從哪爬起來;RV770的成功讓AMD堅信:我們的架構是沒有問題的,以前的失敗只是一個小小的失誤,R600的架構前途無量,應該加快腳步往前沖……于是乎RV870誕生了。
如果說RV770是翻身之作,那么RV870(Cypress)就是反攻之作,AMD搶先推出DX11顯卡,在NVIDIA GF100陷入大核心低良率的泥潭時,大舉收復失地。
RV870是AMD近年來最成功的一顆GPU核心,但它的成功是拜NVIDIA的失誤所賜,RV870核心本身可以說是毫無新意,因為它完全就是RV770的兩倍規(guī)格,除了顯存控制器以外的所有模塊統(tǒng)統(tǒng)翻倍,AMD沿用RV770暴力擴充流處理器的路線,繼續(xù)提高運算能力,搶灘登陸DX11。
RV870核心架構圖
把RV870與RV770的架構圖放一起的話,可以發(fā)現(xiàn)其外圍周邊模塊幾乎完全相同,而流處理器部分是一分為二的設計,其中的一半正好就是RV770的規(guī)格。
除了加入DX11、ShaderModel 5.0的支持,賦予Eyefinity 6屏輸出的功能外,RV870與RV770相比并沒有本質改進。
既然流處理器部分還是維持R600的設計,那就不用期待它在并行計算方面能有什么改進。AMD依然我行我素的在搞通用計算,支持的軟件還是那么幾款。RV870理論浮點運算能力再創(chuàng)新高,但卻沒什么人用,中國最強的超級計算機天河一號曾經使用的是HD4870X2,但后來升級成天河一號A之后改用了NVIDIA的Tesla,就是活生生的例子。
也許有人會問,如此暴力的擴充流處理器規(guī)模而不更改架構,R600架構會成為AMD的常青樹嗎?難道不會有什么瓶頸嗎?當然會有,AMD也發(fā)現(xiàn)了,所以從HD6000系列開始又進行了一輪架構的微調,透過AMD架構微調這一結果,我們可以了解出現(xiàn)問題原因到底是什么?
HD6870的一小步:兩個超線程分配處理器
Barts核心的HD6870率先問世,這顆核心定位中端,所以流處理器從Cypress的1600個精簡到了1120個,流處理器結構依然沒有任何變化,但是前端控制模塊一分為二:
相信大家應該注意到了,以往AMD的SIMD架構則是整顆GPU共享單一的控制單元,自R600以來都是如此。
Cypress的單一圖形裝配引擎
但隨著晶體管規(guī)模和流處理器數(shù)量的迅速膨脹,單一的控制單元已經無法滿足大規(guī)模并行指令分配的需要,因此從Cypress開始,AMD采用了“雙核心”的設計,將SIMD陣列一分為二,也就是類似于NVIDIA GPC的設計。與此相對應的,圖形裝配引擎雖然只有一個,內部卻設計了兩個Hierarchical Z(分層消影器)和Rasterizer(光柵器),但是其它的特殊功能模塊均只有一個。
Barts和Cypress一樣,依然保持了雙核心設計,圖形引擎也只有一個,內部的功能模塊并沒有太多變化。但是Ultra-Treaded Dispatch Processor(超線程分配處理器)卻變成了兩個,相對應的,超線程分配處理器的指令緩存也變成了兩份。
Barts的圖形裝配引擎
我們知道,Barts的流處理器數(shù)量是Cypress的70%,按理說線程分配壓力有所下降,那么設計兩個線程分配處理器的目的只有一個,那就是提升效率。在DX11時代,幾何著色再加上曲面細分單元引入之后,圖形裝配引擎會產生更多的并行線程及指令轉交SIMD進行處理,因此指令派發(fā)效率成為了新的瓶頸。
SIMD架構的優(yōu)勢就是可以用較少的晶體管制造成龐大的流處理器規(guī)模,擁有恐怖的理論運算能力;但缺點就是流處理器執(zhí)行效率比MIMD架構低,其效率高低完全依賴于分配單元的派發(fā)效率。因此Barts這種雙線程分配處理器的設計意義重大。
雙超線程分配處理器的意義:曲面細分性能翻倍
HD6000系列可以說是半代改進的架構,既然數(shù)量上維持不變,就只能從改進效率的方面考慮了。而改進的內容就是加強線程管理和緩沖,也就是“雙倍的超線程分配處理器和指令緩存”。
根據(jù)AMD官方提供的數(shù)據(jù)來看,HD6870的曲面細分性能最多可達HD5870的兩倍,這種情況出現(xiàn)在10級左右的中等細分程度,當曲面細分達到20級以上的時候,那么它們的性能就基本上沒有區(qū)別了。
由此可見,Barts核心當中的Tessellator單元本身在性能方面應該沒有改進,其性能提升主要源于兩顆超線程分配處理器。中等級別的曲面細分在指令分配方面是瓶頸,Barts改進的架構消除了這一瓶頸,所以性能提升十分顯著,但如果細分級別特別高時,Tessellator本身的運算能力將成為瓶頸,此時線程派遣器的效率再高,也無濟于事。
看起來,AMD迫切的想要改進指令派發(fā)效率,以滿足龐大規(guī)模流處理器的胃口,并且有效的提升備受詬病的曲面細分性能。AMD的做法就是繼續(xù)保持現(xiàn)有架構不變,發(fā)現(xiàn)瓶頸/缺陷然后消除瓶頸/缺陷,這讓筆者想起了一段老話:“新三年舊三年,縫縫補補又三年”。
相信有些讀者很早就想問這樣一個問題了:既然圖形渲染的主要指令是4D矢量格式,那為什么R600要設計成5D的流處理器結構呢?還沿用了5代之久?有結果就有原因,通過對Cayman核心的分析,我們可以找到答案。
R600為什么是5D VLIW結構?
在5D VLIW流處理器中,其中的1個比較“胖”的ALU有別于其它4個對等的ALU,它負責執(zhí)行特殊功能(例如三角函數(shù))。而另外4個ALU可以執(zhí)行普通的加、乘、乘加或融合指令。

Barts核心的流處理器結構
從R600開始的Shader是4D+1D的非對等設計,ATI這樣做的目的是為了讓頂點著色器更有效率,以便能同時處理一個4D矢量點積(比如w、x、y、z)和一個標量分量(比如光照)。
Cayman核心返璞歸真,改用4D結構
隨著DX10及DX11大行其道,AMD通過自己長期內部測試發(fā)現(xiàn),VLIW5架構的五個處理槽中平均只能用到3.4個,也就是在游戲里會有1.6個白白浪費了。顯然,DX9下非常理想的VLIW5設計已經過時,它太寬了,必須縮短流處理器單元(SPU),重新設計里邊的流處理器(SP)布局。
Cayman核心的流處理器結構
于是Cayman核心誕生了,胖ALU下崗,只保留了剩下4個對等的全功能ALU。裁員歸裁員,原來胖ALU的工作還得有人干,Cayman的4D架構在執(zhí)行特殊功能指令時,需要占用3個ALU同時運算。
5D改4D之后最大的改進就是,去掉了體積最大的ALU,原本屬于它的晶體管可以用來安放更多的SIMD引擎,據(jù)AMD官方稱流處理器單元的性能/面積比可以提升10%。而且現(xiàn)在是4個ALU共享1個指令發(fā)射端口,指令派發(fā)壓力驟減,執(zhí)行效率提升。雙精度浮點運算能力也從原來單精度的1/5提高到了1/4。
效率更進一步:雙圖形引擎
前面介紹過,從RV770到Cypress核心,圖形引擎和超線程分配處理器都只有一個,但圖形引擎內部的Hierarchical Z(分層消影器)和Rasterizer(光柵器)分為兩份。
到了Barts核心,超線程分配處理器從一個變成兩個。現(xiàn)在的Cayman核心則更進一步,圖形引擎也變成了兩個,也就是除了分層消影器和光柵器外,幾何著色指令分配器、頂點著色指令分配器、還有曲面細分單元都變成了兩份:
兩個曲面細分單元再加上兩個超線程分配處理器,AMD官方稱HD6970的曲面細分性能可以達到HD6870的兩倍、HD5870的三倍。其它方面比如頂點著色、幾何著色性能都會有顯著的提升。
通用計算效能也有改進
和Cypress、Barts相比,Cayman在通用計算方面也有一定程度的改進,主要體現(xiàn)在具備了一定程度的多路并行執(zhí)行能力;雙路DMA引擎可以同時透過外部總線和本地顯存讀寫數(shù)據(jù);改進的流控制提高了指令執(zhí)行效率和運算單元浪費;當然雙精度運算能力的提高對于科學計算也大有裨益。
不過,這些改進都是治標不治本,VLIW架構從5D到4D只是一小步,只能一定程度上的提高指令執(zhí)行效率,而無法根治GPU編程困難、復雜指令和條件指令的兼容性問題。總的來說,Cayman核心依然只是單純?yōu)橛螒蚨O計的GPU,AMD把5D改為4D也是基于提升3D渲染性能的考慮。
AMD的GPU架構介紹了這么多,對于其優(yōu)缺點也心知肚明了,之前筆者反復提到了“效率”二字,其參照物當然就是NVIDIA的GPU,現(xiàn)在我們就來看看NVIDIA的GPU架構有什么特點,效率為什么會比較高?為什么更適合并行計算?
SIMD效率不高的根本原因
無論AMD怎么調整架構,5D還是4D的結構都還是SIMD,也就是這4-5個ALU要共用一個指令發(fā)射端口,這樣就對GPU指令派發(fā)器提出了很高的要求:如果沒有把4-5個指令打包好發(fā)送到過來,那么運算單元就不會全速運行;如果發(fā)送過來的4-5個指令當中包含條件指令,但運行效率就會降至連50%都不到,造成災難性的資源浪費。
解決方法也不是沒有,但都治標不治本,需要對游戲/程序本身進行優(yōu)化,盡量避免使用標量指令、條件指令和混合指令,驅動為程序專門做優(yōu)化,難度可想而知。
而治本的方法就是拋棄SIMD架構,從源頭上解決指令組合預分配的問題。
G80革命性的MIMD架構
NVIDIA的科學家對圖形指令結構進行了深入研究,它們發(fā)現(xiàn)標量數(shù)據(jù)流所占比例正在逐年提升,如果渲染單元還是堅持SIMD設計會讓效率下降。為此NVIDIA在G80中做出大膽變革:流處理器不再針對矢量設計,而是統(tǒng)統(tǒng)改成了標量ALU單元,這種架構叫做MIMD(Multiple Instruction Multiple Data,多指令多數(shù)據(jù)流)
G80核心架構,每個流處理器就是一個標量ALU
如此一來,對于依然占據(jù)主流的4D矢量操作來說,G80需要讓1個流處理器在4個周期內才能完成,或者是調動4個流處理器在1個周期內完成,那么G80的執(zhí)行效率豈不是很低?沒錯,所以NVIDIA大幅提升了流處理器工作頻率(兩倍于核心頻率),擴充了流處理器的規(guī)模(128個),這樣G80的128個標量流處理器的運算能力就基本相當于傳統(tǒng)的64個(128×2?)4D矢量ALU。大家應該知道R600擁有64個5D矢量ALU,最終的性能G80要遠勝R600。
當然這只是在處理4D指令時的情形,隨著圖形畫面越來越復雜,1D、2D、3D指令所占比例正在逐年增多,而G80在遇到這種指令時可說是如魚得水,與4D一樣不會有任何效能損失,指令轉換效率高并且對指令的適應性非常好,這樣G80就將GPU Shader執(zhí)行效率提升到了新的境界!
MIMD架構的劣勢
G80的架構聽起來很完美,但也存在不可忽視的缺點:根據(jù)前面的分析可以得知,4個1D標量ALU和1個4D矢量ALU的運算能力是相當?shù)模乔罢咝枰?個指令發(fā)射端和4個控制單元,而后者只需要1個,如此一來MIMD架構所占用的晶體管數(shù)將遠大于SIMD架構!
所以AMD的SIMD架構可以用較少的晶體管造出龐大數(shù)量的流處理器、擁有恐怖的理論浮點運算能力;而NVIDIA的MIMD架構必須使用更多的晶體管制造出看似比較少的流處理器,理論浮點運算能力相差很遠。雙方走的都是極端路線,AMD以數(shù)量彌補效率的不足,而NVIDIA以效率彌補數(shù)量的劣勢。
G80的MIMD架構開了一個好頭,128個流處理器雖然聽起來雖然沒有AMD 320個那么多,但這些流處理器是可以媲美真正的CPU核心,在執(zhí)行任何指令時都能發(fā)揮出接近理論值的性能,這樣高效率的核心如果只是用來玩游戲豈不太可惜了?
于是在游戲市場大獲全勝的NVIDIA并沒有止步于此,而是將目光放在了更長遠的高性能計算領域,一邊著手開發(fā)基于GPU計算的應用程序中間件,幫助程序員以更高效的方式開發(fā)基于GPU硬件加速的軟件,另一方面在G80的基礎上繼續(xù)優(yōu)化核心架構,將MIMD架構高效率的優(yōu)勢發(fā)揮到極致!
GT200核心:真正的并行計算架構
G80依然只是為DX10 3D渲染而設計的,雖然MIMD架構本身能夠勝任并行數(shù)據(jù)計算的需要,但NVIDIA發(fā)現(xiàn)圖形架構還有繼續(xù)改進的余地,只要在核心內部設計全新的控制模塊,并對微架構進行專門的優(yōu)化,就能將GPU的圖形架構改造成更加適合非圖形領域的并行數(shù)據(jù)處理架構。

第一代統(tǒng)一渲染架構的主要目的是把原本像素著色、頂點著色以及新增的幾何著色,統(tǒng)一交給流處理器來處理。而NVIDIA的GT200核心則被稱為第二代統(tǒng)一渲染架構,其主要含義就是將圖形處理架構和并行計算架構完美的結合起來,成為一顆真正意義上的通用處理器,超越圖形處理器的概念!
GT200相對于G80,不止是把流處理器數(shù)量從128個擴充到240個這么簡單,其實最關鍵之處是對TPC(線程處理器簇)和SM(流處理器簇)的改進:
新增Atomic原子操作:透過原子操作,硬粒化之后的線程操作管理將更加有序和具體,這也就意味著像素或者其他類型如通用計算應用的Thread的生成、仲裁、泵送、內存位置確定和執(zhí)行過程都將變得更加精確和高效,Atomic單元和原子操作的引入也為未來NVIDIA構架最終實現(xiàn)并行化設計起到了關鍵的先導作用。
每個SM可執(zhí)行線程上限提升:G80/G92核心每個SM(即不可拆分的8核心流處理器)最多可執(zhí)行768條線程,而GTX200核心的每個SM提升至1024條,而且GTX200擁有更多的SM,芯片實力達到原來的2.5倍!

每個SM的指令寄存器翻倍:GTX200與G80核心在SM結構上基本相同的,但功能有所提升,在執(zhí)行線程數(shù)增多的同時,NVIDIA還將每個SM中間的Local Memory容量翻倍(從16K到32K)。Local Memory用于存儲SM即將執(zhí)行的上千條指令,容量增大意味著可以存儲更多的指令、超長的指令、或是各種復雜的混合式指令,這對于提高SM的執(zhí)行效能大有裨益。
DX10游戲會越來越多的使用復雜的混合式Shader指令,一旦排隊中的超長指令溢出或者在N個周期內都排不上隊,那么就會造成效率下降的情況,此時雙倍寄存器容量的優(yōu)勢就體現(xiàn)出來了。由于Local Memory并不會消耗太多晶體管,因此將其容量翻倍是很合算的。
紋理單元數(shù)量提升,比率下降,達到了ATI當年鼓吹的3:1水平

其它改進還有:幾何著色性能提升,提高雙指令執(zhí)行(Dual-Issue)效率,達到93%-94%之多,支持雙精度64Bit浮點運算,運算能力為單精度的1/8。
綜合來看,GT200除了流處理器、紋理單元、光柵單元這些硬貨數(shù)量增多對游戲性能大有裨益以外,其它細節(jié)部分的優(yōu)化跟游戲關系不大。因為GT200是為并行計算而設計的,從GT200開始,GPU計算變得更加實用和普及,NVIDIA的Tesla開始進入科學實驗室,并殺進超級計算機市場。
隨著Tesla在高性能計算領域日漸深入人心,NVIDIA也在與科研工作者們進行深入的溝通,傾聽一線用戶的需求,以便在下代GPU核心中做出相應的優(yōu)化改進。當時用戶最大的需求有兩點:第一,科學家和超級計算只看重64bit雙精度浮點運算能力,GT200性能太低,只有單精度的1/8;第二:企業(yè)級用戶對穩(wěn)定性要求更高,傳統(tǒng)的顯卡不支持顯存ECC(錯誤檢查和糾正),計算出錯后效率較低。
這就是下一代GPU的設計目標。而且,這次GF100不僅要滿足并行計算的需求,還要兼顧DX11游戲性能,針對DX11新增的曲面細分、幾何運算做出相應的改進,時間緊、任務重、壓力大。
過于追求完美往往結果就會不完美,NVIDIA在GPU架構設計部分做到了近乎完美,但是在芯片制造端掉了鏈子——由于GPU核心太大,臺積電40nm工藝還不夠成熟,導致GF100核心良率低下,沒能達到設計預期,最終的產品不僅功耗發(fā)熱很大,而且規(guī)格不完整。所以雖然當時GTX480顯卡的評價不是很高,但GF100核心的架構極其優(yōu)秀的。等到工藝成熟之后的GF110核心以及GTX580顯卡,就毫無疑問的站在了游戲與計算的巔峰!
GF100是“四核心”設計:4個光柵化引擎

GF100/110可以看作是四核心設計
如果我們把Cayman看作是雙核心的設計,那GF100就是四核心的設計,它擁有四個GPC(圖形處理器集群)模塊,每個GPC都有各自的光柵化引擎(Raster Engine),而在以往都是整顆GPU共享一個Raster Engine。
GF100擁有16個多形體引擎
GF100與GT200最大的不同其實就是PolyMorph Engine,譯為多形體引擎。每個SM都擁有一個多形體引擎,GF100核心總共有多達16個。那么多形體引擎是干什么用的呢?為什么要設計如此之多?
為什么要這么多的多形體引擎?
之前的GPU架構一直都使用單一的前端控制模塊來獲取、匯集并對三角形實現(xiàn)光柵化。無論GPU有多少個流處理器,這種固定的流水線所實現(xiàn)的性能都是相同的。但應用程序的工作負荷卻是不同的,所以這種流水線通常會導致瓶頸出現(xiàn),流處理器資源未能得到充分利用。
實現(xiàn)光柵化并行處理的同時還要保持API的順序是非常困難的,這種難度阻礙了這一領域的重大創(chuàng)新。雖然單個前端控制單元的設計在過去的GPU中曾有過輝煌的歷史,但是隨著對幾何復雜度的需求不斷增長,它現(xiàn)在已經變成了一個主要障礙。
Tessellation的使用從根本上改變了GPU圖形負荷的平衡,該技術可以將特定幀中的三角形密度增加數(shù)十倍,給設置于光柵化單元等串行工作的資源帶來了巨大壓力。為了保持較高的Tessellation性能,有必要重新平衡圖形流水線。
為了便于實現(xiàn)較高的三角形速率,NVIDIA設計了一種叫做“PolyMorph”的可擴展幾何引擎。每16個PolyMorph引擎均擁有自己專用的頂點拾取單元以及鑲嵌器,從而極大地提升了幾何性能。與之搭配的4個并行光柵化引擎,它們在每個時鐘周期內可設置最多4個三角形。同時,它們還能夠在三角形獲取、Tessellation、以及光柵化等方面實現(xiàn)巨大性能突破。
這是Cayman的圖形引擎,是雙核心設計
AMD的Cayman核心是不分光柵化引擎和多形體引擎的,都可以算作是雙核心設計,GF100與Cayman相比,光柵化引擎是4:1,多形體引擎(包括曲面細分單元)是16:2,GF100的幾何圖形性能有多么強大已經可以想象。
當NVIDIA的工程師通過計算機模擬測試得知幾何引擎將會成為DX11新的瓶頸之后,毫不遲疑的選擇了將單個控制模塊打散,重新設計了多形體引擎和光柵化引擎,并分散至每組SM或每個GPC之中,從而大幅提升了幾何性能,徹底消除了瓶頸。
GF100流處理器部分的改進
每一個CUDA核心都擁有一個完全流水線化的整數(shù)算術邏輯單元(ALU)以及浮點運算單元(FPU)。GF100采用了最新的IEEE754-2008浮點標準,2008標準的主要改進就是支持多種類型的舍入算法。新標準可以只在最終獲取數(shù)據(jù)時進行四舍五入,而以往的標準是每進行一步運算都要四舍五入一次,最后會產生較大的誤差。

GF100能夠為32bit單精度和64bit雙精度運算提供FMA(Fused Multiply-Add,積和熔加)指令,而GT200只在64bit時才能提供。FMA不僅適用于高性能計算領域,事實上在渲染緊密重疊的三角形時,新的FMA算法能夠最大限度的減少渲染誤差。
ATI所有的流處理器在執(zhí)行整數(shù)型加、乘指令時僅支持24bit精度,而NVIDIA CUDA核心支持所有整數(shù)指令全32位精度,符合標準編程語言的基本要求。整數(shù)ALU還經過了優(yōu)化,可有效支持64位以及更高精度的運算,這一點是對手無法比擬的。
GF100擁有雙Warp調度器可選出兩個Warp,從每個Warp發(fā)出一條指令到16個核心、16個載入/存儲單元或4個特殊功能單元。因為Warp是獨立執(zhí)行的,所以GF100的調度器無需檢查指令流內部的依存關系。通過利用這種優(yōu)秀的雙指令執(zhí)行(Dual-issue)模式,GF100能夠實現(xiàn)接近峰值的硬件性能。
GF100首次引入一級緩存與動態(tài)共享緩存
GF100核心擁有很多種類的緩存,他們的用途不盡相同,其中一級緩存、共享緩存和紋理緩存位于SM內部,二級緩存則是獨立的一塊,與光柵單元及顯存控制器相連。
以往的GPU都是沒有一級緩存的,只有一級紋理緩存,因為這些緩存無法在通用計算中用于存儲計算數(shù)據(jù),只能用于在紋理采樣時暫存紋理。而在GF100當中,NVIDIA首次引入真正的一級高速緩存,而且還可被動態(tài)的劃分為共享緩存。
在GF100 GPU中,每個SM除了擁有專用的紋理緩存外,還擁有64KB容量的片上緩存,這部分緩存可配置為16KB的一級緩存+48KB共享緩存,或者是48KB一級緩存+16KB共享緩存。這種劃分方式完全是動態(tài)執(zhí)行的,一個時鐘周期之后可自動根據(jù)任務需要即時切換而不需要程序主動干預。
一級緩存與共享緩存是互補的,共享緩存能夠為明確界定存取數(shù)據(jù)的算法提升存取速度,而一級緩存則能夠為一些不規(guī)則的算法提升存儲器存取速度。在這些不規(guī)則算法中,事先并不知道數(shù)據(jù)地址。
對于圖形渲染來說,重復或者固定的數(shù)據(jù)比較多,因此一般是劃分48KB為共享緩存,當然剩下的16KB一級緩存也不是完全沒用,它可以充當寄存器溢出的緩沖區(qū),讓寄存器能夠實現(xiàn)不俗的性能提升。而在并行計算之中,一級緩存與共享緩存同樣重要,它們可以讓同一個線程塊中的線程能夠互相協(xié)作,從而促進了片上數(shù)據(jù)廣泛的重復利用并減少了片外的通信量。共享存儲器是使許多高性能CUDA應用程序成為可能的重要促成因素。
GF100擁有一個768KB容量統(tǒng)一的二級高速緩存,該緩存可以為所有載入、存儲以及紋理請求提供服務。二級緩存可在整個GPU中提供高效、高速的數(shù)據(jù)共享。物理效果、光線追蹤以及稀疏數(shù)據(jù)結構等事先不知道數(shù)據(jù)地址的算法在硬件高速緩存上的運行優(yōu)勢尤為明顯。后期處理過濾器需要多個SM才能讀取相同的數(shù)據(jù),該過濾器與存儲器之間的距離更短,從而提升了帶寬效率。
統(tǒng)一的共享式緩存比單獨的緩存效率更高。在獨享式緩存設計中,即使同一個緩存被多個指令預訂,它也無法使用其它緩存中未貼圖的部分。高速緩存的利用率將遠低于它的理論帶寬。GF100的統(tǒng)一共享式二級高速緩存可在不同請求之間動態(tài)地平衡負載,從而充分地利用緩存。二級高速緩存取代了之前GPU中的二級紋理緩存、ROP緩存以及片上FIFO。
GF100的緩存架構讓各流水線之間可以高效地通信,減少了顯存讀寫操作
統(tǒng)一的高速緩存還能夠確保存儲器按照程序的順序執(zhí)行存取指令。當讀、寫路徑分離(例如一個只讀紋理路徑以及一個只寫ROP路徑)時,可能會出現(xiàn)先寫后讀的危險。一個統(tǒng)一的讀/寫路徑能夠確保程序的正確運行,同時也是讓NVIDIA GPU能夠支持通用C/C++程序的重要因素。
與只讀的GT200二級緩存相比,GF100的二級高速緩存既能讀又能寫,
而且是完全一致的。NVIDIA采用了一種優(yōu)先算法來清除二級緩存中的數(shù)據(jù),這種算法包含了各種檢查,可幫助確保所需的數(shù)據(jù)能夠駐留在高速緩存當中。
之所以要對NVIDIA的GF100/110核心進行重點介紹,是因為它是一個很好的參照物,接下來要介紹的Tahiti核心很多方面都會與GF100進行對比,看看AMD所謂的GCN(次世代圖形核心)到底有多么先進。
Tahiti的核心架構圖
這是AMD官方公布的Tahiti核心架構圖,第一眼看上去,我們就會發(fā)現(xiàn)他與以往所有的AMD GPU架構有了明顯區(qū)別,無論圖形引擎部分還是流處理器部分都有了天翻地覆的變化,如果沒有右側熟悉的UVD、CrossFire、Eyefinity等功能模塊,很難相信這是一顆AMD的GPU。
先看看最上面的圖形引擎部分
Tahiti的圖形引擎部分
Cayman的圖形引擎部分
這一部分Tahiti幾乎沒有什么變化,依然是雙圖形引擎的設計,幾何著色指令分配器、頂點著色指令分配器、曲面細分單元、光柵器、分層消影器都是雙份的設計。
毫不起眼但意義重大的改進:雙ACE
除此之外,還有一個毫不起眼但是意義重大的改進,那就是在圖形引擎上方加入了兩個ACE(Asynchronous Compute Engine,異步計算引擎),這兩個引擎直接與指令處理器、幾何引擎及全局數(shù)據(jù)緩存相連,作用是管理GPU的任務隊列,將線程分門別類的分發(fā)給流處理器。
ACE將會充當指令處理器的角色用于運算操作,而ACE的主要作用就是接受任務并將其下遣分配給流處理器(主要是分配的過程)。全新架構強化了多任務的并行處理設計,資源分配、上下文切換以及任務優(yōu)先級決策等等。ACE的直接作用就是新架構擁有了一定程度的亂序執(zhí)行能力,雖然嚴格意義上新架構依然是順序執(zhí)行架構,一個完整線程中的指令執(zhí)行順序不能被打亂,但是ACE可以做到對不同的任務進行優(yōu)化和排序,劃分任務執(zhí)行的優(yōu)先級別,進而優(yōu)化資源。從本質上來說,這與很多CPU(比如Atom、ARM A8等等)處理多任務的方式并沒有什么不同。
而且ACE的加入大幅提升了Tahiti的幾何性能,并且使得通用計算時的指令分配更加有序和并行化,緩存使用率和命中率更高。
有針對性的強化曲面細分單元
單從數(shù)量上來看,Tahiti明顯不如GF100的4個光柵化引擎(光柵器+分層消影器)以及8個多形體引擎(幾何/頂點分配器及曲面細分單元等)。不過AMD有針對性的強化了曲面細分單元,通過提高頂點的復用率、增強片外緩存命中率、以及更大參數(shù)高速緩存的配合下,HD7970在所有級別的曲面細分環(huán)境下都可以達到4倍于HD6970的性能:
此前我們介紹過,HD6970的曲面細分性能是HD6870的兩倍、HD5870的三倍。通過AMD的理論數(shù)據(jù)來看,Tahiti的曲面細分性能應該達到甚至超越了GF100/110。
看得出來,AMD的Tahiti在圖形引擎方面依然沿用Cayman的設計,從Cypress到Barts再到Cayman,AMD穩(wěn)扎穩(wěn)打的對圖形引擎進行優(yōu)化與改進,AMD認為現(xiàn)有的雙圖形引擎設計足以滿足流處理器的需要,因此只對備受詬病的曲面細分模塊進行了改良,如此有針對性的設計算是亡羊補牢、為時不晚。
看了上頁圖形引擎部分的介紹,很多人可能會失望——基本沒動嘛,還說什么次世代圖形核心?別著急,好戲在后頭。我們知道AMD歷代GPU的瓶頸除了曲面細分以外,其實最重要的是5D/4D VLIW架構的效率問題。現(xiàn)在Tahiti的GCN架構就是要解決這個問題,它的流處理器結構已經面目全非了。
Tahiti徹底拋棄VLIW架構
通過Tahiti的整體架構圖我們看到,傳統(tǒng)的SIMD流處理器陣列消失了,取而代之的是GCN陣列,Tahiti總計擁有2048個流處理器,這樣每個GCN陣列里面擁有64個流處理器。現(xiàn)在來看看GCN陣列的微觀結構。
GCN與GF100的SM何其相似
Tahiti的GCN陣列微觀結構
GCN陣列里有4組SIMD單元,每組SIMD單元里面包括16個流處理器、或者說是標量運算器。GCN架構已經完全拋棄了此前5D/4D流處理器VLIW超長指令架構的限制,不存在5D/4D指令打包-派發(fā)-解包的問題,所有流處理器以16個為一組SIMD陣列完成指令調度。簡單來說,以往是指令集并行,而現(xiàn)在是線程級并行。
GF100的SM(流處理器簇)微觀結構
可以這么理解,一個GCN陣列與GF100當中的一組SM相當,GF100的一組SM當中有4組共計32個流處理器,而Tahiti的一組GCN當中有4組共計64個流處理器。
緩存部分
每個SIMD-16單元都擁有64KB向量寄存器
每組GCN陣列擁有64KB的本地數(shù)據(jù)共享緩存,還有16KB的一級緩存
每組GCN陣列有一個標量運算單元,用于執(zhí)行整數(shù)指令、媒體指令和浮點原子操作,這個標量運算單元擁有自己的4KB寄存器
而GF100的緩存設計得更加靈活,每組SM里面擁有總計64KB的共享緩存+一級緩存,這64KB緩存可以根據(jù)實際運算量來動態(tài)調整,如果把16KB分配給一級緩存的話,那剩下的48KB就是共享緩存,反之亦然。
一般來說,進行圖形渲染時需要共享緩存比較多,而并行計算時則會用到更多的一級緩存。GF100這種靈活的緩存分配機制更適合做并行計算,而GCN架構更大的共享緩存會有更好的圖形渲染性能,并行計算則會稍遜一籌。
更多的線程調度
從緩存部分的設計來看,雖然GCN擁有更大的緩存容量,但在并行計算領域經營多年的NVIDIA顯然要棋高一手。
從線程級別來看,GCN與SM是不可分割的最小單元,GCN一次可以執(zhí)行64個線程,而SM是48個(其實就是流處理器的數(shù)量)。
從多線程執(zhí)行上來看,GCN可以同時執(zhí)行4個硬件線程,而SM是雙線程調度器的設計(參見架構圖)。
如此來看,GCN架構的多線程性能會更好一些。
小結:AMD GCN抄襲NVIDIA SM架構?
在流處理器部分,終于不用費勁的把AMD和NVIDIA GPU架構分開介紹了,因為GCN與SM已經沒有本質區(qū)別。剩下的只是緩存容量、流處理器簇的數(shù)量、線程調度機制的問題,雙方根據(jù)實際應用自然會有不同的判斷,自家的前后兩代產品也會對這些數(shù)量和排列組合進行微調。
AMD向NVIDIA的架構靠攏,證明了他這么多年來確實是在錯誤的道路上越走越遠,還好浪子回頭金不換,這次GCN架構簡直就是大躍進!
在流處理器部分,我們看到Tahiti與GF100如此相似,那么接下來看到緩存設計時,您可能會要驚呼了……看圖說話:
Tahiti的緩存結構
Tahiti與GF100緩存的相同之處
先說最直觀的,Tahiti有一個容量為768KB二級緩存,這個容量與GF100的L2完全相同,都可以進行讀寫操作。
上頁說過,Tahiti的每組GCN陣列擁有16KB的一級緩存,GF100的SM里面也有16KB的一級緩存;每組GCN擁有64KB的本地數(shù)據(jù)共享緩存,GF100的每組SM擁有48KB。
Tahiti總共擁有32個GCN陣列,所以一級緩存共有512KB,而GF100擁有16個SM陣列,一級緩存共有256KB。但別忘了GF100的L1可以是48KB,這樣總共就是768KB了。
Tahiti與GF100緩存的不同之處
雖然Tahiti的緩存層級設定與GF100非常相似,但區(qū)別也是有的:
Tahiti的每組GCN需要將16KB一級緩存當作紋理緩存使用,而GF100的每組SM當中設有專用的12KB紋理緩存;
一般來說非圖形渲染不需要用到紋理緩存,而圖形渲染時又不會用到一級緩存,所以Tahiti將一級緩存與紋理緩存合并的設計更優(yōu);但NVIDIA專門設計紋理緩存也不是沒有道理,當GPU既渲染圖形又要做計算時,分離式設計的效率會更高,比如PhysX游戲……A卡不支持所以AMD不會考慮這種情況。
Tahiti整個GPU擁有一個32KB的全局數(shù)據(jù)共享緩存,這個是沿用了Cayman的設計,但容量減半了,而GF100沒有這種緩存。全局數(shù)據(jù)共享緩存主要用于不同GCN陣列間線程的數(shù)據(jù)交換,這塊緩存只對編譯器可見,所以使用率較低,容量減半相信也是處于這個原因。
最核心的流處理器和緩存部分介紹完畢,剩下的功能模塊就簡單了:
AMD頭一次使用384bit顯存控制器
我們先來回顧一下顯存控制器的發(fā)展史:
NVIDIA:G80(384bit)-G92(256bit)-GT200(512bit)-GF100(384bit)
AMD:R600(512bit)-RV670(256bit)-RV770(256bit)-Cypress(256bit)-Cayman(256bit)
NVIDIA使用過兩次384bit顯存控制器,而AMD自R600 512bit兵敗之后一直堅守256bit的設計,這次Tahiti是頭一次使用384bit這種折衷的位寬。
AMD作為GDDR5顯存標準的制定者之一,對于顯存特性吃得比較透,因此同樣的顯存顆粒,A卡的顯存頻率一直都遠高于N卡。此次AMD在位寬上追平NVIDIA,再加上更高的頻率,顯存帶寬達到了264GB/s,基本上不會有什么瓶頸了。
光柵單元數(shù)量不變
Tahiti配備了32個ROPs,數(shù)量與Cayman,每個周期能完成32個色彩處理和128個Z/Stencil 處理,不過得益于有更高的顯存帶寬,在實際游戲中的性能要比理論值一樣的Cayman快50%,比如抗鋸齒方面。
率先支持DX11.1 API
AMD一直都是激進派,憑借與微軟的深度合作,自DX10以后AMD總是能夠第一時間發(fā)布支持最新API的顯卡,DX10.1/DX11還有現(xiàn)在的DX11都是如此。目前微軟尚未公布DX11.1的改進細節(jié),相信和當年的DX10.1一樣不會有太多質的改動。
支持PCI-E 3.0總線的意義
至于PCI-E 3.0總線的支持,更是超前,目前只有Intel的X79+i7-3960X平臺才會提供PCI-E3.0支持。根據(jù)經驗來判斷,PCI-E 3.0翻倍的帶寬并不會給顯卡帶來性能提升,其主要意義還是對于多卡的支持。試想,如果PCI-E 3.0 X4都可以滿足HD7970的需求的話,那么現(xiàn)有的Z68(搭配IvyBridge處理器)就不會限制多路交火的性能表現(xiàn),而X79插8塊(如果主板有這么多插槽的話)HD7970做并行計算也不會因為接口帶寬而產生性能瓶頸。
最后,再來強調一下AMD拋棄5D/4D VLIW改用全新GCN架構的意義
理想狀態(tài)下毫不相干的四組線程執(zhí)行情況
在VLIW的理想情況下,4個線程分別各自獨立且毫不相關,可以看到新架構和VLIW的執(zhí)行情況和類似,理論上效率都是100%。
非理想狀態(tài)下,條件相關線程延遲執(zhí)行
但對于VLIW架構來說,不理想的情況就是遇到相關的指令流,比如兩個綠色線程,前三個線程可在一個周期內執(zhí)行,最下方的藍色只能獨立執(zhí)行。而對于新架構來說,則不存在這樣的問題。也就是說,采用硬件調度之后,GCN和SIMD可以允許選擇不同的線程亂序執(zhí)行,這些線程可以來自同一任務,也可以是不同任務。當然,這種“亂序”也不是絕對的,基本的流程還是要遵守的,比如各個線程之間的指令必須按順序執(zhí)行,不能打亂也不能分割。
以上就是AMD官方提供的數(shù)據(jù),HD7970的理論運算能力相比HD6970提升不過30%,但在GPU計算應用當中的性能提升相當顯著,可達兩倍以上!尤其在AES加密解密算法中,速度達到了4倍以上,架構的威力可見一斑!
HD7900會在WinZIP當中有更好的加密壓縮解壓性能
高清視頻實時防抖處理
AMD在努力:支持GPU計算的軟件越來越多
以往的VLIW架構在并行任務處理方面處于劣勢,并且很依賴編譯器和API的支持,擴展到OpenCL也受到很大限制。經過硬件架構的調整,新的GCN架構在并行計算方面有了很大提高。編譯壓力減輕,硬件調度的加入使編譯器擺脫了調度任務;其次是程序優(yōu)化和支持語言擴充更見容易;最后是不用在生成VLIW指令和相關調度信息,新架構最底層的ISA也更加簡單。
從DX10時代開始,也就是ATI被AMD收購之后,AMD的GPU架構一直都沒有大的改動。從HD2000到HD6000,大家應該會發(fā)現(xiàn)GPU流處理器部分的結構沒有任何改動,區(qū)別只是規(guī)模而已。這次AMD能夠徹底拋棄沿用了5年之久的VLIW超長指令集架構,真的是讓人眼前一亮,真可謂是浪子回頭金不換。
對于AMD來說,這次真的是一次革命
Tihiti的GPU架構改得很徹底,換句話說就是AMD學得很快,NVIDIA花了5年時間循序漸進的把G80進化到了GF100的級別;而AMD只用了一年時間,就讓Tahiti達到甚至部分超越了GF100的水平,真是可喜可賀!
但是AMD還有很長的路要走,硬件雖然很強大、全新的GCN架構也掃清了效率低下障礙,但軟件和程序方面還需加把勁。讓AMD欣喜的是OpenCL API的發(fā)展速度比想象中的還要快,以至于NVIDIA打算部分開放CUDA接口。可以預見的是,未來更多的商業(yè)軟件將會直接使用OpenCL語言編寫,對于GPU實現(xiàn)無差別的硬件加速支持,最終比拼的還是架構與效率,而不是誰支持的軟件更多一些。
總結:
隨著GPU架構越來越復雜,傳統(tǒng)“半年更新,一年換代”的已經過時,再加上先進制造工藝的步伐放緩,GPU架構更新的周期被大大延長(1年、2年或者更長),我們現(xiàn)在看到的GPU大多是在原有架構上“縫縫補補”。對于現(xiàn)代GPU來說,一次換代并不僅僅是硬件架構的革新,更多時間的是開發(fā)者們對新架構的適應以及對新特性的吸收。
隨著技術的發(fā)展,圖形和計算的概念已經不再像以往分的那么清楚了,進入DX11時代時候,全新API和新特性帶來了以往DirectX版本看不到的東西,尤其是大量的圖形特效可以靠GPU的計算能力進行加速,這一切在要求傳統(tǒng)圖形渲染能力的同事,對GPU的計算能力要求十分苛刻,而未來圖形架構的發(fā)展勢必會順應這一趨勢。由此看來,AMD下定決定進行大規(guī)模的架構革新也就不奇怪了。
基于GCN架構、Tahiti核心的Radeon HD 7970顯卡將在北京時間1月9日下午1時正式發(fā)布,由于國外提前發(fā)布的關系,可能很多朋友已經看過國外的測試成績了,但我們將為讀者們獻上最全面的3D游戲性能測試以及并行計算性能測試,關注GPU圖形與計算的朋友不容錯過,敬請期待!■<
關注我們


