|
||||
序幕曲:VLIW顯卡架構的歷史
承接上文,在我們走進Graphics Core Next全新架構之前,先來簡單回顧一下以往AMD顯卡VILW架構的一些要點。
在過去的AMD的統一渲染架構中,基本的運算單元是流處理器單元(Streaming Processor,SPU)。我們知道,除了Cayman(調整為VILW4)核心以外,AMD從R600開始所有的GPU都采用了VLIW5架構(VLIW,超長指令流)。顧名思義,每一個流處理器單元有5個或者4個更基礎的數學運算單元(算術邏輯運算器ALU和特殊函數運算器SFU,現在AMD統一稱之為Radeon Cores),每一個數學運算單元都能在一個周期並行獨立地執行相關指令。數學運算單元與寄存器(Registers)相連,後者主要負責存儲輸入數據、臨時數值和輸出數據,並不存放具體的指令,另外還有分支單元(Branch Units)負責指令流的重組和打包,這樣就構成了一個完成了流處理器單元。
從設計方面來講,VILW架構更擅長於並行執行相同的指令,這些相同的指令(線程)往往是被打散之後重新分組的wavefront(類似於NVIDIA的warp)。在AMD以往的實例裡,wavefront是64個線程為一組,而指令流就是以wavefront來執行。理想的情況下,在一個wavefront中一組4或5個指令(類似於下圖的藍色指令)在流處理單元中並行完成,這樣的執行效率最高達到100%,5個算數單元可以全部負載。但當較少的指令(比如1或2個,類似於下圖的其它顏色指令),就會大大影響執行效率,因為此時只有1到2個運算單元負載。就這一點而言,VLIW架構始終難以在執行效率上達到完美,畢竟現實程序中的理想情況並沒有那麼多。
在3D圖形進行渲染的過程中,VS和PS的主要工作就是進行X、Y、Z、W四個坐標運算和計算除R、G、B、A得出像素顏色。為了一次性處理1個完整的幾何轉換或像素渲染,GPU的VS和PS從最初就被設計成為同時具備4次運算能力的算數邏輯運算器(ALU)。 而數據的基本單元是Scalar(標量),就是指一個單獨的變量,所以GPU的ALU進行一次這種變量操作,被稱做1D標量。
與標量對應的是Vector(矢量),一個矢量由N個標量標量組成。所以傳統GPU的ALU在一個時鍾周期可以同時執行4次標量的並行運算被稱做4D Vector(矢量)操作。雖然GPU的ALU指令發射端只有一個,但卻可以同時運算4個通道的數據,這就是單指令多數據流(Single Instruction Multiple Data,SIMD)架構。
這種類似的SIMD架構可以追溯到R300(Radeon 9700)時代,而到了DX10統一渲染架構出現的R600(Radeon HD 2900),AMD采用VLIW5架構設計也是在此基礎上進行的擴展和革新,因為當時的主要游戲市場依然被DX9佔據,而游戲中采用的3D渲染程序也大都利於這種架構執行。但是隨著時間的推移,新一代3D游戲和GPGPU(通用計算圖形處理器)程序的出現,VILW架構的執行效率就開始出現問題了。
最後,值得一提的是調度問題。在CPU世界中,我們把指令丟給CPU並且安排它在必要的時候進行線程調度操作。但在VLIW的GPU架構裡,線程調度是編譯器的事兒。編譯器對於已知程序的調度做地相當完美,但是對於未知程序的安排就不是很給力了。因為這種調度是靜態的,並不能實時改變。再加上VILW架構對編譯器的依賴相當之大,如此以來就更加雪上加霜。
那為什麼講AMD全新架構之前要說這些廢話?很簡單,沒有這些我們不可能了解AMD新架構中做了什麼,或者說為什麼這麼做。