圖形與計算那些事 AMD次世代架構解析
R520->R580的成功,多達48個著色單元功不可沒,這讓ATI對龐大的ALU運算單元深信不疑。ATI認為只要繼續擴充著色單元,就能滿足新一代DX10及Shader Model 3.0的要求。
著色單元的結構:
在圖形處理中,最常見的像素都是由RGB(紅黃藍)三種顏色構成的,加上它們共有的信息說明(Alpha),總共是4個通道。而頂點數據一般是由XYZW四個坐標構成,這樣也是4個通道。在3D圖形進行渲染時,其實就是改變RGBA四個通道或者XYZW四個坐標的數值。為了一次性處理1個完整的像素渲染或幾何轉換,GPU的像素著色單元和頂點著色單元從一開始就被設計成為同時具備4次運算能力的運算器(ALU)。

數據的基本單元是Scalar(標量),就是指一個單獨的值,GPU的ALU進行一次這種變量操作,被稱做1D標量。由于傳統GPU的ALU在一個時鐘周期可以同時執行4次這樣的并行運算,所以ALU的操作被稱做4D Vector(矢量)操作。一個矢量就是N個標量,一般來說絕大多數圖形指令中N=4。所以,GPU的ALU指令發射端只有一個,但卻可以同時運算4個通道的數據,這就是SIMD(Single Instruction Multiple Data,單指令多數據流)架構。
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操作(矢量指令和標量指令可以并行執行),NV40以后的GPU支持2D+2D和3D+1D兩種模式,雖然很大程度上緩解了標量指令執行效率低下的問題,但依然無法最大限度的發揮ALU運算能力,尤其是一旦遇上分支預測的情況,SIMD在矢量處理方面高效能的優勢將會被損失殆盡。
DX10時代,混合型指令以及分支預測的情況更加頻繁,傳統的Shader結構必須做相應的改進以適應需求。NVIDIA的做法是將4D ALU全部打散,使用了MIMD(Multi Instruction Multiple Data,多指令多數據流),而AMD則繼續沿用SIMD架構,但對Shader微架構進行了調整,稱為超標量架構。
R600的5D超標量流處理器架構:
作為ATI的首款DX10 GPU,架構上還是有不少改進的,DX10統一渲染架構的引入,讓傳統的像素渲染單元和頂點渲染單元合二為一,統稱為流處理器。R600總共擁有64個Shader單元,每個Shader內部有5個ALU,這樣總計就是320個流處理器。
R600的Shader單元結構
R600的Shader有了很大幅度的改進,總共擁有5個ALU和1個分支執行單元,這個5個ALU都可以執行加法和乘加指令,其中1個"胖"的ALU除了乘加外之外還能夠進行一些函數(SIN、COS、LOG、EXP等)運算,在特殊條件下提高運算效率!
與R580不同的是,R600的ALU可以在動態流控制的支配下自由的處理任何組合形式的指令,諸如1+1+1+1+1、2+2+1、2+3、4+1等組合形式。所以AMD將R600的Shader架構稱作Superscalar(超標量),完美支持Co-issue(矢量指令和標量指令并行執行)。
R600超長指令集的弊端:
從Shader內部結構來看,R600的確是超標量體系,但如果從整個GPU宏觀角度來看,R600依然是SIMD(單指令多數據流)的VLIW(超長指令集)體系:5個ALU被捆綁在一個SIMD Shader單元內部,所有的ALU共用一個指令發射端口,這就意味著Shader必須獲得完整的5D指令包,才能讓內部5個ALU同時運行,一旦獲得的數據包少于5條指令,或者存在條件指令,那么R600的執行效率就會大打折扣。
例如:指令一:a=b+c;指令二:d=a*e。這兩條指令中,第二條指令中的a必須等待第一條指令的運算結果,出現這樣的情況時候,兩條指令大多數情況下就不能實現超標量執行了。
顯然,想要完整發揮R600的性能必須滿足苛刻的條件,這個條件不僅對驅動和編譯器提出了額外的要求,而且要求程序必須讓條件指令不存在任何關聯性,難度可想而知。最終結果就是絕大多數情況下R600都無法發揮出的理論性能,而且其執行效率會因為復雜指令的增多而不斷下降。
關注我們


