AMD 長(zhǎng)期以來(lái)一直在爭(zhēng)奪 GPU 計(jì)算市場(chǎng)份額。自從 Nvidia 憑借其 Tesla 架構(gòu)搶占先機(jī)以來(lái),AMD 就一直在追趕。Terascale 3 從 VLIW5 遷移到 VLIW4,以提高計(jì)算工作負(fù)載中執(zhí)行單元的利用率。GCN 取代了 Terascale,并強(qiáng)調(diào) GPGPU 和圖形應(yīng)用程序的一致性能。然后,AMD 將其 GPU 架構(gòu)開(kāi)發(fā)分為單獨(dú)的 CDNA 和 RDNA 線路,分別專(zhuān)門(mén)用于計(jì)算和圖形。
CDNA 2 最終為 AMD 帶來(lái)了顯著的成功。MI250X 和 MI210 GPU 贏得了多個(gè)超級(jí)計(jì)算機(jī)合同,其中包括 ORNL 的 Frontier,該計(jì)算機(jī)在 2023 年 11 月的 TOP500 排行榜上排名第一。但是,雖然 CDNA2 提供了穩(wěn)定且經(jīng)濟(jì)高效的 FP64 計(jì)算,但 H100 擁有更好的 AI 性能并提供了更大的統(tǒng)一 GPU。
CDNA 3 希望通過(guò)提供 AMD 提供的所有功能來(lái)縮小這些差距。MI300X 配備了先進(jìn)的小芯片設(shè)置,充分展示了該公司在先進(jìn)封裝技術(shù)方面的經(jīng)驗(yàn)。與 Infinity Fabric 組件一起,先進(jìn)的封裝使 MI300X 能夠進(jìn)行擴(kuò)展,以與 Nvidia 最大的 GPU 競(jìng)爭(zhēng)。在內(nèi)存方面,RDNA 系列的 Infinity Cache 被引入 CDNA 領(lǐng)域,以緩解帶寬問(wèn)題。但這并不意味著 MI300X 的內(nèi)存帶寬很輕。它仍然擁有龐大的 HBM 設(shè)置,使其兩全其美。最后,CDNA 3 的計(jì)算架構(gòu)獲得了顯著的世代改進(jìn),以提高吞吐量和利用率。
01.?GPU布局
AMD 一直有使用小芯片來(lái)廉價(jià)擴(kuò)展 Ryzen 和 Epyc CPU 核心數(shù)量的傳統(tǒng)。MI300X 在高級(jí)別上使用類(lèi)似的策略,將計(jì)算拆分到加速器復(fù)合芯片 (XCD) 上。XCD 類(lèi)似于 CDNA 2 或 RDNA 3 的圖形計(jì)算芯片 (GCD) 或 Ryzen 的核心復(fù)合芯片 (CCD)。AMD 可能會(huì)更改命名,因?yàn)?CDNA 產(chǎn)品缺乏 RDNA 系列中的專(zhuān)用圖形硬件。
每個(gè) XCD 包含一組核心和一個(gè)共享緩存。具體來(lái)說(shuō),每個(gè) XCD 物理上都有 40 個(gè) CDNA 3 計(jì)算單元,其中 38 個(gè)在 MI300X 上的每個(gè) XCD 上啟用。XCD 上也有一個(gè) 4 MB 二級(jí)緩存,為芯片的所有 CU 提供服務(wù)。MI300X 有 8 個(gè) XCD,總共有 304 個(gè)計(jì)算單元。
這比 MI250X 的 220 個(gè) CU 有了很大的增加。更好的是,MI300X 可以將所有這些 CU 作為單個(gè) GPU 公開(kāi)。在 MI250X 上,程序員必須手動(dòng)在兩個(gè) GPU 之間分配工作,因?yàn)槊總€(gè) GPU 都有單獨(dú)的內(nèi)存池。
Nvidia 的 H100 由 132 個(gè)流式多處理器 (SM) 組成,并將它們作為一個(gè)大型統(tǒng)一 GPU 呈現(xiàn)給程序員。H100 采用傳統(tǒng)方法,在大型單片芯片上實(shí)現(xiàn)所有計(jì)算。即使所有東西都在同一個(gè)芯片上,H100 也太大了,無(wú)法讓所有 SM 平等地訪問(wèn)緩存。因此,H100 將 L2 拆分為兩個(gè)實(shí)例。單個(gè) SM 可以使用全部 50 MB 的 L2,但訪問(wèn)超過(guò) 25 MB 會(huì)導(dǎo)致性能損失。
盡管如此,Nvidia 的策略比 MI300X 的策略更有效地利用了緩存容量。MI300X XCD 不會(huì)使用其他 XCD 上的 L2 容量進(jìn)行緩存,就像 Epyc/Ryzen 上的 CCD 不會(huì)分配到彼此的 L3 緩存中一樣。
英特爾的 Ponte Vecchio (PVC) 計(jì)算 GPU 進(jìn)行了非常有趣的比較。PVC 將其基本計(jì)算構(gòu)建塊放置在稱(chēng)為“Compute Tiles”的芯片中,這大致類(lèi)似于 CDNA 3 的 XCD。同樣,PVC 的 Base Tile 具有與 CDNA 3 的 IO 芯片類(lèi)似的功能。兩者都包含大型末級(jí)緩存和 HBM 內(nèi)存控制器。與 MI300X 一樣,Ponte Vecchio 卡可以作為具有統(tǒng)一內(nèi)存池的單個(gè) GPU 公開(kāi)。
然而,也存在重要的差異。與 CDNA 3 XCD 上的 38 個(gè)計(jì)算單元相比,Ponte Vecchio 的計(jì)算塊更小,只有 8 個(gè) Xe 核心。英特爾沒(méi)有使用計(jì)算塊寬緩存,而是使用更大的 L1 緩存來(lái)減少跨芯片流量需求。使用兩層 Ponte Vecchio 部件作為統(tǒng)一 GPU 也帶來(lái)了挑戰(zhàn)。兩個(gè)堆棧之間的 EMIB 橋僅提供 230 GB/s 的帶寬,如果訪問(wèn)跨所有內(nèi)存控制器進(jìn)行條帶化,則不足以充分利用 HBM 帶寬。為了解決這個(gè)問(wèn)題,英特爾提供了 API,可以讓程序在 NUMA 配置中與 GPU 配合使用。
在物理構(gòu)造方面,PVC和CDNA 3的設(shè)計(jì)面臨著不同的挑戰(zhàn)。CDNA 3 提供具有 HBM 的統(tǒng)一內(nèi)存池的能力需要 IO 芯片之間的高帶寬。PVC 使用帶寬相對(duì)較低的 EMIB 鏈路。但 PVC 的設(shè)計(jì)變得復(fù)雜,因?yàn)樗褂盟姆N具有不同工藝節(jié)點(diǎn)和鑄造廠的模具類(lèi)型。AMD 在 MI300X 中僅使用兩種芯片類(lèi)型,并且兩個(gè)節(jié)點(diǎn)(6 納米和 5 納米)均來(lái)自臺(tái)積電。
02.?解決帶寬問(wèn)題
幾十年來(lái),計(jì)算速度一直超過(guò)內(nèi)存。與 CPU 一樣,GPU 也通過(guò)日益復(fù)雜的緩存策略來(lái)應(yīng)對(duì)這一問(wèn)題。CDNA 2 使用具有 8 MB L2 的傳統(tǒng)兩級(jí)緩存層次結(jié)構(gòu),依靠 HBM2e 來(lái)保持執(zhí)行單元的運(yùn)行。但即使使用 HBM2e,MI250X 的帶寬需求也比 Nvidia 的 H100 更嚴(yán)重。如果 AMD 只是增加更多的計(jì)算能力,帶寬匱乏可能會(huì)成為一個(gè)嚴(yán)重的問(wèn)題。因此,AMD 借鑒了 RDNA(2) 的經(jīng)驗(yàn),添加了“無(wú)限緩存”。
與消費(fèi)級(jí) RDNA GPU 非常相似,MI300 的無(wú)限緩存就是技術(shù)文檔中所稱(chēng)的“附加最后一級(jí)內(nèi)存”(MALL),這是一種奇特的說(shuō)法,表示最后一級(jí)緩存級(jí)別是內(nèi)存端緩存。與更靠近計(jì)算單元的 L1 和 L2 緩存相比,Infinity Cache 連接到內(nèi)存控制器。所有內(nèi)存流量都會(huì)通過(guò)無(wú)限緩存,無(wú)論它來(lái)自哪個(gè)塊。其中包括 IO 流量,因此對(duì)等 GPU 之間的通信可以受益于無(wú)限緩存帶寬。由于無(wú)限高速緩存始終具有 DRAM 內(nèi)容的最新視圖,因此它不必處理窺探或其他高速緩存維護(hù)操作。
但由于內(nèi)存端緩存距離計(jì)算較遠(yuǎn),因此通常會(huì)出現(xiàn)較高的延遲。因此,AMD 在 CDNA 3 和 RDNA 2 上都配備了數(shù)兆字節(jié)的 L2 緩存,以將計(jì)算與內(nèi)存端緩存的較低性能隔離開(kāi)來(lái)。
與 RDNA 2 一樣,CDNA 3 的無(wú)限緩存是 16 路組相聯(lián)的。然而,CDNA 3 的實(shí)現(xiàn)針對(duì)帶寬比針對(duì)容量進(jìn)行了更優(yōu)化。它由 128 個(gè)片組成,每個(gè)片容量為 2 MB,每個(gè)周期讀取帶寬為 64 字節(jié)。所有切片每個(gè)周期總共可以傳輸 8192 字節(jié),這對(duì)于 2.1 GHz 下的 17.2 TB/s 來(lái)說(shuō)是不錯(cuò)的。
相比之下,RDNA 2 的 128 MB 無(wú)限緩存可以在所有片上每個(gè)周期提供 1024 字節(jié),從而在 2.5 GHz 下提供 2.5 TB/s 的理論帶寬。芯片截圖顯示每個(gè) Infinity Cache 片有 4 MB 的容量,并提供 32B/周期。因此,RDNA 2 使用更大的slice、更少的slice,并且每個(gè)slice的帶寬也更少。
MI300X 對(duì)帶寬的關(guān)注意味著計(jì)算密度較低的工作負(fù)載如果能夠獲得足夠的無(wú)限緩存命中,仍然可以享受不錯(cuò)的性能。這應(yīng)該會(huì)讓 CDNA 3 的執(zhí)行單元更容易運(yùn)行,盡管主內(nèi)存帶寬與計(jì)算的比率沒(méi)有太大變化并且仍然落后于 Nvidia。
如果我們使用 Infinity Cache 的理論帶寬構(gòu)建 MI300X 的屋頂線模型,我們可以實(shí)現(xiàn)完整的 FP64 吞吐量,每字節(jié)加載 4.75 FLOP。與 DRAM 相比,這是一個(gè)巨大的改進(jìn),DRAM 每加載一個(gè)字節(jié)需要 14.6FLOP 到 15 次 FLOP。
03.?跨芯片帶寬可能面對(duì)的挑戰(zhàn)
MI300X 的 Infinity Fabric 跨越四個(gè) IO 芯片,每個(gè)芯片連接到兩個(gè) HBM 堆棧和關(guān)聯(lián)的緩存分區(qū)。然而,當(dāng) MI300X 作為具有統(tǒng)一內(nèi)存池的單個(gè)邏輯 GPU 運(yùn)行時(shí),芯片到芯片連接的帶寬可能會(huì)限制實(shí)現(xiàn)完整的無(wú)限緩存帶寬。如果內(nèi)存訪問(wèn)在內(nèi)存控制器(以及緩存分區(qū))上均勻分布,就像大多數(shù) GPU 設(shè)計(jì)的典型情況一樣,可用的芯片到芯片帶寬可能會(huì)阻止應(yīng)用程序達(dá)到理論上的無(wú)限緩存帶寬。
首先,讓我們關(guān)注單個(gè) IO die 分區(qū)。它沿著與其他 IO 芯片相鄰的兩個(gè)邊緣具有 2.7 TB/s 的入口帶寬。它的兩個(gè) XCD 可以獲得 4.2 TB/s 的 Infinity 緩存帶寬。如果 L2 未命中請(qǐng)求在芯片上均勻分布,則該帶寬的 3/4 或 3.15 TB/s 必須來(lái)自對(duì)等芯片。由于 3.15 TB/s 大于 2.7 TB/s,跨芯片帶寬將限制可實(shí)現(xiàn)的緩存帶寬。
我們可以在對(duì)角添加芯片而不會(huì)產(chǎn)生任何差異,因?yàn)槠渌璧乃行酒g帶寬都在相反的方向上。MI300X 具有雙向芯片到芯片鏈接。
如果所有芯片都需要統(tǒng)一配置中的最大無(wú)限緩存帶寬,事情就會(huì)變得更加復(fù)雜。消耗額外的跨芯片帶寬,因?yàn)閷?duì)角芯片之間的傳輸需要兩跳,這會(huì)減少每個(gè)芯片可用的入口帶寬。
雖然 MI300X 的設(shè)計(jì)就像一個(gè)大型 GPU,但將 MI300X 拆分為多個(gè) NUMA 域可以提供更高的組合無(wú)限緩存帶寬。AMD 可能會(huì)有一個(gè) API,可以在不同的 IO 芯片之間透明地分割程序。此外,高 L2 命中率(hit rates)將最大限度地減少帶寬問(wèn)題的可能性,這將有助于避免這些瓶頸。在 Infinity Cache 命中率較低的情況下,MI300X 的芯片間鏈接足夠穩(wěn)健,并提供充足的帶寬來(lái)順利處理 HBM 流量。
04.?跨XCD一致性
盡管無(wú)限緩存不必?fù)?dān)心一致性,但二級(jí)緩存卻需要擔(dān)心。普通 GPU 內(nèi)存訪問(wèn)遵循寬松的一致性模型,但程序員可以使用atomics來(lái)強(qiáng)制線程之間的排序。AMD GPU 上的內(nèi)存訪問(wèn)也可以用 GLC 位(全局級(jí)一致:Global Level Coherent)進(jìn)行標(biāo)記。如果 AMD 希望將 MI300X 作為單個(gè)大 GPU 而不是像 MI250X 那樣的多 GPU 配置,那么這些機(jī)制仍然必須發(fā)揮作用。
在之前的 AMD GPU 上,atomics和coherent 訪問(wèn)是在 L2 處理的。設(shè)置 GLC 位的加載將繞過(guò) L1 緩存,從而從 L2 獲取最新的數(shù)據(jù)副本。這不適用于 MI300X,因?yàn)榫彺嫘械淖钚赂北究赡芪挥诹硪粋€(gè) XCD 的 L2 緩存上。AMD 可以使相干訪問(wèn)繞過(guò) L2,但這會(huì)降低性能。這可能適用于游戲 GPU,因?yàn)橛螒?GPU 的一致性訪問(wèn)并不是太重要。但 AMD 希望 MI300X 在計(jì)算工作負(fù)載方面表現(xiàn)良好,并需要 MI300A(APU 變體)在 CPU 和 GPU 之間高效共享數(shù)據(jù)。這就是 Infinity Fabric 的用武之地。
與 Ryzen 上的 Infinity Fabric 一樣,CDNA 3 具有 XCD 連接到 IO 芯片的 Coherent Master(CM)。相干從屬設(shè)備 (CS:Coherent Slaves) 與無(wú)限高速緩存 (IC:Infinity Cache) 片一起位于每個(gè)內(nèi)存控制器中。我們可以通過(guò) Ryzen 文檔推斷它們是如何工作的,該文檔顯示 Coherent Slaves 有一個(gè)探針過(guò)濾器和用于處理原子事務(wù)的硬件。MI300X 可能有類(lèi)似的 CS 實(shí)現(xiàn)。
如果 CS 上出現(xiàn)一致寫(xiě)入,則必須確保任何執(zhí)行一致讀取的線程都會(huì)觀察到該寫(xiě)入,無(wú)論該線程在 GPU 上的何處運(yùn)行。這意味著任何緩存了該行的 XCD 都必須從 Infinity Cache 重新加載它才能獲取最新數(shù)據(jù)。這一般會(huì)讓我們認(rèn)為,CS 必須跨所有 XCD 探測(cè) L2 緩存,因?yàn)槠渲腥魏我粋€(gè)都可以緩存相應(yīng)的數(shù)據(jù)。探測(cè)過(guò)濾器通過(guò)跟蹤哪些 XCD 實(shí)際緩存了該行來(lái)幫助避免這種情況,從而避免不必要的探測(cè)流量。CDNA 3 的白皮書(shū)稱(chēng)窺探過(guò)濾器(探針過(guò)濾器的另一個(gè)名稱(chēng))足夠大,可以覆蓋多個(gè) XCD L2 緩存。我當(dāng)然相信他們,因?yàn)?MI300X 在所有 8 個(gè) XCD 上都有 32 MB 的 L2。即使是消費(fèi)級(jí) Ryzen 部件也可以擁有更多 CCD 專(zhuān)用緩存,供探針過(guò)濾器覆蓋。
得益于 CS 和 CM 等類(lèi)似 CPU 的 Infinity Fabric 組件,XCD 可以擁有私有回寫(xiě)式 L2 緩存,能夠處理芯片內(nèi)一致訪問(wèn),而無(wú)需跨越 IO 芯片結(jié)構(gòu)。AMD 本來(lái)可以采用一種簡(jiǎn)單的解決方案,即連貫操作和atomics繞過(guò) L2 直接進(jìn)入無(wú)限緩存。這樣的解決方案將節(jié)省工程工作并創(chuàng)建更簡(jiǎn)單的設(shè)計(jì),但代價(jià)是降低一致性操作的性能。顯然,AMD 認(rèn)為優(yōu)化原子和相干訪問(wèn)非常重要,因此需要付出更多努力。
然而,XCD 中的 CDNA 3 的工作方式仍然與之前的 GPU 非常相似。顯然,正常的內(nèi)存寫(xiě)入不會(huì)像 CPU 那樣自動(dòng)使來(lái)自對(duì)等緩存的寫(xiě)入行無(wú)效。相反,代碼必須顯式告訴 L2 write back dirty lines,并使對(duì)等 L2 緩存使非本地 L2 行無(wú)效。
05.?二級(jí)緩存
靠近計(jì)算單元,每個(gè) MI300X XCD 都包含一個(gè) 4 MB 二級(jí)緩存。L2 是更傳統(tǒng)的 GPU 緩存,由 16 個(gè)slice構(gòu)建。每個(gè) 256 KB slice可以提供每個(gè)周期 128 字節(jié)的帶寬。在 2.1 GHz 下,這對(duì)于 4.3 TB/s 來(lái)說(shuō)是不錯(cuò)的。作為與計(jì)算單元位于同一芯片上的最后一級(jí)緩存,L2 在充當(dāng) L1 未命中(misses)的后備裝置方面發(fā)揮著重要作用。
與H100和MI250X相比,MI300X具有更高的L2帶寬計(jì)算比。由于每個(gè) XCD 都配有 L2,因此隨著 CDNA 3 產(chǎn)品配備更多 XCD,L2 帶寬自然會(huì)擴(kuò)展。換句話說(shuō),MI300X 的 L2 布局避免了將單個(gè)緩存連接到大量計(jì)算單元并維持大量帶寬的問(wèn)題。
PVC的L2則形成鮮明對(duì)比。隨著英特爾添加更多計(jì)算塊,基礎(chǔ)塊的共享 L2 的帶寬需求也不斷增加。從緩存設(shè)計(jì)的角度來(lái)看,PVC 的配置更簡(jiǎn)單,因?yàn)?L2 充當(dāng)單點(diǎn)一致性和 L1 未命中的后備。但它無(wú)法提供與 MI300X 的 L2 一樣多的帶寬。MI300X 還可能享有更好的 L2 延遲,使應(yīng)用程序更容易利用緩存帶寬。
06.?一級(jí)緩存
CDNA 3 對(duì)高緩存帶寬的關(guān)注延續(xù)到了 L1。在與 RDNA 相匹配的舉措中,CDNA 3 的 L1 吞吐量從每周期 64 字節(jié)增加到 128 字節(jié)。與 GCN 中的 2048 位相比,CDNA 2 將每 CU 向量吞吐量提高到每周期 4096 位,因此 CDNA 3 翻倍的 L1 吞吐量有助于保持與 GCN 相同的計(jì)算與 L1 帶寬比率。
除了更高的帶寬外,CDNA 3 還將 L1 容量從 16 KB 增加到 32 KB。這一舉措再次反映了 RDNA 系列的發(fā)展,其中 RDNA 3 的一級(jí)緩存也獲得了類(lèi)似的大小提升。較大緩存的較高命中率將降低平均內(nèi)存訪問(wèn)延遲,從而提高執(zhí)行單元利用率。從 L2 及更高層傳輸數(shù)據(jù)會(huì)消耗電力,因此更高的命中率也有助于提高電力效率。
雖然 CDNA 3 改進(jìn)了一級(jí)緩存,但 Ponte Vecchio 仍然是該類(lèi)別的冠軍。PVC 中的每個(gè) Xe 核心每個(gè)周期可傳輸 512 字節(jié),為英特爾提供非常高的 L1 帶寬計(jì)算比。L1 也很大,為 512 KB。適合 L1 的內(nèi)存綁定內(nèi)核將在英特爾架構(gòu)上表現(xiàn)良好。然而,Ponte Vecchio 缺乏計(jì)算塊級(jí)別的中級(jí)緩存,并且當(dāng)數(shù)據(jù)溢出 L1 時(shí)可能會(huì)面臨嚴(yán)酷的性能懸崖。
07.?調(diào)度和執(zhí)行單元
復(fù)雜的小芯片設(shè)置和修改后的緩存層次結(jié)構(gòu)讓 AMD 將 MI300X 作為單個(gè) GPU 呈現(xiàn),從而解決了 MI250X 的最大弱點(diǎn)之一。但 AMD 并沒(méi)有就此解決。他們還對(duì)核心計(jì)算單元架構(gòu)進(jìn)行了迭代改進(jìn),解決了 CDNA 2 使用 FP32 單元的困難。
當(dāng) CDNA 2 轉(zhuǎn)向原生處理 FP64 時(shí),AMD 通過(guò)打包執(zhí)行提供了雙倍速率 FP32。編譯器必須將兩個(gè) FP32 值打包到相鄰的寄存器中,并對(duì)這兩個(gè)值執(zhí)行相同的指令。通常,除非程序員明確使用向量,否則編譯器很難實(shí)現(xiàn)這一點(diǎn)。
CDNA 3 通過(guò)更靈活的雙發(fā)行機(jī)制解決了這個(gè)問(wèn)題。最有可能的是,這是 GCN 多問(wèn)題功能的擴(kuò)展,而不是 RDNA 3 的 VOPD/wave64 方法。每個(gè)周期,CU 調(diào)度程序都會(huì)選擇四個(gè) SIMD 之一,并檢查其線程是否已準(zhǔn)備好執(zhí)行。如果多個(gè)線程準(zhǔn)備就緒,GCN 可以選擇最多五個(gè)線程發(fā)送到執(zhí)行單元。當(dāng)然,GCN SIMD 只有一個(gè) 16 寬向量 ALU,因此 GCN 必須選擇具有不同指令類(lèi)型的線程,準(zhǔn)備好進(jìn)行多發(fā)出。例如,標(biāo)量 ALU 指令可以與矢量 ALU 指令一起發(fā)出。
另一種方法是利用 wave64 更寬的寬度,讓線程在四個(gè)周期內(nèi)完成兩條向量指令。然而,這樣做會(huì)破壞 GCN 在 4 個(gè)時(shí)鐘周期的倍數(shù)內(nèi)處理 VALU 指令的模型。CDNA 3 與 GCN 的關(guān)系仍然比 RDNA 更為密切,重用 GCN 的多發(fā)行策略是明智之舉。AMD 還可以使用 RDNA 3 的 VOPD 機(jī)制,其中特殊的指令格式可以包含兩個(gè)操作。雖然該方法可以提高每個(gè)線程的性能,但依靠編譯器來(lái)查找雙問(wèn)題對(duì)可能會(huì)成功或失敗。
CDNA 3 的雙問(wèn)題方法可能會(huì)將責(zé)任推給程序員,以通過(guò)更大的調(diào)度大小來(lái)公開(kāi)更多線程級(jí)并行性,而不是依賴(lài)編譯器。如果 SIMD 有更多正在運(yùn)行的線程,它將有更好的機(jī)會(huì)找到兩個(gè)帶有 FP32 指令準(zhǔn)備執(zhí)行的線程。至少,SIMD 需要兩個(gè)活動(dòng)線程才能實(shí)現(xiàn)完整的 FP32 吞吐量。實(shí)際上,CDNA 3 需要更高的占用率才能實(shí)現(xiàn)良好的 FP32 利用率。GPU 使用按順序執(zhí)行,因此各個(gè)線程通常會(huì)因內(nèi)存或執(zhí)行延遲而被阻塞。即使在滿(mǎn)員的情況下,保持一組執(zhí)行單元的供電也可能很困難。
因此,AMD 將每個(gè) CDNA 3 SIMD 可以跟蹤的線程數(shù)量從 8 個(gè)大幅增加到24 個(gè)。如果程序員可以利用這一點(diǎn),CDNA 3 將更好地定位于多問(wèn)題。但這可能很困難。AMD 沒(méi)有提到矢量寄存器文件容量的增加,這通常會(huì)限制 SIMD 可以運(yùn)行的線程數(shù)量。如果每個(gè)線程使用較少的寄存器,向量寄存器文件可以保存更多線程的狀態(tài),因此 CDNA 3 的多發(fā)出功能可能最適合具有很少活動(dòng)變量的簡(jiǎn)單內(nèi)核。
寄存器文件帶寬對(duì)雙重發(fā)行提出了另一個(gè)挑戰(zhàn)。CDNA 2 的打包 FP32 執(zhí)行不需要從向量寄存器文件中進(jìn)行額外的讀取,因?yàn)樗昧藗鬟f 64 位值所需的更寬的寄存器文件端口。但單獨(dú)的指令可以引用不同的寄存器,并且需要從寄存器文件中進(jìn)行更多讀取。添加更多寄存器文件端口的成本高昂,因此 CDNA 3“逐代改進(jìn)了源緩存,以提供更好的重用和帶寬放大,以便每個(gè)向量寄存器讀取可以支持更多下游向量或矩陣操作” 。最有可能的是,AMD 正在使用更大的寄存器緩存來(lái)緩解端口沖突并保持執(zhí)行單元的運(yùn)行。
08.?矩陣運(yùn)算
隨著機(jī)器學(xué)習(xí)的興起,矩陣乘法變得越來(lái)越重要。Nvidia 在這一領(lǐng)域投入了大量資金,多年前就在其 Volta 和 Turing 架構(gòu)中添加了矩陣乘法單元(張量核心)。AMD 的 CDNA 架構(gòu)增加了矩陣乘法支持,但當(dāng)代 Nvidia 架構(gòu)在矩陣乘法吞吐量方面投入了更多資金。這尤其適用于 AI 中常用的低精度數(shù)據(jù)類(lèi)型,例如 FP16。
與前幾代 CDNA 相比,MI300X 通過(guò)將每 CU 矩陣吞吐量提高了一倍來(lái)迎頭趕上。最重要的是,MI300X 的小芯片設(shè)計(jì)允許大量的 CU。但 Nvidia 更高的每 SM 矩陣性能仍然使其成為一支不可忽視的力量。因此,CDNA 3延續(xù)了AMD從矢量FP64性能方面重?fù)鬘vidia的趨勢(shì),同時(shí)保持了孤立的強(qiáng)大AI性能。
09.?指令緩存
除了處理指令請(qǐng)求的內(nèi)存訪問(wèn)之外,計(jì)算單元還必須從內(nèi)存中獲取指令本身。傳統(tǒng)上,GPU 的指令傳遞比較容易,因?yàn)?GPU 代碼往往很簡(jiǎn)單并且不會(huì)占用大量?jī)?nèi)存。在DirectX 9時(shí)代,Shader Model 3.0甚至對(duì)代碼大小進(jìn)行了限制。隨著 GPU 不斷發(fā)展以承擔(dān)計(jì)算任務(wù),AMD 推出了具有 32 KB 指令緩存的 GCN 架構(gòu)。如今,CDNA 2 和 RDNA GPU 繼續(xù)使用 32 KB 指令緩存。
CDNA 3 將指令緩存容量增加至 64 KB。關(guān)聯(lián)性也加倍,從 4 路變?yōu)?8 路。這意味著具有更大、更復(fù)雜內(nèi)核的 CDNA 3 的指令緩存命中率更高。我懷疑 AMD 的目標(biāo)是將 CPU 代碼天真地移植到 GPU。復(fù)雜的 CPU 代碼可能會(huì)對(duì)GPU 造成影響,因?yàn)樗鼈儫o(wú)法通過(guò)長(zhǎng)距離指令預(yù)取和準(zhǔn)確的分支預(yù)測(cè)來(lái)隱藏指令緩存未命中延遲。更高的指令緩存容量有助于容納更大的內(nèi)核,而增加的關(guān)聯(lián)性有助于避免沖突未命中。
與 CDNA 2 一樣,每個(gè) CDNA 3 指令緩存實(shí)例為兩個(gè)計(jì)算單元提供服務(wù)。GPU 內(nèi)核通常以足夠大的工作大小啟動(dòng),以填充許多計(jì)算單元,因此共享指令緩存是有效使用 SRAM 存儲(chǔ)的好方法。我懷疑 AMD 沒(méi)有在更多計(jì)算單元之間共享緩存,因?yàn)閱蝹€(gè)緩存實(shí)例可能難以滿(mǎn)足指令帶寬需求。
10.?寫(xiě)在最后的話
CDNA 3 的白皮書(shū)稱(chēng)“AMD CDNA 3 架構(gòu)中最大的代際變化在于內(nèi)存層次結(jié)構(gòu)”,我不得不同意。與 CDNA 2 相比,雖然 AMD 改進(jìn)了計(jì)算單元的低精度數(shù)學(xué)功能,但真正的改進(jìn)是添加了無(wú)限緩存。
MI250X 的主要問(wèn)題是它并不是真正的 GPU。它是兩個(gè) GPU 共享同一個(gè)包,GCD 之間每個(gè)方向每秒只有 200 GB。根據(jù) AMD 的評(píng)估,每個(gè)方向每秒 200 GB 不足以讓 MI250X 顯示為一個(gè) GPU,這就是 AMD 顯著增加芯片到芯片帶寬的原因。
AMD 將東西向總帶寬提高到每個(gè)方向 2.4TB/秒,比 MI250X 增加了 12 倍。南北向總帶寬甚至更高,每個(gè)方向?yàn)?3.0TB/秒。隨著帶寬的大幅增加,AMD 能夠使 MI300 看起來(lái)像一個(gè)大型的統(tǒng)一加速器,而不是像 MI250X 那樣是 2 個(gè)獨(dú)立的加速器。
如果兩個(gè) XCD 都需要所有可用內(nèi)存帶寬,則一個(gè)芯片的 4.0 TB/s 總?cè)肟趲捒赡芸雌饋?lái)不夠。然而,兩個(gè) XCD 組合起來(lái)只能從 IO 芯片訪問(wèn)高達(dá) 4.2TB/s 的帶寬,因此實(shí)際上 4.0TB/s 的入口帶寬不是問(wèn)題。最大 4.0TB/s 的入口帶寬意味著單個(gè) IO 芯片無(wú)法利用所有 5.3TB/s 的內(nèi)存帶寬。
這與桌面 Ryzen 7000 部件類(lèi)似,由于 Infinity Fabric 的限制,一個(gè) CCD 無(wú)法充分利用 DDR5 帶寬。然而,這在 MI300X 上可能不是問(wèn)題,因?yàn)樗行酒荚谶\(yùn)行時(shí),帶寬需求將最高。在這種情況下,每個(gè)芯片將消耗約 1.3 TB/s 的帶寬,通過(guò)跨芯片鏈路獲取其中的 3/4 不會(huì)有問(wèn)題。
但MI300不只是GPGPU部分,它還有APU部分,在我看來(lái)這是這兩款MI300產(chǎn)品中更有趣的一個(gè)。AMD 首款 APU Llano 于 2011 年發(fā)布,它基于 AMD 的 K10.5 CPU 搭配 Terascale 3 GPU??爝M(jìn)到 2023 年,AMD 在其首款“big iron”APU MI300A 中將 6 個(gè) CDNA3 XCD 與 24 個(gè) Zen 4 核心配對(duì),同時(shí)重復(fù)使用相同的基礎(chǔ)芯片。這允許 CPU 和 GPU 共享相同的內(nèi)存地址空間,從而無(wú)需通過(guò)外部總線復(fù)制數(shù)據(jù)以保持 CPU 和 GPU 彼此一致。
審核編輯:黃飛
?
評(píng)論