|
||||
正如傳統的SIMD之於出流處理器單元之上,全新的SIMD之上就是新架構中所謂的計算單元了(Compute Unit,CU)。雖然從某種意義上來講,計算單元和傳統的SIMD相差不多,但前者帶來的該改變可謂脫胎換骨,甚至顛覆了AMD以往所有的架構設計。
那麼計算單元(CU)中都由那些單位構成呢?根據AMD的說法,一個CU中有4個SIMD單元,每個SIMD單元由16個全功能的標量ALU構成。每個CU配備一個硬件分支單元(Branch&MSG Unit),主要負責抽取、編碼以及調度wavefront和指令。此外,還有擴充的64KB LDS(Local Data Store)以及16KB數據和紋理L1緩存。也就說新架構中數據和紋理L1緩存進行了合並,因為L1緩存中的紋理單元都是經過壓縮過的,紋理L1緩存的壓力相比以往減小了。而環繞在顯存控制器之外的是可讀寫的L2緩存,還有可供4個CU共享的16KB只讀L1緩存和32KB只讀指令L1緩存。
在繼續下一步介紹之前,先來看一個問題。我們已經知道了新架構中計算單元的構成以及傳統VLIW架構的弱點,現在終於可以解答問什麼AMD要放棄VLIW轉而采用non-VLIW SIMD了。正如我們開始提到的,VLIW最大的弱點是編譯器的靜態調度。結果就是代碼執行過程中任何相關(至於如何理解可以參看下面的圖)性指令的突然出現,調度依然會按事先設定好的路數進行,而VLIW中大部分運算單元就被浪費掉。所以從VLIW到non-VLIW SIMD的第一個改變就很直接,後者的調度工作從編譯器完全轉移到了硬件——由計算單元來完成。當然,一切的目的就是為了獲得更好的執行效率,更好的計算性能。
當然,魚和熊掌什麼時候都不可兼得。這裡就有一個明顯的折中,硬件動態調度固態很好,但卻需要耗費更多的晶體管、佔用更大的核心面積。事實上,AMD以往的GPU之所以經歷數代都不願意放棄VLIW架構自然有其中的原因。對於圖形渲染來說編譯器調度方面並沒有太大影響,VLIW甚至在這方面做的相當不錯。而且更重要的是可以使用更少的晶體管,有限的核心面積也可以得到更好的利用——填充更多的附加功能單元。說到這兒,是不是很容易讓人聯想到NVIDIA呢?
那麼有了動態調度和和全新的SIMD之後,我們能做以前不能做的呢?在VLIW的理想情況下,如下方第一張圖所示,4個wavefront分別各自獨立且毫不相關,可以看到新架構和VLIW的執行情況和類似,理論上效率都是100%;不過對於VLIW架構來說,不理想的情況就是遇到相關的指令流,比如下方第二張圖的兩個綠色wavefront,這樣以來前三個wavefront在一個周期執行,最下方的藍色只能獨立執行。而對於新架構來說,則不存在這樣的問題。也就是說,采用硬件調度之後,CU和SIMD可以允許選擇不同的wavefront亂序執行,wavefront可以來自同一任務,也可以是不同任務。當然,這種『亂序』也不是絕對的,基本的流程還是要遵守的,比如各個wavefront之間的指令必須按順序執行,不能打亂也不能分割;
經過以上的介紹不難看出,以往的VLIW架構在並行任務處理方面處於劣勢,並且很依賴編譯器和API的支持,擴展到OpenCL也受到很大限制。經過硬件架構的調整,新架構在並行計算方面有了很大提高。其中每個SIMD有10個wavefront可供選擇,也就意味著每個CU的wavefront數量依次可以達到40個。這也就是AMD全新架構放棄多年采用的VLIW,轉而采用non-VLIW SIMD最為根本的原因。除此之外,帶來的其它好處也是不少。首先是編譯壓力減輕,硬件調度的加入使編譯器擺脫了調度任務;其次是程序優化和支持語言擴充更見容易;最後是不用在生成VLIW指令和相關調度信息,新架構最底層的ISA也更加簡單。