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