萬(wàn)字長(cháng)文解讀 AMD 的 GPU 架構 GCN
隨著(zhù) HD 5000 和 6000 系列的發(fā)展,AMD 的 Terascale(萬(wàn)億級)架構變得非常具有競爭力。然而在 2010 年代初,面向通用計算的 GPU 趨勢興起,AMD 并不希望錯失這個(gè)機會(huì )。Terascale 的 SIMD 引擎是 ATI 的 DirectX 9 時(shí)代 GPU 中執行單元的遠親。他們可以進(jìn)行計算,但利用其能力卻不一定總能成功。英偉達的 Fermi 架構具有強大的計算能力,AMD 不想毫無(wú)抵抗就放棄一塊有潛力的市場(chǎng)。
本文引用地址:http://dyxdggzs.com/article/202401/455097.htmGraphics Core Next(GCN)徹底摒棄了以通用計算的可預測性能為核心的 Terascale 策略。雖然 Terascale 的 64 寬波前仍然存在,但 GCN 的其他特點(diǎn)卻截然不同,以至于它甚至不能算作一個(gè)遠親。GCN 的指令集類(lèi)似于典型的 CPU 或英偉達的 Fermi。為了將這些責任轉移到硬件上,顯式調度信息已被移除。線(xiàn)程內的執行嚴格遵循標量,摒棄了 Terascale 從單個(gè)線(xiàn)程每周期發(fā)出多個(gè)操作的能力。
GCN 首次亮相市場(chǎng)是在 Tahiti 芯片上,這是一款采用臺積電 28 納米工藝制造的 352 平方毫米芯片。Tahiti 配備 384 位 GDDR5 接口與顯存連接,并升級為與主機的 PCIe 3.0 鏈接,使其比 AMD 之前的 Cayman 具有更高的片外帶寬。自 2011 年發(fā)布以來(lái),GCN 衍生架構為 AMD 的產(chǎn)品提供服務(wù)長(cháng)達十年。從 Tahiti 到 2021 年的 Cezanne,GCN 經(jīng)歷了大量演變,但保留了其可識別的計算單元結構。因此,GCN 是歷史最悠久的圖形架構之一。即使在今天,GCN 的 DNA 仍然延續在 AMD 面向計算的 CDNA GPU 中。CDNA 線(xiàn)路取消了部分 GCN 的圖形功能,將重心轉向 FP64,但仍然是一個(gè)可識別的 GCN 衍生產(chǎn)品。
Radeon HD 7950 使用稍微縮減的 Tahiti 芯片
這篇文章將重點(diǎn)關(guān)注 GCN 早期 Tahiti 和 Hawaii 的發(fā)展情況。這里有來(lái)自 AMD Radeon HD 7950 的數據,它使用了稍微精簡(jiǎn)的 Tahiti 芯片。Hawaii 是 GCN 的放大版。它于一年后推出,對最初的 GCN 架構進(jìn)行了輕微增強,旨在與英偉達當時(shí)最大的 GPU 競爭。

MSI 的 Radeon R9 390 采用開(kāi)放式空氣冷卻器
Hawaii 首先推出了 R9 290 系列,但是會(huì )優(yōu)先考慮 R9 390。這是一個(gè)稍微精簡(jiǎn)的 Hawaii 芯片,配有 8 GB 的 VRAM。
系統架構
GCN 的基本構建模塊是計算單元(CU)。Tahiti 的著(zhù)色器陣列由 32 個(gè) CU 組成,HD 7950 啟用了 28 個(gè)。每個(gè) CU 都有一個(gè)專(zhuān)用的 16 KB 向量緩存和 64 KB 本地數據共享,但與多達四個(gè)相鄰 CU 共享一個(gè)指令緩存和標量緩存。
計算單元陣列可以由圖形命令處理器或異步計算引擎(ACEs)提供,具體取決于工作是在圖形隊列上提交還是在計算隊列上提交。對于計算工作負載,每個(gè) ACE 可以在每個(gè)周期啟動(dòng)一個(gè)波前。Tahiti 有兩個(gè) ACE,讓它在 GPU 上每個(gè)周期發(fā)射兩個(gè)波前。
對于圖形工作負載,GCN 的光柵化器消耗由頂點(diǎn)著(zhù)色器導出的屏幕空間坐標。它們每個(gè)時(shí)鐘可以處理一個(gè)基元,每個(gè)周期可以寫(xiě)出多達 16 個(gè)像素,因此每個(gè)光柵化器每四個(gè)周期可以發(fā)射一個(gè) 64 寬度的波前。Tahiti 有兩個(gè)光柵化器,讓它每?jì)蓚€(gè)周期發(fā)射一個(gè)像素波前。屏幕空間在兩個(gè)光柵器之間劃分,反映了 Cayman 的兩個(gè)圖形引擎的方法。Hawaii 使用了四個(gè)光柵化器,使其更快地填充著(zhù)色器陣列。
計算工作負載將其結果寫(xiě)入 VRAM,供未來(lái)的內核使用或復制回主機。對于圖形,像素著(zhù)色器導出被發(fā)送到渲染后端。Tahiti 上的每個(gè)渲染后端都有一個(gè) 16 KB 顏色緩存和一個(gè) 4 KB 深度緩存。最終像素顏色被寫(xiě)入內存控制器并繞過(guò)二級緩存。與 Terascale 不同的是,渲染后端與內存控制器分離,并且可以獨立于內存總線(xiàn)寬度進(jìn)行縮放。
GCN 的計算單元
GCN 的計算單元與 Terascale 的 SIMD 大致相當。兩者每周期都可以完成 64 次 FP32 運算,如果將熔合乘加運算計為兩次,則是原來(lái)的兩倍。然而,AMD 已完全重組了這個(gè)基本構建模塊,將 VLIW 捆綁打包從圖片中提出。計算單元由四個(gè)較小的 SIMD 組成,而不是一個(gè)能夠發(fā)出四次指令的大型 SIMD。每個(gè) SIMD 都有自己的 64 KB 向量寄存器文件和 10 項調度程序分區。線(xiàn)程內的執行現在是完全標量的,這意味著(zhù) CU 不能從同一線(xiàn)程的每個(gè)周期發(fā)出多條指令。然而,如果 SIMD 的調度程序分區中有多個(gè)線(xiàn)程已就緒,并且每個(gè)線(xiàn)程的就緒指令都發(fā)送到單獨的功能單元,那么 CU 可以每周期發(fā)射多達五個(gè)指令。
計算單元前端
計算單元(CU)的流水線(xiàn)從 32 KB、4 路組相聯(lián)的 L1 指令緩存中提取指令開(kāi)始。指令緩存使用 64 字節行,與 CPU 上常見(jiàn)的緩存行大小保持一致。一個(gè)指令緩存實(shí)例可由最多四個(gè)相鄰的計算單元共享,并可在每個(gè)周期向每個(gè)計算單元提供 32 字節。這可能是通過(guò)四分組的設置實(shí)現的,因此存儲器分組沖突可能減少指令帶寬。
Terascale 3 在多達四個(gè) SIMD 之間共享一個(gè) 48 KB 的 ALU 指令緩存,這與 GCN 有一定的相似性。由于 GCN 的可變長(cháng)度指令平均需要較少的存儲空間,AMD 得以將指令緩存大小削減到 32 KB。Terascale 3 使用了固定長(cháng)度的 64 位指令。一束指令的長(cháng)度可以根據編譯器打包的指令數量和立即值的多少而變化,范圍從 64 位到 384 位。GCN 的指令長(cháng)度為 32 位或 64 位,后面可以選擇逐添 1 個(gè) 32 位立即值。

指令帶寬需求可視化
英偉達的 Kepler 使用 8 KB 的指令緩存,專(zhuān)用于每個(gè) SMX。私有緩存更適合處理 Kepler 的高指令帶寬需求。一個(gè) SMX 需要每周期至少傳輸 6 條指令以滿(mǎn)足其 192 個(gè) FP32 單元的需求,因為英偉達的每條指令在 32 個(gè) 32 位元素的長(cháng)向量上進(jìn)行操作。使用固定長(cháng)度的 64 位指令,根據每條指令的靜態(tài)調度信息字節計算,Kepler 的指令緩存每周期需要提供 48 或 54 字節的指令。GCN 的計算單元每個(gè)周期只需要執行一條指令就可以使其向量執行單元飽和,這既是因為它的向量執行單元較少,也是因為每條 GCN 指令都在一個(gè) 64 長(cháng)的向量上操作。
調度和指令發(fā)布
一旦指令被獲取,它們將保存在一組指令緩沖區中。計算單元的四個(gè) SIMD 中的每一個(gè)都有一個(gè) 10 項的緩沖區,使其能夠跟蹤來(lái)自最多 10 個(gè)獨立線(xiàn)程的指令。因此,整個(gè)計算單元可以跟蹤 40 個(gè)線(xiàn)程(或波前)。對于 64 寬波前,計算單元可以在運行中執行 2560 個(gè) 32 位操作。
每個(gè)周期,計算單元選擇一個(gè) SIMD 并掃描它的 10 個(gè)線(xiàn)程,以查看是否有準備好執行的線(xiàn)程。GCN 可以通過(guò)選擇多個(gè)線(xiàn)程并發(fā)布不同類(lèi)別的指令來(lái)實(shí)現有限的多發(fā)射能力。例如,一個(gè)線(xiàn)程的標量算術(shù)邏輯單元 ALU(Arithmetic Logic Unit)指令可以與另一個(gè)線(xiàn)程的向量 ALU 指令同時(shí)發(fā)射。理論上,一個(gè)計算單元每個(gè)周期可以發(fā)出 5 條指令。但是如此高的發(fā)布率應該是罕見(jiàn)的,因為工作負載不太可能有來(lái)自不同類(lèi)別的指令的均勻混合。高占用率對充分利用這種多發(fā)射策略至關(guān)重要。如果 SIMD 有更多線(xiàn)程可以選擇,它將更有可能找到具有正確指令混合的多個(gè)線(xiàn)程以實(shí)現多發(fā)射。
假設達到理論占用率
GCN 的策略與 Terascale 形成鮮明對比,Terascale 強調從單個(gè)線(xiàn)程的多發(fā)射,這給編譯器帶來(lái)了巨大的負擔。編譯器必須找到在打包成捆時(shí)既獨立又不過(guò)度占用寄存器文件端口的指令。GCN 轉向使用線(xiàn)程級并行性意味著(zhù)編譯器可以忽略這些硬件細節。英偉達的 Kepler 采用了一種折中的方法。寄存器組沖突由硬件操作數收集器處理。編譯器負責在指令流中為雙發(fā)射標記成對的指令,但雙發(fā)射真正起到錦上添花的作用。與 Terascale 相比,即使不進(jìn)行多發(fā)射,Kepler 也能保持更好的吞吐量。
盡管 GCN 失去了從單個(gè)線(xiàn)程進(jìn)行多發(fā)射的能力,但它從一個(gè)線(xiàn)程發(fā)出請求的次數比 Terascale 要多。一個(gè) Terascale SIMD 有 16 個(gè)線(xiàn)程寬,每四個(gè)周期可以發(fā)射一個(gè)捆綁包,但不能連續執行來(lái)自同一線(xiàn)程的兩個(gè)捆綁包。因此,Terascale 需要在一個(gè) SIMD 中至少有兩個(gè)線(xiàn)程才能實(shí)現最大吞吐量。GCN 則消除了這一限制,因此 SIMD 上的線(xiàn)程可以每四個(gè)周期執行一次指令。Terascale 可以實(shí)現更高的單線(xiàn)程吞吐量,但前提是編譯器在將指令打包成捆綁包時(shí)做得足夠好。
在沒(méi)有寄存器組沖突和依賴(lài)延遲的情況下線(xiàn)程的發(fā)射速度的粗略設想。每個(gè)框代表一個(gè)周期。
與此同時(shí),Kepler 可以迅速處理單個(gè)線(xiàn)程。它使用 32 寬的波和 32 寬的執行單元,所以一個(gè)線(xiàn)程可以在每個(gè)周期發(fā)射一條指令。雙發(fā)射是錦上添花。因此,面對低占用率和有限的線(xiàn)程級并行性,Kepler 可以保持相當不錯的吞吐量。
寄存器文件
選定的指令從寄存器文件中讀取其輸入。在 GCN 中,Terascale SIMD 的巨大 256 KB 寄存器文件被拆分為四個(gè) 64 KB 寄存器文件,每個(gè) GCN SIMD 一個(gè)。GCN 的寄存器文件幾乎可以肯定是分組結構,但與 Terascale 相比,應該更少地受到寄存器組沖突的影響。假設仍然是四分組的寄存器文件,GCN 可以提供四個(gè)輸入,以供給可能需要多達三個(gè)輸入的指令(用于熔合乘加)。如果指令從標量寄存器或指令流中的立即值獲取輸入,對向量寄存器文件的帶寬需求可能會(huì )較低。最重要的是,GCN 可能有一個(gè)操作數收集器,可以在偶爾出現存儲器分組沖突的情況下,消除對寄存器文件帶寬的需求。
Terascale 需要復雜的調度和寄存器分配來(lái)實(shí)現良好的利用率。每個(gè) VLIW 通道只能將返回值寫(xiě)回到其對應的寄存器文件分組中,而在讀取端的任何寄存器組沖突都可能降低 VLIW 打包效果。由于 SMX 的 FP32 單元沒(méi)有足夠的寄存器文件帶寬來(lái)為 FMA 操作提供數據,因此 Kepler 需要付出更多的努力以實(shí)現完全優(yōu)化。
除了向量寄存器文件外,GCN 計算單元還有一個(gè) 8 KB 的標量寄存器文件。如果程序可以將一些變量存儲在標量寄存器中,就可以減少向量寄存器的使用并實(shí)現更高的占用率。
執行單元
GCN 中的每個(gè) SIMD 都有一個(gè) 16 路寬的執行單元。常見(jiàn)的 FP32 操作和整數加法以全速執行,而 32 位整數乘法和特殊功能以四分之一速率執行。理論吞吐量與 Terascale 3 相似。但是,GCN 不再需要將四條指令打包到每個(gè)捆綁包中以飽和計算單元,而是需要至少四個(gè)活躍線(xiàn)程來(lái)填充其四個(gè) SIMD。

去除貓毛后,準備重新粘貼 R9 390 進(jìn)行測試。以前的所有者有一只柴色的貓
Terascale 的分支單元被轉換為標量 ALU。盡管 GPU 主要是向量處理器,但它們仍然需要處理控制流和地址生成。這些操作通常在一個(gè)向量上是常數,所以標量 ALU 可以卸載這些計算。將這些標量操作移至專(zhuān)用單元有助于減輕向量 ALU 的負載并提高功率效率。
與 Kepler 的 SMX 相比,GCN 的計算單元更小,吞吐量更低。為了彌補這一缺陷,Tahiti 擁有的計算單元數量是 GK104 擁有 SMX 數量的四倍。

HD 7950 的側邊
Hawaii 擴展了著(zhù)色器陣列,使其可以實(shí)現超過(guò) 5 TFLOPS 的 FP32 吞吐量。然而,作為未來(lái)趨勢的一個(gè)標志,Hawaii 的 FP64 性能落后于 Tahiti。GCN 的 FP64 吞吐量可從半速配置到 1/16 速。Tahiti 采用與 GCN 最初計算設想相一致的 1/4 速 FP64 執行進(jìn)行配置。隨著(zhù) GPU 計算在客戶(hù)端應用中的重要角色逐漸明確,AMD 對 FP64 執行的投資減少。因此,Hawaii 采用了更普通的 1/8 速 FP64。但即使以 1/8 速,AMD 的客戶(hù)端顯卡在 FP64 性能上仍大幅領(lǐng)先于英偉達同類(lèi)產(chǎn)品。
計算單元數據緩存
AMD 重塑了緩存層次結構,以適應通用工作負載,而非僅專(zhuān)注于圖形。一個(gè) 16 KB 的 4 路組相聯(lián)向量緩存作為計算單元的主數據緩存。它使用 LRU 替換策略,64B 行,并且每周期可以為計算單元提供 64 字節。Terascale 的 8 KB 只讀紋理緩存可以提供相同的每周期帶寬,但 GCN 享有兩倍的緩存容量和更低延遲訪(fǎng)問(wèn)。
GCN 的矢量緩存也支持寫(xiě)入。L1 緩存是直寫(xiě)、寫(xiě)分配設計。它不如大多數 CPU 中的回寫(xiě)緩存好,但 L1 仍然可以在寫(xiě)入被傳遞到 L2 之前幫助合并寫(xiě)入。
盡管 GCN 相較于 Terascale 有了巨大的改進(jìn),但 Kepler 在向量訪(fǎng)問(wèn)方面的延遲仍然較低。AMD 希望通過(guò)優(yōu)化部分內存訪(fǎng)問(wèn)以使用標量路徑,來(lái)緩解這一問(wèn)題。

分析 RX 460 上運行的 Valheim。RX 460 使用北極星,GCN 架構的衍生物
標量存儲器訪(fǎng)問(wèn)由多達四個(gè)相鄰計算單元共享的 16 KB 4 路標量高速緩存提供服務(wù)。標量緩存每周期可向每個(gè)計算單元傳送 16 個(gè)字節,并針對低延遲進(jìn)行了優(yōu)化。標量緩存命中的延遲不到 50 納秒,這對于此時(shí)的 GPU 世界來(lái)說(shuō)是非??斓?。它與 Terascale 的紋理緩存 200+ ns 的延遲相去甚遠,比開(kāi)普勒的任何緩存都快,除了它的 2 KB 常量緩存。
與 Terascale 相比,GCN 在計算單元內的緩存策略既現代又靈活。除了對計算工作負載的巨大改進(jìn)外,GCN 的改變還應有助于圖形處理。將紋理緩存容量從 8 KB 增加到 16 KB 應該會(huì )減輕對芯片級互連的負載,并且較低的延遲意味著(zhù) GPU 在維持良好性能時(shí)需要較少運行中的工作。

描繪 GK104 Kepler。GK210 擁有 128 KB 的 L1 緩存/共享內存
英偉達的 Kepler 架構在緩存策略上既融合了過(guò)去的特點(diǎn),也具備新穎之處,類(lèi)似于 Fermi 架構。只讀紋理緩存仍然存在。但是 Kepler 還有一個(gè)單獨的 L1 數據緩存,它與本地內存共享存儲空間。如果這還不夠,Kepler 的 SMX 還具有私有的兩級常量緩存設置。常量緩存與 GCN 的標量緩存在功能上有一定重疊。但與 Fermi 不同,英偉達的編譯器不再?lài)L試為跨波形上的常量?jì)却嬖L(fǎng)問(wèn)使用常量緩存。您必須使用__constant 限定符顯式標記內存,以便使用常量緩存層次結構。
結果是,Kepler 具有三個(gè)獨立的數據緩存路徑,每個(gè)路徑都具有足夠的容量來(lái)獨立運行。這種緩存策略讓英偉達可以針對特定的工作負載類(lèi)型專(zhuān)門(mén)優(yōu)化每個(gè)緩存。紋理緩存具有極高的 96 路關(guān)聯(lián)性,并且常量緩存提供了非常低的延遲。但是,為所有內容設置獨立的緩存會(huì )占用面積。一個(gè) SMX 擁有 146 KB 的緩存和本地內存。

用于服務(wù)不同內存類(lèi)型的緩存
相比之下,一個(gè) GCN 計算單元有 80 KB 的專(zhuān)用數據緩存和便箋式存儲器。如果將 16 KB 的 L1 標量緩存分配給 4 個(gè) CPU,這個(gè)數字會(huì )上升到 84 KB。
本地內存
除了全局內存層次結構之外,每個(gè) GCN 計算單元都有一個(gè)名為 Local Data Share(LDS)的 64 KB 軟件管理的本地內存。OpenCL 將此內存類(lèi)型稱(chēng)為「本地內存」。LDS 的結構與 Terascale 中的類(lèi)似,但容量翻倍。它包括 32 個(gè)存儲器分組,每個(gè)分組每周期可以讀取一個(gè) 32 位元素,總共每周期實(shí)現 128 字節的帶寬。

來(lái)自 AMD GCN 的技術(shù)文檔
英偉達的 Kepler 會(huì )根據 GK104 或 GK210 變體的不同,從一個(gè) 64 KB 或 128 KB 的 SRAM 塊中動(dòng)態(tài)分配本地內存和 L1 緩存存儲空間。Nvidia 將本地內存稱(chēng)為「共享內存」。與 AMD 的實(shí)現類(lèi)似,Nvidia 的共享內存由 32 個(gè)存儲器分組組成,但每個(gè)分組寬度為 64 位。這為 Kepler 提供了每周期 256 字節的本地內存帶寬,使其更適合處理 64 位數據類(lèi)型。
正如之前提到的,當在 LDS 內進(jìn)行指針追蹤時(shí),GCN 的表現出奇地差。Tahiti 的表現比 Cayman(Terascale 3)差。Hawaii 的表現更好,但仍遠不及英偉達同時(shí)代的架構。
AMD 的優(yōu)勢在于通過(guò) LDS 同步線(xiàn)程。內置在 LDS 中的整數原子單元有助于加速這些操作。而英偉達的 Fermi 和 Kepler 架構沒(méi)有相應的功能。它們的共享內存非???,但是在原子操作的性能方面仍有很大的改進(jìn)空間。
二級緩存
與大多數 GPU 一樣,GCN 具有跨 GPU 共享的 L2 緩存。L2 緩存有助于處理 L1 未命中,并分為獨立的分片以提供高帶寬。每個(gè)分片具有 64 KB 或 128 KB 的緩存容量,并連接到一個(gè)內存控制器通道。Tahiti 和 Hawaii 似乎都使用 64 KB 分片。每周期一個(gè)分片可以讀取 64 字節,因此 Tahiti 的 L2 應具有每周期 768 字節的帶寬。因此,在 925 MHz 的 Boost 頻率下,HD 7950 理論上具有 710 GB/s 的 L2 帶寬。在 1 GHz 時(shí),R9 390 具有 1 TB/s 的 L2 帶寬。
Terascale 具有類(lèi)似的 L2 分片配置,每個(gè)分片為 64 KB,每周期提供 64 字節。然而,Terascale 的 L2 只是一個(gè)只讀紋理緩存。GCN 的 L2 采用了現代化的寫(xiě)回設計。寫(xiě)回緩存只在行被逐出時(shí)將寫(xiě)操作向下一級傳播,從而吸收寫(xiě)帶寬。此外,GCN 的 L2 分片可以處理原子操作。Terascale 上的原子操作將在單獨的、較小的讀寫(xiě)緩存中處理,并且性能較差。
關(guān)于 GCN 記憶子系統的評論
Terascale 的緩存是基于圖形處理構建的。著(zhù)色器程序不需要向內存中寫(xiě)入太多數據,它們的輸出被發(fā)送到專(zhuān)用的片上緩沖區。頂點(diǎn)著(zhù)色器會(huì )輸出到參數緩存和位置緩沖區,而像素著(zhù)色器會(huì )將其輸出發(fā)送到 ROPs(渲染輸出單元)。
根據 Terascale ISA(指令集架構)手冊,每個(gè)著(zhù)色器程序的輸出都通過(guò)專(zhuān)用的片上緩沖區進(jìn)行傳遞,以盡量減少 VRAM(顯存)寫(xiě)入。顯然,計算程序無(wú)法從這些特殊緩沖區中受益。
計算程序被硬擠進(jìn)這種現有結構。如果讓 Terascale 在 OpenCL 內核中從內存獲取數據,編譯器會(huì )發(fā)出頂點(diǎn)獲取或紋理采樣子句。主要的 L1/L2 緩存是只讀紋理緩存,因此寫(xiě)帶寬表現不佳。
GCN 使緩存層次結構現代化,緩存設置類(lèi)似于 GPU 上現在有的布局。主要的 L1/L2 緩存得到寫(xiě)入支持。所有緩存中的標準 64 字節緩存行,可以輕松實(shí)現與 CPU 的數據共享。它們還是虛擬地址,只要緩存命中,TLB(轉換后援緩沖)未命中就不可能發(fā)生。緩存延遲和帶寬數字相較于 Terascale 都得到了顯著(zhù)改善。在 28nm 制程時(shí)代,GCN 使 AMD 在帶寬方面取得了很大的領(lǐng)先優(yōu)勢。這與 40nm 制程時(shí)代相反,那時(shí) Fermi 通常比 Terascale 顯卡具有更高的帶寬。
隨著(zhù) AMD 繼續迭代 GCN,緩存層次結構得到了進(jìn)一步的現代化。在 GCN 第三代中,只讀標量緩存獲得了寫(xiě)入支持。Vega 在 GCN 第三代之后問(wèn)世,并將命令處理器和渲染后端置于 L2 之前。這有助于減少 L2 刷新并提高寫(xiě)帶寬。

來(lái)自 AMD 關(guān)于 RDNA 架構的演示
盡管經(jīng)歷了重大變革,但 Terascale 的部分遺留特性仍然存在。四個(gè)計算單元共享指令和標量緩存,有助于減少芯片上用于緩存的面積。這與 Kepler 的方法形成了鮮明對比,在 Kepler 中,設計師全力打造每個(gè) SMX 的緩存。部分原因在于,像與同時(shí)代的英偉達競爭產(chǎn)品一樣,GCN 保持了非常高的計算密度。
計算性能(VkFFT)
VkFFT 在多個(gè)不同的 GPU 計算 API 中實(shí)現了快速傅里葉變換(FFT)。它是一個(gè)現代且目前仍在維護的項目,2010 年代初期的 GPU 在完成完整基準測試時(shí)可能會(huì )遇到困難。但是每個(gè)平臺都可以通過(guò)前幾個(gè)子測試,有足夠的數據展示 GCN 的計算潛力。VkFFT 可能受內存限制較大,而 GCN 的大容量?jì)却婵偩€(xiàn)使其表現出色。
HD 7950 在與 GTX 680 的對比中表現出色。Hawaii 架構的 R9 390 擴大了該優(yōu)勢。VkFFT 還會(huì )輸出預估的帶寬數據,這些數據展示了龐大的 512 位 GDDR5 總線(xiàn)所能帶來(lái)的性能。
等一下,Oland 使用 128 位 DDR3 總線(xiàn)在這里是怎么回事?
遺憾的是,Tesla K80 無(wú)法參加 Vulkan 基準測試,因為無(wú)法讓 Vulkan 在該云實(shí)例上工作。幸運的是,OpenCL 幾乎可以在所有設備上運行,而且 VkFFT 也可以使用它。
當大型 GCN 與大型 Kepler 對決時(shí),GCN 極高的計算密度和高內存帶寬使它在每個(gè)子測試中保持領(lǐng)先。GK210 的 384 位總線(xiàn)被 Hawaii 的 512 位總線(xiàn)超越。最重要的是,Hawaii 的頻率也更高,略高于 1 GHz。Tesla K80 的運行頻率約為 875 MHz,因為 GK210 芯片必須適應 150W 的功耗范圍。
VkFFT 的預估帶寬數字再次展示了 GCN 在帶寬方面的優(yōu)勢。Tesla K80 的每個(gè) GK210 芯片只有 240 GB/s 的理論帶寬,而 R9 390 的理論帶寬為 384 GB/s。VkFFT 在 RDNA 2 上進(jìn)行分析時(shí)并不支持緩存,RX 6900 XT 的 4 MB L2 幾乎沒(méi)有任何命中。K80 和 R9 390 很可能處于類(lèi)似的情況。
關(guān)于圖形性能的一點(diǎn)說(shuō)明
對于某些計算工作負載,GCN 的計算密度和高內存帶寬可以讓它在與英偉達 Kepler 架構的競爭中大幅領(lǐng)先。然而,在圖形負載方面可能是另一番情況。GCN 的大規模著(zhù)色器陣列在具有較長(cháng)持續時(shí)間的大規模工作負載上表現出色。一些圖形工作負載,比如全屏像素著(zhù)色器,就屬于這一類(lèi)。然而,較小的工作負載可能會(huì )讓 Kepler 占據優(yōu)勢。

處理簡(jiǎn)單幾何圖形的頂點(diǎn)著(zhù)色器等小型工作負載對任何 GPU 來(lái)說(shuō)都具有挑戰性,但 GCN 比 Kepler 的表現更糟
相對于計算,Kepler 在固定功能圖形硬件上花費更多的面積。GK104 擁有四個(gè)光柵化分區,每個(gè)分區有兩個(gè) SMX。如果 Kepler 保持與 Fermi 相同的光柵化吞吐量,每個(gè)光柵化器每時(shí)鐘周期可以處理一個(gè)圖元并輸出 8 個(gè)像素。為了實(shí)現 Kepler 完整的計算吞吐量,每個(gè) SMX 需要為其四個(gè)調度分區中的每一個(gè)分配至少一個(gè)波。在沒(méi)有小三角形吞吐量損失的前提下,損失光柵化器可以在 32 個(gè)周期內創(chuàng )建訪(fǎng)問(wèn) Kepler 所有計算潛力所需的最小像素工作量。Kepler 每個(gè) SMX 調度分區的全部占用(每分區 16 個(gè)波)至少需要 512 個(gè)周期才能達到。
Tahiti 有兩個(gè)光柵化器來(lái)為一組 32 個(gè)計算單元(CU)提供輸入,即每 16 個(gè)計算單元有一個(gè)光柵化器。每個(gè)光柵化器每時(shí)鐘周期可以處理一個(gè)圖元,并在每四個(gè)周期內創(chuàng )建一個(gè) 64 寬的像素工作波。與 Kepler 的 SMX 類(lèi)似,GCN 的計算單元需要為每個(gè) SIMD 分配至少一個(gè)波,以實(shí)現完整的吞吐量。光柵化器需要 256 個(gè)時(shí)鐘周期來(lái)實(shí)現這一點(diǎn)。達到最大占用率需要 2560 個(gè)時(shí)鐘周期。

來(lái)自 AMD 的 GDC 2018 的演示. GK104 Kepler 的「SE:CU」比例式 1;2
Hawaii 通過(guò)增加到四個(gè)光柵化器來(lái)改善這種情況。對于每個(gè)光柵化器的 11 個(gè)計算單元,第二代 GCN 可以在 176 個(gè)周期內實(shí)現每個(gè) SIMD 一個(gè)波,以及在 1760 個(gè)周期內實(shí)現完全占用。然后,像 Vega 64 和 Fury X 這樣的更大型 GCN 實(shí)現再次擴展了著(zhù)色器陣列,將 SE(Shader Engine)與計算單元的比例恢復到 1:16。
放大在 6900 XT 上運行的瓦爾海姆的 RGP 配置文件,顯示了光柵化器填充著(zhù)色器陣列時(shí)的延遲。同樣的情況也適用于 GCN,但 GCN 應該更糟
每線(xiàn)程性能是另一個(gè)問(wèn)題。圖形渲染可能涉及具有有限并行性的序列。與 Terascale 相比,GCN 可能提供更為穩定的每線(xiàn)程性能。但是,Kepler 可以為單個(gè)線(xiàn)程提供更多的執行資源,這在具有大量小型繪制調用的序列中非常重要。
放大觀(guān)察在 6900 XT 上運行的 Cyberpunk 2077 剖析,顯示具有有限并行性和短周期的小型繪制調用。在這類(lèi)序列中,Kepler 應該優(yōu)于 GCN。
因此,高端 GCN GPU 通常在較高分辨率下表現良好。渲染更多像素意味著(zhù)更多的并行性,這使得線(xiàn)程啟動(dòng)速率和每線(xiàn)程執行時(shí)間相較于 GPU 的整體吞吐量變得不那么重要。
寫(xiě)在最后
GCN 是一個(gè)完全現代化的架構。該設計的調度、執行單元布局和緩存設置與 RDNA 3 和英偉達的 Ada Lovelace 具有更多共同點(diǎn),而不像其直接前身 Terascale 3。與最近的 GPU 一樣,GCN 的設計在計算和圖形方面都具有很好的定位。然而,AMD 側重于計算的轉變并未取得成功。與英偉達的生態(tài)系統優(yōu)勢相比,GCN 的通用設計并沒(méi)有太大意義。CUDA 在 OpenCL 之前成熟,并附帶一套預優(yōu)化的庫。更糟糕的是,GPU 計算在消費者領(lǐng)域并未蒸蒸日上。游戲性能仍然是最重要的。

MSI 的 R9 390 使用雙槽冷卻器和五個(gè)熱管來(lái)冷卻 Hawaii 芯片
在 2010 年代初至中期,光柵化圖形繼續主導游戲市場(chǎng)。AMD 在 Hawaii 中擴展了 GCN 的工作分配硬件,但英偉達在 Maxwell 和 Pascal 中取得了巨大的提升。GCN 在性能和能效方面仍然難以與之匹配。

AMD 希望您編寫(xiě)計算著(zhù)色器
雖然這對 2012 年的 AMD 來(lái)說(shuō)可能沒(méi)什么慰藉,但現代趨勢已經(jīng)證實(shí)了 GCN 設計的合理性。固定功能圖形硬件仍然重要,但游戲已逐漸趨向于使用更多的計算。光線(xiàn)追蹤是一個(gè)廣為人知的例子。光線(xiàn)追蹤基本上是一種計算工作負載,它不使用光柵化器。然而,即使沒(méi)有光線(xiàn)追蹤,計算著(zhù)色器也在現代游戲中悄然發(fā)揮著(zhù)更大的作用?,F代設計采用了 GCN 設計的一些元素。RDNA 保留了標量數據路徑,并使用了類(lèi)似的指令集。英偉達在其 Turing 架構中加入了標量路徑(稱(chēng)為統一數據路徑),并將其保留在后續設計中。
如今,得益于更高的顯存容量,HD 7950 比 GTX 680 更具可用性。GCN 的設計也更傾向于大型、長(cháng)時(shí)間運行的內核,因為這可以讓 GCN 的大型著(zhù)色器陣列更好地發(fā)揮作用,同時(shí)減輕了光柵化器快速啟動(dòng)波前來(lái)填充它的壓力。這使得 Tahiti 更有能力應對新游戲帶來(lái)的更高著(zhù)色器工作負載。R9 390 也是如此。幾個(gè)月前,我收到了一位朋友的朋友不再使用的這款顯卡,但這并不是因為這款顯卡性能不足。相反地,這款 R9 390 為他效力的時(shí)間太長(cháng),以至于散熱膏都已經(jīng)干掉,導致性能極度降低。
評論