龍芯的3A5000代表了中國國內(nèi)的另一項(xiàng)CPU努力。它實(shí)現(xiàn)了四個(gè) LA464 內(nèi)核,面向從臺(tái)式機(jī)到服務(wù)器再到嵌入式應(yīng)用程序的所有應(yīng)用。就像我們之前介紹的兆信KX-6640MA和Phytium D2000一樣,龍芯的芯片以低時(shí)鐘速度運(yùn)行。但與其他中國芯片不同的是,龍芯使用的是基于MIPS的ISA。之前的龍芯芯片兼容MIPS64,但該公司改用名為Loongarch的ISA。Loongarch共享MIPS的大部分語義,但使用不同的指令編碼。龍芯還擴(kuò)展了ISA以支持256位矢量執(zhí)行。
我們將在這里做一些簡短的基準(zhǔn)測試。這樣做的目的不是測試大量應(yīng)用程序以提供全面的性能圖。Phoronix已經(jīng)有一些結(jié)果,以防您想知道CPU通常位于何處。相反,我們正在運(yùn)行幾個(gè)測試,并使用我們可用的少量性能計(jì)數(shù)器來分析它們。我們將使用這些數(shù)據(jù)來幫助我們分析龍芯的架構(gòu)。
為了進(jìn)行比較,我們將使用AMD的Zen 1架構(gòu),因?yàn)橐恍┚W(wǎng)站認(rèn)為3A5000可能與Zen 1相當(dāng)。泰坦尼克號(hào)友好地設(shè)置了具有雙通道DDR7-1800的Ryzen 4X系統(tǒng)2400-1。Ampere Altra,以來自Oracle云的免費(fèi)四核實(shí)例的形式,也將在這里展示。Neoverse N3內(nèi)核可能與5000A《》中的內(nèi)核更具可比性,因?yàn)樗鼈兺瑯硬粫?huì)達(dá)到高時(shí)鐘速度。
高級(jí)性能
7-Zip是一個(gè)高效的壓縮程序,我們看到壓縮從分析Firefox編譯中生成的巨大文件需要多長時(shí)間。執(zhí)行的指令流幾乎完全由標(biāo)量整數(shù)運(yùn)算組成。此處的結(jié)果無法與此站點(diǎn)上以前的結(jié)果直接比較,因?yàn)槲覀冞@次指定了 16 個(gè)線程。盡管我們將其限制為四個(gè)內(nèi)核,但運(yùn)行更多線程可以提高利用率和性能。
3A5000在絕對(duì)性能上無法與Zen 1相提并論。但是,如果我們不讓 Zen 1 在一個(gè)內(nèi)核中使用兩個(gè) SMT 線程,則每個(gè)時(shí)鐘的性能具有競爭力。龍芯的實(shí)際性能更接近四核安培Altra設(shè)置。但即使在那里,它的表現(xiàn)也大大優(yōu)于。同樣,每個(gè)時(shí)鐘的性能很接近,但 2.5 GHz 是一個(gè)非常低的時(shí)鐘速度,即使對(duì)于不優(yōu)先考慮單線程性能的服務(wù)器芯片也是如此。
視頻編碼
libx264 是一個(gè)用于處理 H264 編解碼器的免費(fèi)軟件庫。盡管H264相當(dāng)古老,但由于廣泛的硬件解碼支持和H265等較新編解碼器的許可問題,H《》仍然很受歡迎。在這里,我們正在轉(zhuǎn)碼《守望先鋒》游戲玩法的短片,使用“非常慢”預(yù)設(shè)來優(yōu)先考慮質(zhì)量。畢竟,如果您不關(guān)心質(zhì)量并且想要最快的編碼,您只需使用 GPU 的硬件編碼器。

一些從Loongarch libx264中反匯編的代碼,顯示了使用“xr”256位LASX矢量寄存器,以及“vr”256位LSX寄存器
此測試中執(zhí)行的指令流包含高百分比的向量指令。Loongson使用內(nèi)部函數(shù)在其libx264的分布式版本中添加了LSX和LASX支持。這非常好,因?yàn)閲L試僅使用編譯器生成的代碼進(jìn)行視頻編碼或其他計(jì)算繁重的任務(wù)將導(dǎo)致性能極差。

不幸的是,性能并不出色。依賴純 C 代碼通常會(huì)導(dǎo)致性能降低一個(gè)數(shù)量級(jí)。值得慶幸的是,龍芯避免了這種情況。但3A5000與Zen 1相比表現(xiàn)不佳。它也無法與四核安培Altra相匹配??紤]到這兩個(gè)芯片都有128位執(zhí)行單元,這是一個(gè)糟糕的表現(xiàn)。至少在支持 AVX2 的 x86 芯片上,此測試中執(zhí)行的指令中有 10% 以上是 256 位的。Zen 1確實(shí)支持AVX2,但將256位指令解碼為兩個(gè)微操作。安培Altra當(dāng)然僅限于128位NEON指令。Zen 1和Neoverse N1都不以強(qiáng)大的矢量性能而聞名,但都擊敗了3A5000。
指令計(jì)數(shù)和 IPC
性能計(jì)數(shù)器讓我們跟蹤很多事件,其中最重要的事件之一是停用指令的數(shù)量。在無序執(zhí)行的 CPU 中,指令停用是指內(nèi)核提交指令的結(jié)果并使其可見(換句話說,已完成執(zhí)行并通過所有必需的檢查)。我們?cè)谶@里不是使用熟悉的 ISA 測試 CPU。如果ISA有影響,一個(gè)跡象是指令計(jì)數(shù)的巨大差異。

使用 7-Zip,指令數(shù)差異小于 5%。很好。沒有人會(huì)執(zhí)行更多的指令來完成工作。

IPC方面,龍芯做得相當(dāng)不錯(cuò)。IPC 與每時(shí)鐘性能不同,尤其是在使用不同的 ISA 或 ISA 擴(kuò)展時(shí)。但在此壓縮基準(zhǔn)測試中,指令計(jì)數(shù)具有可比性,因此 IPC 與每個(gè)時(shí)鐘的性能密切相關(guān)。在這種情況下,3A5000的主要弱點(diǎn)歸結(jié)為其非常低的時(shí)鐘速度。

libx264 是一個(gè)不同的故事。盡管有 LAVX 支持,但 3A5000 必須處理 12% 到 23% 的指令才能完成相同的工作。ISA 不僅僅是擴(kuò)展,而不僅僅是矢量寬度。也許LAVX缺少NEON和AVX2的一些專業(yè)指令。我們沒有完整的LVX和LAVX指令列表,所以這只是一個(gè)猜測。

同樣,龍芯的IPC相當(dāng)不錯(cuò)。但與 7-Zip 機(jī)箱不同的是,3A5000 執(zhí)行了更多指令來完成工作。這意味著每個(gè)時(shí)鐘的性能明顯低于 Zen。
前端:分支預(yù)測
分支預(yù)測的準(zhǔn)確性很重要。

所有三個(gè)測試的 CPU 的預(yù)測準(zhǔn)確性非常相似。即使是 Zen 1 在加載兩個(gè) SMT 線程時(shí)也不會(huì)受到太大影響。但是,3A5000 每條指令遭受的誤預(yù)測更多,這意味著它比這里的其他 CPU 更容易遭受錯(cuò)誤預(yù)測處罰。雖然它的分支預(yù)測器似乎做得很好,但 Loongarch 指令流的 17.7% 由分支組成,而 x15-1 為 86.64%,16 位 ARM 為 1.64%。

在視頻編碼測試中,龍芯稍稍落后。Zen 1和Neoverse N1的分支預(yù)測因子在此測試中表現(xiàn)更好,盡管差距并不大。在精度方面,當(dāng)AMD的核心必須處理兩個(gè)線程時(shí),3A5000接近Zen 1。龍芯確實(shí)有相當(dāng)?shù)拿織l指令的錯(cuò)誤預(yù)測率,但這有點(diǎn)紅鯡魚。3A5000執(zhí)行的指令比Zen 1多得多,以完成工作。所以,這意味著龍芯正在處理分支之間的更多指令。所有三個(gè)CPU的執(zhí)行分支計(jì)數(shù)相差不到10%(盡管有趣的是,龍芯的執(zhí)行分支數(shù)最高,為1.2萬億,而Zen 1和Ampere Altra分別為1.1和16.1萬億)。
前端:指令提取
3A5000 具有 64 KB、4 路設(shè)置關(guān)聯(lián) L1 指令緩存,有助于加快指令交付速度。Neoverse N1和Zen 1也有不錯(cuò)的64 KB L1指令緩存。在7-Zip上,它足以容納“熱”指令足跡。事實(shí)上,在此測試中,Zen 1 的微操作緩存提供了管道微操作的 85% 以上,這表明 7-Zip 的指令占用空間非常小。
在所有三個(gè)經(jīng)過測試的 CPU 中,每條指令的未命中數(shù)都非常低。對(duì)于龍芯來說,它特別低,這很好,因?yàn)?A5000在必須從L2獲取代碼時(shí)就沒有那么好了。但是對(duì)于每個(gè)人低于 1 MPKI 的人來說,這無論如何都不是一個(gè)很大的因素。
libx264 也有很高的 L1i 命中率,盡管我們看到所有三個(gè) CPU 上的 L1i 未命中率更高。龍芯現(xiàn)在遭受的痛苦更大,盡管2 MPKI仍然不是特別令人擔(dān)憂。
后端:L1D 命中率
這里測試的三個(gè)CPU在數(shù)據(jù)方面有更多的差異。AMD 的 Zen 架構(gòu)具有相對(duì)較小的 32 KB、8 路集關(guān)聯(lián) L1D。龍芯的3A5000和Neoverse N1都具有更大的64 KB,4路L1D。在7-Zip中,龍芯的L1D表現(xiàn)出人意料地差。根據(jù)性能計(jì)數(shù)器,L1D 命中率要低得多。Neoverse N1 具有最佳的 L1D 命中率,即使具有類似的緩存幾何形狀。N1 也擊敗了 Zen 1 的 L1D 命中率,因此關(guān)聯(lián)性較小的 L1D 應(yīng)該更好。也許龍芯沒有一個(gè)好的替換策略,或者經(jīng)常積極地預(yù)取和踢出有用的數(shù)據(jù)。

對(duì)于 7-Zip,每條指令的未命中數(shù)在很大程度上講述了同樣的故事,因?yàn)閳?zhí)行的指令計(jì)數(shù)相似。
龍芯的L1D遭遇了很多失誤。在libx264中,龍芯的表現(xiàn)稍好一些。L1D命中率仍然不是它應(yīng)該考慮其容量優(yōu)勢(shì)的地方,它仍然無法趕上Zen。但是,這也不太遠(yuǎn)。

按照指令,龍松沒有遭受太多的失誤。但這主要是CPU在此工作負(fù)載中執(zhí)行更多與計(jì)算相關(guān)的指令的跡象,這意味著內(nèi)存訪問代表較少的已執(zhí)行指令流。這也意味著L1D失誤的影響較小,因?yàn)閮?nèi)核必須通過更多的數(shù)學(xué)指令來阻礙。禪宗的情況正好相反。
二級(jí)和三級(jí)緩存
通常,CPU 為其 L1 緩存中的絕大多數(shù)訪問提供服務(wù)。但是DRAM訪問非常慢,以至于他們需要較低級(jí)別的緩存。最后一級(jí)緩存 (L3) 的容量在兆字節(jié)范圍內(nèi),因此速度足夠慢,以至于中級(jí)緩存 (L2) 可以帶來性能優(yōu)勢(shì)。龍芯有一個(gè)256 KB的二級(jí)緩存和一個(gè)不錯(cuò)的2 MB三級(jí)緩存。Zen 在四核集群中具有較大的 16 KB L3,但較小的 512 MB L2。Ampere Altra 每個(gè)內(nèi)核使用非常好的 8 MB 二級(jí)緩存,但在 3 個(gè)內(nèi)核之間共享 1 MB 三級(jí)緩存。
L3 緩存的性能計(jì)數(shù)器在 Ampere Altra 上似乎無法正常工作。它們顯示的 L3 補(bǔ)充比對(duì) L3 的請(qǐng)求多,這意味著 L3 的命中率為負(fù)。這沒有意義,所以我們從0%開始圖形比例,根本不會(huì)談?wù)揂mpere Altra的L3。

在7-Zip中,龍芯的16 MB L3具有相當(dāng)不錯(cuò)的命中率,并且可能在3A5000的每時(shí)鐘性能中發(fā)揮作用。龍芯也看到了非常好的L2命中率,特別是考慮到它的小尺寸。但這不一定是一件好事。L2命中率很高,主要是因?yàn)長1D遭受的失誤比應(yīng)有的多。

查看每條指令的緩存未命中數(shù)可以證明這一點(diǎn)。正如預(yù)期的那樣,龍芯的 256 KB L2 每條指令的失誤次數(shù)比 Zen 的 512 KB L2 多。我們還可以將高 L3 命中率歸因于大量的 L2 未命中。龍芯似乎確實(shí)比Zen遭受了更多的L3失誤,但這可能是因?yàn)槲以赯en上使用了L1D需求填充的事件。在 Loongson 上,我使用的是 perf 中定義的 LLC-load-misses 事件。Loongson 沒有記錄 3A5000 的性能監(jiān)控事件,因此我不知道該性能事件是否包括預(yù)取的未命中。

libx264 似乎具有更大的數(shù)據(jù)占用空間。我們已經(jīng)看到 L1D 緩存遭受了更多的失誤,而較低級(jí)別的緩存同樣不如 7-Zip 有效。Neoverse N1的大L1絕對(duì)有助于它。Zen 1的L2有助于緩沖處理在單個(gè)內(nèi)核中運(yùn)行的兩個(gè)線程的數(shù)據(jù)占用空間的打擊,但命中率并不是很高。查看每條指令的失誤就很好地說明了這一點(diǎn)。Zen 1 在兩個(gè) SMT 線程都處于活動(dòng)狀態(tài)的情況下遭受更多的 L2 未命中,但 L1D 遭受的損失更大,L2 最終捕獲了很多這些訪問。

Loongson的L2似乎在這個(gè)指標(biāo)上做得很好,但這只是因?yàn)樗鼒?zhí)行了更多的指令,以至于內(nèi)存層次結(jié)構(gòu)的影響較小。在絕對(duì)計(jì)數(shù)中,它實(shí)際上遭受了這里測試的任何CPU中最多的L2失誤(超過244億次,而加載182個(gè)SMT線程的Zen 176和Ampere Altra分別為1和1)。這同樣適用于 L3 未命中,盡管差距較小。同樣,對(duì)這些絕對(duì)計(jì)數(shù)持保留態(tài)度,因?yàn)槲覀儾⒉淮_切知道龍芯的性能事件正在測量什么。
第一印象(架構(gòu)和性能)
龍芯的3A5000似乎相當(dāng)稱職。與植酸D2000和兆信KX-6640MA不同,3A5000具有由大型緩存支持的均衡核心架構(gòu)。每個(gè)時(shí)鐘的性能在精細(xì)壓縮方面是不錯(cuò)的,盡管它遠(yuǎn)遠(yuǎn)落后于英特爾和AMD最先進(jìn)的CPU。但是每個(gè)時(shí)鐘的體面性能并不意味著可接受的性能。龍芯落后的地方在于時(shí)鐘速度。按照今天的標(biāo)準(zhǔn),2.5 GHz 非常低。即使是高內(nèi)核數(shù)的服務(wù)器 CPU 在時(shí)鐘遠(yuǎn)高于 3 GHz 時(shí)也沒有問題。到目前為止,這似乎是龍芯最大的弱點(diǎn)。
術(shù)語“架構(gòu)效率”或“同一時(shí)鐘的性能”有時(shí)被視為衡量良好程度的指標(biāo)。也許這是為低時(shí)鐘速率道歉的一種方式,或者當(dāng)微電流“有一天”達(dá)到該設(shè)計(jì)實(shí)際上無法獲得的時(shí)鐘速率時(shí),這是一種暗示更高性能的方式。。。。。。
David B. Papworth,《Tuning the Pentium Pro Microarchitecture》,IEEE Micro
我們目前正在對(duì) 3A5000 進(jìn)行微基準(zhǔn)測試,以了解有關(guān)其架構(gòu)的更多信息。我們最初的印象是,該核心的ROB容量與Phytium的D2000相似,但其他無序緩沖器的尺寸要好得多。最終我們將有一篇完整的文章,但分析這個(gè)CPU有點(diǎn)困難,因?yàn)槲覀兊拇蠖鄶?shù)基準(zhǔn)測試都依賴于匯編代碼。編譯器傾向于做不可預(yù)測和復(fù)雜的事情,這使得很難從高級(jí)代碼中觀察體系結(jié)構(gòu)特征。
不幸的是,這意味著我們必須編寫大量代碼來研究龍芯的3A5000。編寫匯編可能很困難,為不熟悉的ISA(LoongArch64)編寫匯編將難度帶到了另一個(gè)層次。測試微基準(zhǔn)代碼也不容易。通常,我們可以通過在具有已知特征的 CPU 上運(yùn)行測試并確保結(jié)果合理來驗(yàn)證測試。但在這種情況下,龍芯的 3A5000 是我們唯一的龍 Arch64 CPU,大部分細(xì)節(jié)都沒有公開。我們幾乎是盲目飛行。每個(gè)測試都需要更長的時(shí)間來編寫,并且出錯(cuò)的可能性很高。
這就引出了另一個(gè)大問題:軟件生態(tài)系統(tǒng)支持。如前所述,3A5000運(yùn)行龍芯專有的ISA,Loongarch。Loongarch與MIPS共享許多約定和語義,盡管使用了不兼容的編碼。一方面,這意味著龍芯能夠復(fù)制和粘貼大量現(xiàn)有的MIPS代碼來開始使用。另一方面,MIPS軟件生態(tài)系統(tǒng)無法與x86或ARM相提并論。我預(yù)計(jì)龍芯在他們的軟件生態(tài)系統(tǒng)中會(huì)遇到很多初期問題。
回過頭來看,中國國內(nèi)的芯片努力有點(diǎn)滑稽。兆信的KX-6640MA和植樹的D2000每核性能都很差。3A5000更好,代表了我們迄今為止在中國看到的最強(qiáng)大的CPU努力。但它不會(huì)享受強(qiáng)大的x86或ARM軟件生態(tài)系統(tǒng),如果你不能讓它運(yùn)行你的軟件,CPU的性能就沒有多大意義。
評(píng)論