萬字長文解讀 AMD 的 GPU 架構(gòu) GCN
隨著 HD 5000 和 6000 系列的發(fā)展,AMD 的 Terascale(萬億級)架構(gòu)變得非常具有競爭力。然而在 2010 年代初,面向通用計算的 GPU 趨勢興起,AMD 并不希望錯失這個機(jī)會。Terascale 的 SIMD 引擎是 ATI 的 DirectX 9 時代 GPU 中執(zhí)行單元的遠(yuǎn)親。他們可以進(jìn)行計算,但利用其能力卻不一定總能成功。英偉達(dá)的 Fermi 架構(gòu)具有強(qiáng)大的計算能力,AMD 不想毫無抵抗就放棄一塊有潛力的市場。
本文引用地址:http://m.butianyuan.cn/article/202401/455097.htmGraphics Core Next(GCN)徹底摒棄了以通用計算的可預(yù)測性能為核心的 Terascale 策略。雖然 Terascale 的 64 寬波前仍然存在,但 GCN 的其他特點卻截然不同,以至于它甚至不能算作一個遠(yuǎn)親。GCN 的指令集類似于典型的 CPU 或英偉達(dá)的 Fermi。為了將這些責(zé)任轉(zhuǎn)移到硬件上,顯式調(diào)度信息已被移除。線程內(nèi)的執(zhí)行嚴(yán)格遵循標(biāo)量,摒棄了 Terascale 從單個線程每周期發(fā)出多個操作的能力。
GCN 首次亮相市場是在 Tahiti 芯片上,這是一款采用臺積電 28 納米工藝制造的 352 平方毫米芯片。Tahiti 配備 384 位 GDDR5 接口與顯存連接,并升級為與主機(jī)的 PCIe 3.0 鏈接,使其比 AMD 之前的 Cayman 具有更高的片外帶寬。自 2011 年發(fā)布以來,GCN 衍生架構(gòu)為 AMD 的產(chǎn)品提供服務(wù)長達(dá)十年。從 Tahiti 到 2021 年的 Cezanne,GCN 經(jīng)歷了大量演變,但保留了其可識別的計算單元結(jié)構(gòu)。因此,GCN 是歷史最悠久的圖形架構(gòu)之一。即使在今天,GCN 的 DNA 仍然延續(xù)在 AMD 面向計算的 CDNA GPU 中。CDNA 線路取消了部分 GCN 的圖形功能,將重心轉(zhuǎn)向 FP64,但仍然是一個可識別的 GCN 衍生產(chǎn)品。
Radeon HD 7950 使用稍微縮減的 Tahiti 芯片
這篇文章將重點關(guān)注 GCN 早期 Tahiti 和 Hawaii 的發(fā)展情況。這里有來自 AMD Radeon HD 7950 的數(shù)據(jù),它使用了稍微精簡的 Tahiti 芯片。Hawaii 是 GCN 的放大版。它于一年后推出,對最初的 GCN 架構(gòu)進(jìn)行了輕微增強(qiáng),旨在與英偉達(dá)當(dāng)時最大的 GPU 競爭。
MSI 的 Radeon R9 390 采用開放式空氣冷卻器
Hawaii 首先推出了 R9 290 系列,但是會優(yōu)先考慮 R9 390。這是一個稍微精簡的 Hawaii 芯片,配有 8 GB 的 VRAM。
系統(tǒng)架構(gòu)
GCN 的基本構(gòu)建模塊是計算單元(CU)。Tahiti 的著色器陣列由 32 個 CU 組成,HD 7950 啟用了 28 個。每個 CU 都有一個專用的 16 KB 向量緩存和 64 KB 本地數(shù)據(jù)共享,但與多達(dá)四個相鄰 CU 共享一個指令緩存和標(biāo)量緩存。
計算單元陣列可以由圖形命令處理器或異步計算引擎(ACEs)提供,具體取決于工作是在圖形隊列上提交還是在計算隊列上提交。對于計算工作負(fù)載,每個 ACE 可以在每個周期啟動一個波前。Tahiti 有兩個 ACE,讓它在 GPU 上每個周期發(fā)射兩個波前。
對于圖形工作負(fù)載,GCN 的光柵化器消耗由頂點著色器導(dǎo)出的屏幕空間坐標(biāo)。它們每個時鐘可以處理一個基元,每個周期可以寫出多達(dá) 16 個像素,因此每個光柵化器每四個周期可以發(fā)射一個 64 寬度的波前。Tahiti 有兩個光柵化器,讓它每兩個周期發(fā)射一個像素波前。屏幕空間在兩個光柵器之間劃分,反映了 Cayman 的兩個圖形引擎的方法。Hawaii 使用了四個光柵化器,使其更快地填充著色器陣列。
計算工作負(fù)載將其結(jié)果寫入 VRAM,供未來的內(nèi)核使用或復(fù)制回主機(jī)。對于圖形,像素著色器導(dǎo)出被發(fā)送到渲染后端。Tahiti 上的每個渲染后端都有一個 16 KB 顏色緩存和一個 4 KB 深度緩存。最終像素顏色被寫入內(nèi)存控制器并繞過二級緩存。與 Terascale 不同的是,渲染后端與內(nèi)存控制器分離,并且可以獨(dú)立于內(nèi)存總線寬度進(jìn)行縮放。
GCN 的計算單元
GCN 的計算單元與 Terascale 的 SIMD 大致相當(dāng)。兩者每周期都可以完成 64 次 FP32 運(yùn)算,如果將熔合乘加運(yùn)算計為兩次,則是原來的兩倍。然而,AMD 已完全重組了這個基本構(gòu)建模塊,將 VLIW 捆綁打包從圖片中提出。計算單元由四個較小的 SIMD 組成,而不是一個能夠發(fā)出四次指令的大型 SIMD。每個 SIMD 都有自己的 64 KB 向量寄存器文件和 10 項調(diào)度程序分區(qū)。線程內(nèi)的執(zhí)行現(xiàn)在是完全標(biāo)量的,這意味著 CU 不能從同一線程的每個周期發(fā)出多條指令。然而,如果 SIMD 的調(diào)度程序分區(qū)中有多個線程已就緒,并且每個線程的就緒指令都發(fā)送到單獨(dú)的功能單元,那么 CU 可以每周期發(fā)射多達(dá)五個指令。
計算單元前端
計算單元(CU)的流水線從 32 KB、4 路組相聯(lián)的 L1 指令緩存中提取指令開始。指令緩存使用 64 字節(jié)行,與 CPU 上常見的緩存行大小保持一致。一個指令緩存實例可由最多四個相鄰的計算單元共享,并可在每個周期向每個計算單元提供 32 字節(jié)。這可能是通過四分組的設(shè)置實現(xiàn)的,因此存儲器分組沖突可能減少指令帶寬。
Terascale 3 在多達(dá)四個 SIMD 之間共享一個 48 KB 的 ALU 指令緩存,這與 GCN 有一定的相似性。由于 GCN 的可變長度指令平均需要較少的存儲空間,AMD 得以將指令緩存大小削減到 32 KB。Terascale 3 使用了固定長度的 64 位指令。一束指令的長度可以根據(jù)編譯器打包的指令數(shù)量和立即值的多少而變化,范圍從 64 位到 384 位。GCN 的指令長度為 32 位或 64 位,后面可以選擇逐添 1 個 32 位立即值。
指令帶寬需求可視化
英偉達(dá)的 Kepler 使用 8 KB 的指令緩存,專用于每個 SMX。私有緩存更適合處理 Kepler 的高指令帶寬需求。一個 SMX 需要每周期至少傳輸 6 條指令以滿足其 192 個 FP32 單元的需求,因為英偉達(dá)的每條指令在 32 個 32 位元素的長向量上進(jìn)行操作。使用固定長度的 64 位指令,根據(jù)每條指令的靜態(tài)調(diào)度信息字節(jié)計算,Kepler 的指令緩存每周期需要提供 48 或 54 字節(jié)的指令。GCN 的計算單元每個周期只需要執(zhí)行一條指令就可以使其向量執(zhí)行單元飽和,這既是因為它的向量執(zhí)行單元較少,也是因為每條 GCN 指令都在一個 64 長的向量上操作。
調(diào)度和指令發(fā)布
一旦指令被獲取,它們將保存在一組指令緩沖區(qū)中。計算單元的四個 SIMD 中的每一個都有一個 10 項的緩沖區(qū),使其能夠跟蹤來自最多 10 個獨(dú)立線程的指令。因此,整個計算單元可以跟蹤 40 個線程(或波前)。對于 64 寬波前,計算單元可以在運(yùn)行中執(zhí)行 2560 個 32 位操作。
每個周期,計算單元選擇一個 SIMD 并掃描它的 10 個線程,以查看是否有準(zhǔn)備好執(zhí)行的線程。GCN 可以通過選擇多個線程并發(fā)布不同類別的指令來實現(xiàn)有限的多發(fā)射能力。例如,一個線程的標(biāo)量算術(shù)邏輯單元 ALU(Arithmetic Logic Unit)指令可以與另一個線程的向量 ALU 指令同時發(fā)射。理論上,一個計算單元每個周期可以發(fā)出 5 條指令。但是如此高的發(fā)布率應(yīng)該是罕見的,因為工作負(fù)載不太可能有來自不同類別的指令的均勻混合。高占用率對充分利用這種多發(fā)射策略至關(guān)重要。如果 SIMD 有更多線程可以選擇,它將更有可能找到具有正確指令混合的多個線程以實現(xiàn)多發(fā)射。
假設(shè)達(dá)到理論占用率
GCN 的策略與 Terascale 形成鮮明對比,Terascale 強(qiáng)調(diào)從單個線程的多發(fā)射,這給編譯器帶來了巨大的負(fù)擔(dān)。編譯器必須找到在打包成捆時既獨(dú)立又不過度占用寄存器文件端口的指令。GCN 轉(zhuǎn)向使用線程級并行性意味著編譯器可以忽略這些硬件細(xì)節(jié)。英偉達(dá)的 Kepler 采用了一種折中的方法。寄存器組沖突由硬件操作數(shù)收集器處理。編譯器負(fù)責(zé)在指令流中為雙發(fā)射標(biāo)記成對的指令,但雙發(fā)射真正起到錦上添花的作用。與 Terascale 相比,即使不進(jìn)行多發(fā)射,Kepler 也能保持更好的吞吐量。
盡管 GCN 失去了從單個線程進(jìn)行多發(fā)射的能力,但它從一個線程發(fā)出請求的次數(shù)比 Terascale 要多。一個 Terascale SIMD 有 16 個線程寬,每四個周期可以發(fā)射一個捆綁包,但不能連續(xù)執(zhí)行來自同一線程的兩個捆綁包。因此,Terascale 需要在一個 SIMD 中至少有兩個線程才能實現(xiàn)最大吞吐量。GCN 則消除了這一限制,因此 SIMD 上的線程可以每四個周期執(zhí)行一次指令。Terascale 可以實現(xiàn)更高的單線程吞吐量,但前提是編譯器在將指令打包成捆綁包時做得足夠好。
在沒有寄存器組沖突和依賴延遲的情況下線程的發(fā)射速度的粗略設(shè)想。每個框代表一個周期。
與此同時,Kepler 可以迅速處理單個線程。它使用 32 寬的波和 32 寬的執(zhí)行單元,所以一個線程可以在每個周期發(fā)射一條指令。雙發(fā)射是錦上添花。因此,面對低占用率和有限的線程級并行性,Kepler 可以保持相當(dāng)不錯的吞吐量。
寄存器文件
選定的指令從寄存器文件中讀取其輸入。在 GCN 中,Terascale SIMD 的巨大 256 KB 寄存器文件被拆分為四個 64 KB 寄存器文件,每個 GCN SIMD 一個。GCN 的寄存器文件幾乎可以肯定是分組結(jié)構(gòu),但與 Terascale 相比,應(yīng)該更少地受到寄存器組沖突的影響。假設(shè)仍然是四分組的寄存器文件,GCN 可以提供四個輸入,以供給可能需要多達(dá)三個輸入的指令(用于熔合乘加)。如果指令從標(biāo)量寄存器或指令流中的立即值獲取輸入,對向量寄存器文件的帶寬需求可能會較低。最重要的是,GCN 可能有一個操作數(shù)收集器,可以在偶爾出現(xiàn)存儲器分組沖突的情況下,消除對寄存器文件帶寬的需求。
Terascale 需要復(fù)雜的調(diào)度和寄存器分配來實現(xiàn)良好的利用率。每個 VLIW 通道只能將返回值寫回到其對應(yīng)的寄存器文件分組中,而在讀取端的任何寄存器組沖突都可能降低 VLIW 打包效果。由于 SMX 的 FP32 單元沒有足夠的寄存器文件帶寬來為 FMA 操作提供數(shù)據(jù),因此 Kepler 需要付出更多的努力以實現(xiàn)完全優(yōu)化。
除了向量寄存器文件外,GCN 計算單元還有一個 8 KB 的標(biāo)量寄存器文件。如果程序可以將一些變量存儲在標(biāo)量寄存器中,就可以減少向量寄存器的使用并實現(xiàn)更高的占用率。
執(zhí)行單元
GCN 中的每個 SIMD 都有一個 16 路寬的執(zhí)行單元。常見的 FP32 操作和整數(shù)加法以全速執(zhí)行,而 32 位整數(shù)乘法和特殊功能以四分之一速率執(zhí)行。理論吞吐量與 Terascale 3 相似。但是,GCN 不再需要將四條指令打包到每個捆綁包中以飽和計算單元,而是需要至少四個活躍線程來填充其四個 SIMD。
去除貓毛后,準(zhǔn)備重新粘貼 R9 390 進(jìn)行測試。以前的所有者有一只柴色的貓
Terascale 的分支單元被轉(zhuǎn)換為標(biāo)量 ALU。盡管 GPU 主要是向量處理器,但它們?nèi)匀恍枰幚砜刂屏骱偷刂飞?。這些操作通常在一個向量上是常數(shù),所以標(biāo)量 ALU 可以卸載這些計算。將這些標(biāo)量操作移至專用單元有助于減輕向量 ALU 的負(fù)載并提高功率效率。
與 Kepler 的 SMX 相比,GCN 的計算單元更小,吞吐量更低。為了彌補(bǔ)這一缺陷,Tahiti 擁有的計算單元數(shù)量是 GK104 擁有 SMX 數(shù)量的四倍。
HD 7950 的側(cè)邊
Hawaii 擴(kuò)展了著色器陣列,使其可以實現(xiàn)超過 5 TFLOPS 的 FP32 吞吐量。然而,作為未來趨勢的一個標(biāo)志,Hawaii 的 FP64 性能落后于 Tahiti。GCN 的 FP64 吞吐量可從半速配置到 1/16 速。Tahiti 采用與 GCN 最初計算設(shè)想相一致的 1/4 速 FP64 執(zhí)行進(jìn)行配置。隨著 GPU 計算在客戶端應(yīng)用中的重要角色逐漸明確,AMD 對 FP64 執(zhí)行的投資減少。因此,Hawaii 采用了更普通的 1/8 速 FP64。但即使以 1/8 速,AMD 的客戶端顯卡在 FP64 性能上仍大幅領(lǐng)先于英偉達(dá)同類產(chǎn)品。
計算單元數(shù)據(jù)緩存
AMD 重塑了緩存層次結(jié)構(gòu),以適應(yīng)通用工作負(fù)載,而非僅專注于圖形。一個 16 KB 的 4 路組相聯(lián)向量緩存作為計算單元的主數(shù)據(jù)緩存。它使用 LRU 替換策略,64B 行,并且每周期可以為計算單元提供 64 字節(jié)。Terascale 的 8 KB 只讀紋理緩存可以提供相同的每周期帶寬,但 GCN 享有兩倍的緩存容量和更低延遲訪問。
GCN 的矢量緩存也支持寫入。L1 緩存是直寫、寫分配設(shè)計。它不如大多數(shù) CPU 中的回寫緩存好,但 L1 仍然可以在寫入被傳遞到 L2 之前幫助合并寫入。
盡管 GCN 相較于 Terascale 有了巨大的改進(jìn),但 Kepler 在向量訪問方面的延遲仍然較低。AMD 希望通過優(yōu)化部分內(nèi)存訪問以使用標(biāo)量路徑,來緩解這一問題。
分析 RX 460 上運(yùn)行的 Valheim。RX 460 使用北極星,GCN 架構(gòu)的衍生物
標(biāo)量存儲器訪問由多達(dá)四個相鄰計算單元共享的 16 KB 4 路標(biāo)量高速緩存提供服務(wù)。標(biāo)量緩存每周期可向每個計算單元傳送 16 個字節(jié),并針對低延遲進(jìn)行了優(yōu)化。標(biāo)量緩存命中的延遲不到 50 納秒,這對于此時的 GPU 世界來說是非常快的。它與 Terascale 的紋理緩存 200+ ns 的延遲相去甚遠(yuǎn),比開普勒的任何緩存都快,除了它的 2 KB 常量緩存。
與 Terascale 相比,GCN 在計算單元內(nèi)的緩存策略既現(xiàn)代又靈活。除了對計算工作負(fù)載的巨大改進(jìn)外,GCN 的改變還應(yīng)有助于圖形處理。將紋理緩存容量從 8 KB 增加到 16 KB 應(yīng)該會減輕對芯片級互連的負(fù)載,并且較低的延遲意味著 GPU 在維持良好性能時需要較少運(yùn)行中的工作。
描繪 GK104 Kepler。GK210 擁有 128 KB 的 L1 緩存/共享內(nèi)存
英偉達(dá)的 Kepler 架構(gòu)在緩存策略上既融合了過去的特點,也具備新穎之處,類似于 Fermi 架構(gòu)。只讀紋理緩存仍然存在。但是 Kepler 還有一個單獨(dú)的 L1 數(shù)據(jù)緩存,它與本地內(nèi)存共享存儲空間。如果這還不夠,Kepler 的 SMX 還具有私有的兩級常量緩存設(shè)置。常量緩存與 GCN 的標(biāo)量緩存在功能上有一定重疊。但與 Fermi 不同,英偉達(dá)的編譯器不再嘗試為跨波形上的常量內(nèi)存訪問使用常量緩存。您必須使用__constant 限定符顯式標(biāo)記內(nèi)存,以便使用常量緩存層次結(jié)構(gòu)。
結(jié)果是,Kepler 具有三個獨(dú)立的數(shù)據(jù)緩存路徑,每個路徑都具有足夠的容量來獨(dú)立運(yùn)行。這種緩存策略讓英偉達(dá)可以針對特定的工作負(fù)載類型專門優(yōu)化每個緩存。紋理緩存具有極高的 96 路關(guān)聯(lián)性,并且常量緩存提供了非常低的延遲。但是,為所有內(nèi)容設(shè)置獨(dú)立的緩存會占用面積。一個 SMX 擁有 146 KB 的緩存和本地內(nèi)存。
用于服務(wù)不同內(nèi)存類型的緩存
相比之下,一個 GCN 計算單元有 80 KB 的專用數(shù)據(jù)緩存和便箋式存儲器。如果將 16 KB 的 L1 標(biāo)量緩存分配給 4 個 CPU,這個數(shù)字會上升到 84 KB。
本地內(nèi)存
除了全局內(nèi)存層次結(jié)構(gòu)之外,每個 GCN 計算單元都有一個名為 Local Data Share(LDS)的 64 KB 軟件管理的本地內(nèi)存。OpenCL 將此內(nèi)存類型稱為「本地內(nèi)存」。LDS 的結(jié)構(gòu)與 Terascale 中的類似,但容量翻倍。它包括 32 個存儲器分組,每個分組每周期可以讀取一個 32 位元素,總共每周期實現(xiàn) 128 字節(jié)的帶寬。
來自 AMD GCN 的技術(shù)文檔
英偉達(dá)的 Kepler 會根據(jù) GK104 或 GK210 變體的不同,從一個 64 KB 或 128 KB 的 SRAM 塊中動態(tài)分配本地內(nèi)存和 L1 緩存存儲空間。Nvidia 將本地內(nèi)存稱為「共享內(nèi)存」。與 AMD 的實現(xiàn)類似,Nvidia 的共享內(nèi)存由 32 個存儲器分組組成,但每個分組寬度為 64 位。這為 Kepler 提供了每周期 256 字節(jié)的本地內(nèi)存帶寬,使其更適合處理 64 位數(shù)據(jù)類型。
正如之前提到的,當(dāng)在 LDS 內(nèi)進(jìn)行指針追蹤時,GCN 的表現(xiàn)出奇地差。Tahiti 的表現(xiàn)比 Cayman(Terascale 3)差。Hawaii 的表現(xiàn)更好,但仍遠(yuǎn)不及英偉達(dá)同時代的架構(gòu)。
AMD 的優(yōu)勢在于通過 LDS 同步線程。內(nèi)置在 LDS 中的整數(shù)原子單元有助于加速這些操作。而英偉達(dá)的 Fermi 和 Kepler 架構(gòu)沒有相應(yīng)的功能。它們的共享內(nèi)存非常快,但是在原子操作的性能方面仍有很大的改進(jìn)空間。
二級緩存
與大多數(shù) GPU 一樣,GCN 具有跨 GPU 共享的 L2 緩存。L2 緩存有助于處理 L1 未命中,并分為獨(dú)立的分片以提供高帶寬。每個分片具有 64 KB 或 128 KB 的緩存容量,并連接到一個內(nèi)存控制器通道。Tahiti 和 Hawaii 似乎都使用 64 KB 分片。每周期一個分片可以讀取 64 字節(jié),因此 Tahiti 的 L2 應(yīng)具有每周期 768 字節(jié)的帶寬。因此,在 925 MHz 的 Boost 頻率下,HD 7950 理論上具有 710 GB/s 的 L2 帶寬。在 1 GHz 時,R9 390 具有 1 TB/s 的 L2 帶寬。
Terascale 具有類似的 L2 分片配置,每個分片為 64 KB,每周期提供 64 字節(jié)。然而,Terascale 的 L2 只是一個只讀紋理緩存。GCN 的 L2 采用了現(xiàn)代化的寫回設(shè)計。寫回緩存只在行被逐出時將寫操作向下一級傳播,從而吸收寫帶寬。此外,GCN 的 L2 分片可以處理原子操作。Terascale 上的原子操作將在單獨(dú)的、較小的讀寫緩存中處理,并且性能較差。
關(guān)于 GCN 記憶子系統(tǒng)的評論
Terascale 的緩存是基于圖形處理構(gòu)建的。著色器程序不需要向內(nèi)存中寫入太多數(shù)據(jù),它們的輸出被發(fā)送到專用的片上緩沖區(qū)。頂點著色器會輸出到參數(shù)緩存和位置緩沖區(qū),而像素著色器會將其輸出發(fā)送到 ROPs(渲染輸出單元)。
根據(jù) Terascale ISA(指令集架構(gòu))手冊,每個著色器程序的輸出都通過專用的片上緩沖區(qū)進(jìn)行傳遞,以盡量減少 VRAM(顯存)寫入。顯然,計算程序無法從這些特殊緩沖區(qū)中受益。
計算程序被硬擠進(jìn)這種現(xiàn)有結(jié)構(gòu)。如果讓 Terascale 在 OpenCL 內(nèi)核中從內(nèi)存獲取數(shù)據(jù),編譯器會發(fā)出頂點獲取或紋理采樣子句。主要的 L1/L2 緩存是只讀紋理緩存,因此寫帶寬表現(xiàn)不佳。
GCN 使緩存層次結(jié)構(gòu)現(xiàn)代化,緩存設(shè)置類似于 GPU 上現(xiàn)在有的布局。主要的 L1/L2 緩存得到寫入支持。所有緩存中的標(biāo)準(zhǔn) 64 字節(jié)緩存行,可以輕松實現(xiàn)與 CPU 的數(shù)據(jù)共享。它們還是虛擬地址,只要緩存命中,TLB(轉(zhuǎn)換后援緩沖)未命中就不可能發(fā)生。緩存延遲和帶寬數(shù)字相較于 Terascale 都得到了顯著改善。在 28nm 制程時代,GCN 使 AMD 在帶寬方面取得了很大的領(lǐng)先優(yōu)勢。這與 40nm 制程時代相反,那時 Fermi 通常比 Terascale 顯卡具有更高的帶寬。
隨著 AMD 繼續(xù)迭代 GCN,緩存層次結(jié)構(gòu)得到了進(jìn)一步的現(xiàn)代化。在 GCN 第三代中,只讀標(biāo)量緩存獲得了寫入支持。Vega 在 GCN 第三代之后問世,并將命令處理器和渲染后端置于 L2 之前。這有助于減少 L2 刷新并提高寫帶寬。
來自 AMD 關(guān)于 RDNA 架構(gòu)的演示
盡管經(jīng)歷了重大變革,但 Terascale 的部分遺留特性仍然存在。四個計算單元共享指令和標(biāo)量緩存,有助于減少芯片上用于緩存的面積。這與 Kepler 的方法形成了鮮明對比,在 Kepler 中,設(shè)計師全力打造每個 SMX 的緩存。部分原因在于,像與同時代的英偉達(dá)競爭產(chǎn)品一樣,GCN 保持了非常高的計算密度。
計算性能(VkFFT)
VkFFT 在多個不同的 GPU 計算 API 中實現(xiàn)了快速傅里葉變換(FFT)。它是一個現(xiàn)代且目前仍在維護(hù)的項目,2010 年代初期的 GPU 在完成完整基準(zhǔn)測試時可能會遇到困難。但是每個平臺都可以通過前幾個子測試,有足夠的數(shù)據(jù)展示 GCN 的計算潛力。VkFFT 可能受內(nèi)存限制較大,而 GCN 的大容量內(nèi)存總線使其表現(xiàn)出色。
HD 7950 在與 GTX 680 的對比中表現(xiàn)出色。Hawaii 架構(gòu)的 R9 390 擴(kuò)大了該優(yōu)勢。VkFFT 還會輸出預(yù)估的帶寬數(shù)據(jù),這些數(shù)據(jù)展示了龐大的 512 位 GDDR5 總線所能帶來的性能。
等一下,Oland 使用 128 位 DDR3 總線在這里是怎么回事?
遺憾的是,Tesla K80 無法參加 Vulkan 基準(zhǔn)測試,因為無法讓 Vulkan 在該云實例上工作。幸運(yùn)的是,OpenCL 幾乎可以在所有設(shè)備上運(yùn)行,而且 VkFFT 也可以使用它。
當(dāng)大型 GCN 與大型 Kepler 對決時,GCN 極高的計算密度和高內(nèi)存帶寬使它在每個子測試中保持領(lǐng)先。GK210 的 384 位總線被 Hawaii 的 512 位總線超越。最重要的是,Hawaii 的頻率也更高,略高于 1 GHz。Tesla K80 的運(yùn)行頻率約為 875 MHz,因為 GK210 芯片必須適應(yīng) 150W 的功耗范圍。
VkFFT 的預(yù)估帶寬數(shù)字再次展示了 GCN 在帶寬方面的優(yōu)勢。Tesla K80 的每個 GK210 芯片只有 240 GB/s 的理論帶寬,而 R9 390 的理論帶寬為 384 GB/s。VkFFT 在 RDNA 2 上進(jìn)行分析時并不支持緩存,RX 6900 XT 的 4 MB L2 幾乎沒有任何命中。K80 和 R9 390 很可能處于類似的情況。
關(guān)于圖形性能的一點說明
對于某些計算工作負(fù)載,GCN 的計算密度和高內(nèi)存帶寬可以讓它在與英偉達(dá) Kepler 架構(gòu)的競爭中大幅領(lǐng)先。然而,在圖形負(fù)載方面可能是另一番情況。GCN 的大規(guī)模著色器陣列在具有較長持續(xù)時間的大規(guī)模工作負(fù)載上表現(xiàn)出色。一些圖形工作負(fù)載,比如全屏像素著色器,就屬于這一類。然而,較小的工作負(fù)載可能會讓 Kepler 占據(jù)優(yōu)勢。
處理簡單幾何圖形的頂點著色器等小型工作負(fù)載對任何 GPU 來說都具有挑戰(zhàn)性,但 GCN 比 Kepler 的表現(xiàn)更糟
相對于計算,Kepler 在固定功能圖形硬件上花費(fèi)更多的面積。GK104 擁有四個光柵化分區(qū),每個分區(qū)有兩個 SMX。如果 Kepler 保持與 Fermi 相同的光柵化吞吐量,每個光柵化器每時鐘周期可以處理一個圖元并輸出 8 個像素。為了實現(xiàn) Kepler 完整的計算吞吐量,每個 SMX 需要為其四個調(diào)度分區(qū)中的每一個分配至少一個波。在沒有小三角形吞吐量損失的前提下,損失光柵化器可以在 32 個周期內(nèi)創(chuàng)建訪問 Kepler 所有計算潛力所需的最小像素工作量。Kepler 每個 SMX 調(diào)度分區(qū)的全部占用(每分區(qū) 16 個波)至少需要 512 個周期才能達(dá)到。
Tahiti 有兩個光柵化器來為一組 32 個計算單元(CU)提供輸入,即每 16 個計算單元有一個光柵化器。每個光柵化器每時鐘周期可以處理一個圖元,并在每四個周期內(nèi)創(chuàng)建一個 64 寬的像素工作波。與 Kepler 的 SMX 類似,GCN 的計算單元需要為每個 SIMD 分配至少一個波,以實現(xiàn)完整的吞吐量。光柵化器需要 256 個時鐘周期來實現(xiàn)這一點。達(dá)到最大占用率需要 2560 個時鐘周期。
來自 AMD 的 GDC 2018 的演示. GK104 Kepler 的「SE:CU」比例式 1;2
Hawaii 通過增加到四個光柵化器來改善這種情況。對于每個光柵化器的 11 個計算單元,第二代 GCN 可以在 176 個周期內(nèi)實現(xiàn)每個 SIMD 一個波,以及在 1760 個周期內(nèi)實現(xiàn)完全占用。然后,像 Vega 64 和 Fury X 這樣的更大型 GCN 實現(xiàn)再次擴(kuò)展了著色器陣列,將 SE(Shader Engine)與計算單元的比例恢復(fù)到 1:16。
放大在 6900 XT 上運(yùn)行的瓦爾海姆的 RGP 配置文件,顯示了光柵化器填充著色器陣列時的延遲。同樣的情況也適用于 GCN,但 GCN 應(yīng)該更糟
每線程性能是另一個問題。圖形渲染可能涉及具有有限并行性的序列。與 Terascale 相比,GCN 可能提供更為穩(wěn)定的每線程性能。但是,Kepler 可以為單個線程提供更多的執(zhí)行資源,這在具有大量小型繪制調(diào)用的序列中非常重要。
放大觀察在 6900 XT 上運(yùn)行的 Cyberpunk 2077 剖析,顯示具有有限并行性和短周期的小型繪制調(diào)用。在這類序列中,Kepler 應(yīng)該優(yōu)于 GCN。
因此,高端 GCN GPU 通常在較高分辨率下表現(xiàn)良好。渲染更多像素意味著更多的并行性,這使得線程啟動速率和每線程執(zhí)行時間相較于 GPU 的整體吞吐量變得不那么重要。
寫在最后
GCN 是一個完全現(xiàn)代化的架構(gòu)。該設(shè)計的調(diào)度、執(zhí)行單元布局和緩存設(shè)置與 RDNA 3 和英偉達(dá)的 Ada Lovelace 具有更多共同點,而不像其直接前身 Terascale 3。與最近的 GPU 一樣,GCN 的設(shè)計在計算和圖形方面都具有很好的定位。然而,AMD 側(cè)重于計算的轉(zhuǎn)變并未取得成功。與英偉達(dá)的生態(tài)系統(tǒng)優(yōu)勢相比,GCN 的通用設(shè)計并沒有太大意義。CUDA 在 OpenCL 之前成熟,并附帶一套預(yù)優(yōu)化的庫。更糟糕的是,GPU 計算在消費(fèi)者領(lǐng)域并未蒸蒸日上。游戲性能仍然是最重要的。
MSI 的 R9 390 使用雙槽冷卻器和五個熱管來冷卻 Hawaii 芯片
在 2010 年代初至中期,光柵化圖形繼續(xù)主導(dǎo)游戲市場。AMD 在 Hawaii 中擴(kuò)展了 GCN 的工作分配硬件,但英偉達(dá)在 Maxwell 和 Pascal 中取得了巨大的提升。GCN 在性能和能效方面仍然難以與之匹配。
AMD 希望您編寫計算著色器
雖然這對 2012 年的 AMD 來說可能沒什么慰藉,但現(xiàn)代趨勢已經(jīng)證實了 GCN 設(shè)計的合理性。固定功能圖形硬件仍然重要,但游戲已逐漸趨向于使用更多的計算。光線追蹤是一個廣為人知的例子。光線追蹤基本上是一種計算工作負(fù)載,它不使用光柵化器。然而,即使沒有光線追蹤,計算著色器也在現(xiàn)代游戲中悄然發(fā)揮著更大的作用?,F(xiàn)代設(shè)計采用了 GCN 設(shè)計的一些元素。RDNA 保留了標(biāo)量數(shù)據(jù)路徑,并使用了類似的指令集。英偉達(dá)在其 Turing 架構(gòu)中加入了標(biāo)量路徑(稱為統(tǒng)一數(shù)據(jù)路徑),并將其保留在后續(xù)設(shè)計中。
如今,得益于更高的顯存容量,HD 7950 比 GTX 680 更具可用性。GCN 的設(shè)計也更傾向于大型、長時間運(yùn)行的內(nèi)核,因為這可以讓 GCN 的大型著色器陣列更好地發(fā)揮作用,同時減輕了光柵化器快速啟動波前來填充它的壓力。這使得 Tahiti 更有能力應(yīng)對新游戲帶來的更高著色器工作負(fù)載。R9 390 也是如此。幾個月前,我收到了一位朋友的朋友不再使用的這款顯卡,但這并不是因為這款顯卡性能不足。相反地,這款 R9 390 為他效力的時間太長,以至于散熱膏都已經(jīng)干掉,導(dǎo)致性能極度降低。
評論