測試龍芯3A6000,結論:中國最有前途的CPU
計算能力已成為世界各國經濟發展的重要資源,中國也不例外。該國在CPU領域投入了大量的資源,龍芯處于這一領域的最前沿。我們之前報道了該公司的3A5000 CPU,這是一款四核處理器,每時鐘周期的性能合理,但時鐘頻率太低,不具備競爭力。
本文引用地址:http://www.ex-cimer.com/article/202403/456876.htm現在,我們來看看龍芯新推出的3A6000 CPU。3A6000也是四核2.5 GHz的規格,但使用了新設計的LA664核心。與3A5000的LA464核心相比,LA664的進步當刮目相看。雖然龍芯LA664延續了與LA464的指令集和微架構設計,但LA664具有更寬的流水線和更多的執行單元。為了讓CPU效率更高,LA664增加了SMT(超線程)支持。如果對超線程的的實現得當,SMT可以用最小的芯片面積開銷提高多線程性能,但把SMT做好非常困難。
一、評估3A6000(Sizing Up 3A6000)
7-Zip是一個文件壓縮工具,它能達到很高的壓縮效率,但相對其它壓縮工具,它可能對CPU性能的要求也更高。它幾乎只使用標量整數指令,所以SIMD擴展不起作用。在這里,我們通過壓縮一個很大的ETL文件來測試3A6000的性能,評估指標是壓縮速度,每秒壓縮的數據越多越好。
與前代相比,3A6000在不使用SMT(超線程)時,運行7-Zip的性能就已經獲得了38%的巨大提升。如果加上SMT支持,這一提升還會增加。當每個CPU核心只使用一個線程時,四個LA664核心在7-Zip測試中大致相當于四個頻率更高的Zen1核心。因此,LA664的每個時鐘周期的性能非常高(譯者注:在相同的頻率下,LA664的性能接近于Intel Raptor Lake核心和AMD Zen 4代核心 )。但因為它只在2.5 GHz下運行,由于頻率較低,使它的性能無法與AMD的新款CPU相比。
使用8個線程(4個物理核心)后,SMT(超線程)使3A6000運行7-Zip時的性能再提高了20%,但AMD的Zen 1和Zen 2運行7-Zip時能通過SMT獲得40%以上的收益。SMT的作用是為核心提供更明確的并行性,減少平均的運行延遲并使流水線保持更加飽和的工作狀態。一方面,較高的SMT增益表明CPU核心的SMT實現經過了很好的調整。另一方面,這意味著CPU核心在運行單個線程時沒有很好地降低延遲。
?。ㄗg者注:7-Zip的性能測試只涵蓋了通用CPU性能評估的一小部分,有的CPU運行7-Zip的效率很好,但運行其它程序效率可能極差。比如在相同頻率下,10代酷睿一個核心的7-Zip測試成績不到Pentium4的3倍,但對于通用性能綜合測試,10代酷睿的單核同頻性能是Pentium4的5倍左右。)
與7-Zip不同,libx264視頻編碼大量使用SIMD指令。在x86 CPU上,編碼器將使用SSE、AVX、AVX2,甚至AVX-512(如果可用)。在龍芯上,libx264將利用LSX(128bit)和LASX(256bit) SIMD擴展。在這里,我轉碼了一個《守望先鋒》的游戲剪輯4K視頻,所有CPU都只使用4個物理核心,評估指標是每秒轉碼的幀數,幀率越高越好。
在視頻轉碼測試中,當啟用的核心數量相同時,2.5GHz的3A6000性能可以與最高頻率超過4.0GHz的AMD 1800X相提并論。在使用SMT線程以及將任務限制為每個核心一個線程時,它們的轉碼速度互有勝負。1800X使用Zen 1核心有較的高SMT增益,但可能受到其較弱的AVX2(256bit)實現的限制。3950X的Zen 2核心和3A6000都獲得了30%以上的SMT收益。憑借全面改進的架構和穩固的AVX-512(512bit)實現,AMD最新的7950X3D中使用的Zen 4核心脫穎而出。與之前一樣,3A6000僅憑借2.5 GHz的頻率,性能上的表現就相當出色。
核心對核心,LA664把龍芯CPU從低性能的行列中帶了出來,使3A6000能與AMD和Intel以往的高性能產品競爭。Zen 1與Haswell大致相當,即使在今天,這兩種微結構的CPU仍然可用?,F在,讓我們來看看讓龍芯能與那些更高級的產品競爭的核心微架構。
?。ㄗg者注:libx264中的熱點代碼對龍芯LoongArch架構的匯編優化有所不足,特別是在向量指令的使用方面,通過編譯器直接產生的二進制代碼很難比得上程序員細致調優的手寫匯編代碼。)
二、核心架構(Core Architecture)
LA664是一個6發射的支持亂序執行的CPU核心,具有大量的執行資源和深度的指令重排序能力。在這些方面,它具有與最新的英特爾和AMD核心競爭的能力。
LA664是LA464演進的結果。龍芯3A5000中的LA464核心是一個4發射的支持亂序執行的核心,在各個方面的規格都比較適中。LA464是一個全面而實用的核心,幾乎沒有明顯的弱點,為龍的進步奠定了堅實的基礎。毫無疑問,LA664繼承了LA464的微架構設計。
當然,框圖并不能說明全部情況。分支預測、執行延遲和內存訪問性能等因素都會產生巨大影響。
三、龍芯3A6000的前端(The Loongson 3A6000’s Frontend)
分支預測(Branch Prediction):
CPU分支預測器負責預判程序最可能執行的分支,并把跳轉的方向告訴前端,這一點非常重要。因為如果分支預測的方向錯誤,CPU的后端在錯誤的分支上運行會浪費大量的性能、電能和時間,并要再消耗一些時間才能回到正確的分支上。
3A6000的分支預測器具有令人印象深刻的模式識別能力,是迄今為止我們所見過的中國CPU中最好的。它與我們在3A5000中看到的不同,3A5000與最新的Intel和AMD CPU相距甚遠。然而,由于AMD一直在分支預測功能上大力投入,它們的Zen 3架構仍然領先一步。
Zen 3通過一個覆蓋預測器(overriding predictor)來實現這一點。大多數分支具有簡單的行為,并且可以由第一級快速處理,能力更強但速度較慢的第二級只需介入一些跨度較長的分支即可。有了這個方案,Zen 3的分支預測器能夠在保持高速的同時跟蹤很長的分支。
即使3A6000不能與AMD最新的核心相媲美,龍芯也取得了值得稱贊的進步。3A5000的分支預測器看起來更適合從00年代中期到10年代初的高性能內核,而不是最近這十年的東西。龍芯在這一領域的投入無疑是3A6000效率提升的一個重要因素。
分支預測器速度(Branch Predictor Speed):
分支預測器必須既快速又準確,以避免核心空載浪費時間。分支目標緩沖區(Branch Target Buffers,BTB)用來緩存分支目標,使預測器跟隨指令流,而無需等待實際的分支指令出現。LA664有一個64條目的L1 BTB,能夠快速處理連續預測,在AMD的術語中稱為“零氣泡(zero bubble)”。BTB未命中的時候,很可能是通過簡單地等待指令字節從64KB的指令緩存到達,然后通過分支地址計算器來計算目的地來處理的,這實際上看起來像是綁定到指令緩存的1K-4K條目的L2 BTB。
相比之下,AMD和Intel最新的微架構使用了與指令緩存解耦的大型L2甚至L3 BTB。從另一個BTB級別獲取地址可能比等待指令字節到達更快,AMD的Zen 4利用這一點,只要BTB包含了這個分支,就可以實現延遲非常低的分支處理。
此外,將BTB與指令緩存解耦有助于在代碼塊超出L1i容量時保持高IPC,因為預測器與L1i未命中時產生的延遲隔離。但龍芯不是唯一一種放棄龐大的、解耦的BTB設計的CPU,Tachyum-Prodigy同樣認為這種方法過于昂貴,因為他們很難用標準的單元庫達到頻率目標。與Tachyum的Prodigy一樣,3A6000通過使用64KB的大指令緩存來補償這一點。如果預測器必須處理較少的L1i未命中延遲,那么這一些弱點就無關緊要了。
3A6000似乎還具有更積極的線性指令預取功能。上面的測試只是讓分支跳到下一個16字節對齊的塊,所以線性指令預取器可以很好地處理。相比之下,AMD的預取似乎完全由分支預測器驅動。一旦我們超過了BTB容量,我們基本上都會看到L2延遲。
間接分支預測(Indirect Branch Prediction):
間接分支比直接分支更難預測。間接分支要跳轉到的目標不是直接編碼到程序中,而是跳轉到寄存器中的地址,3A6000在間接分支預測方面做得很好。
3A6000總共可以跟蹤1024個間接目標,是3A5000的兩倍。3A5000只能跟蹤大約24個獨立的間接分支,而3A6000可以跟蹤128個以上獨立的間接分支。相比之下,Zen 2也可以跟蹤1024個間接目標,因此3A6000與最新的x86 CPU非常一致。
“返回”預測(Return Prediction):
“返回(Return)”操作是一種特殊的間接分支,通常與子程序調用(Call)成對出現。對于許多計算機處理器來說,使用堆棧來保存要返回的地址是很常見的。當分支預測器發現調用(Call)指令時,它會將當前地址推入該堆棧。當它遇到返回(Return)指令時,它會從堆棧中彈出一個地址。奇怪的是,3A6000最終將返回堆棧從3A5000中的32個條目減少到只有16個條目。如果兩個核心的SMT線程都處于活動狀態,則有效容量可能會進一步下降到8個條目。
將返回堆棧容量降至16個條目在一定程度上是合理的,因為即使是較小的返回堆棧也可以捕獲大多數調用/返回情況。龍芯CPU可能是用間接分支預測器來處理超出條目數量的情況,因為超過返回堆棧能容納的數量時,3A6000只會出現適度的性能下降。英特爾也采用了同樣的策略,在這種情況下,返回堆??梢员灰暈閷β屎托阅軆灮?,而不是性能的關鍵。
分支預測精度(Branch Prediction Accuracy):
7-Zip和其它壓縮工作負載通常給CPU分支預測帶來巨大挑戰。3A6000的分支預測器處理能力令人欽佩,對每條指令的預測失誤方面與Zen 1不相上下,在準確性方面,3A6000與Zen 2平分秋色,在這種情況下,準確性是一個更好的指標,因為3A6000完成工作執行指令的更少。
因為Loongson的指令流中有更大比例的指令由分支組成,所以每條指令的預測失誤率更高。AMD最新的Zen 4架構仍然領先一步,但龍芯在其分支預測器方面取得了值得稱贊的進展,3A6000令3A5000望塵莫及。
libx264具有更少的且更容易預測的分支,但我們仍然可以看到測試的CPU之間的差異。在這個測試中,ISA(指令集)差異對龍芯有效。3A6000每條指令很少出現預測失誤,但這是因為它執行了更多的指令來完成工作。當有更多的非分支指令需要處理時,預測失誤的比例就會降低。
?。ㄗg者注:libx264的熱點代碼對龍芯LoongArch指令集的匯編優化有所不足,通過編譯器直接產生的二進制代碼通常會比優秀程序員手寫的匯編代碼冗長一些。)
3A6000分支預測器的性能與AMD的Zen 2旗鼓相當。龍芯再次表明,在設計準確的預測器方面,他們可以和巨人一起玩。
指令獲?。↖nstruction Fetch):
一旦分支預測器決定了代碼的前進方向,目標代碼就會被加載到指令緩存中,并保留數據便于CPU核訪問代碼。和3A5000差不多,3A6000有一個64KB的4路L1i(一級指令緩存),與只有32KB L1i的英特爾和AMD CPU相比,這是一個不錯的L1i。64KB的L1i以及6個解碼器,使3A6000的前端比上一代產品加寬了50%。
AMD和英特爾的高性能CPU使用微操作緩存,這可以避免指令解碼成本,同時提供更高的吞吐量。自Zen以來,AMD的微操作緩存理論上每個周期可以提供8個微操作,但核心的吞吐量受到下游重命名階段的限制。
龍芯3A6000在代碼塊大小超出L1i容量仍時保持了良好的吞吐量。3A5000在從L2運行代碼時會莫名其妙地遭遇指令帶寬降低的問題,龍芯在3A6000中解決了這一問題。當代碼在L2中時,3A6000可以輕松地每周期執行3條指令。
不幸的是,當代碼在L3中時的情況并不樂觀,看起來3A6000似乎沒有改進從L3獲取指令的能力。這是一個遺憾,因為Golden Cove和Zen 3每個周期都可以獲得3個4字節的指令,而龍芯CPU每個周期獲得4字節指令的數量低于2個。
四、重命名和分配(Rename and Allocate)
一旦指令被解碼為微操作,核心就必須分配后端跟蹤資源(譯者注:一般為指令重排序緩沖區和內存重排序緩沖區)。這些資源將會跟蹤指令狀態,并讓核心在輸入的數據準備好后立即執行指令,同時仍然確保正確的程序行為和異常處理。這個階段還通過寄存器重命名消除了依賴關系,并且是實現動態調度以及使用各種技巧為指令執行增加額外并行性的重要環節。
LA664的重命名器對寄存器清零有一種特殊的方式,x86 CPU總是通過XOR操作把寄存器清零,LA664不使用此類操作,這意味著清零操作不會消耗運算單元的資源。
龍芯的重命名器還對寄存器到寄存器的移動進行了一些優化。每個周期能執行兩個move r,r指令,因此LA664有時可以在寄存器別名表中進行指針操作,以打破這種依賴關系。然而,它不能以全速率進行,并且寄存器到寄存器的移動仍然需要ALU(算術邏輯運算器)參與。
英特爾和AMD都開發了更先進的重命名器,能夠完全消除寄存器到寄存器的移動,而不考慮依賴性。Intel的Golden Cove還可以在重命名階段通過較小的即時性添加來消除添加,進一步減少執行單元的負載。
五、亂序執行(Out of Order Execution)
為了實現亂序執行,在重命名和分配階段必須在必要的隊列和緩沖區中找到條目來跟蹤指令狀態。更大的緩存區可以讓核心在指令流中回溯更遠,從而更好地發現可以并行的指令。龍芯3A6000有一個規模較大的亂序引擎,比3A5000有了很大的進步。
與3A5000相比,寄存器堆和內存重排序隊列等主要結構的大小至少增加了25%。LA464的分支順序緩沖區過小,LA664對此進行了改進。LA664最終具有與AMD的Zen 3相當的重新排序能力。與英特爾的Golden Cove相比,Zen 3和LA664仍然很小,后者擁有巨大的512個條件的ROB和其它更大的結構。
六、超線程實施(SMT Implementation)
更大的亂序緩沖區對于提高單線程性能至關重要,但增大緩沖區的回報會很快減少。SMT通過向操作系統提供多個邏輯核心并在線程之間劃分資源來抵消這些遞減的回報。因此,啟用SMT的CPU可以保持最大的單線程性能,同時在多個硬件線程空閑時能像幾個較小的核心一樣工作。AMD、Intel和龍芯都是每個核心暴露兩個SMT線程。
雖然SMT的好處顯而易見,但實施起來卻很困難。當操作系統在多個硬件線程上調度工作時,核心必須實時重新配置自己。工程師必須決定如何在兩個線程的模式下管理各種核心資源。也就是說,SMT的結構可以是:
雙倍資源:每個線程都擁有資源的一個副本。在一線程模式下,第二個副本只是未使用。這會浪費芯片的面積,但可能更容易調整和驗證。不必擔心資源會被一個線程耗盡,當第二個線程也處于活動狀態時就無法獲得可用的資源。
靜態分配:每個線程獲得一半的資源。當一個線程處于停止狀態時,另一個線程可以使用所有條目,因此這種方法能更有效利用芯片面積。但這很難驗證,因為當兩個線程都工作時,資源將不得不被耗盡并重新配置。但調整仍然不太難,因為將資源分成兩半可以確保線程之間的某種程度的公平性。
動態調整:在雙線程模式下,一個線程消耗的資源條目可以超過一半。這有更大的靈活性和更潛在的性能,但調優更難。更高的資源分配可以提高一個線程的性能,但對另一個線程會產生不成比例的影響(使其缺乏關鍵資源)。
競爭性共享:所有線程都是自由使用所有資源。即使一個線程處于活動狀態,另一個線程也可以使用所有條目,靈活性和潛在性能最大化。例如,如果一個線程正在運行浮點代碼,而另一個線程在運行純整數代碼,那么競爭性地共享調度器將使兩個線程都能滿足資源需求。但調整和驗證變得更加困難,缺少資源是一種更常見的可能性,工程師們必須小心避免這種情況。
龍芯選擇了一種保守的SMT實現方式,其中大多數資源都是靜態分配的。包括ROB、寄存器文件和加載/存儲隊列。
3A6000上的部分資源是動態調整,整數運算調度器最高似乎能使用30個條目左右,因此即使SMT同級線程處于活動狀態,運行在3A6000上的線程也可以與在3A5000上運行時使用幾乎一樣多的調度器條目。
AMD的Zen 2靜態地劃分重排序緩沖區,并對浮點運算調度器和非調度隊列使用某種動態分配方案。但除此之外,AMD選擇了一種非常激進的SMT實現方式。寄存器文件、加載隊列和整數調度器是競爭性共享的。這可以部分解釋Zen 2令人印象深刻的SMT提升。
對于龍芯來說,采取一種不那么激進、更容易驗證的方法可能是合理的。3A6000是他們的第一款支持SMT的CPU,過于雄心勃勃反而是容易失敗的路線。
七、整數運行(Integer Execution)
3A6000的整數執行部件與前代相比變化最小,但增加的50%的調度條目應該會提高ALU(算術邏輯單元)利用率。與3A5000一樣,3A6000有四個ALU部件,能夠執行最常見的操作。兩個端口可以處理分支,兩個端口可用于整數乘法,這樣的設計與Zen 2大致相當。但與Zen 2相比,龍芯有兩個整數乘法部件。Zen 2具有更大的總調度能力,但將Zen 2的分布式調度器與龍芯的統一調度器進行比較并不簡單。Zen 2可能會遇到16個入口隊列中的其中一個在其他隊列之前填滿的情況,這將導致重命名器處的資源停滯。
龍芯將整數除法吞吐量從3A5000的0.11指令/周期提高到了0.25指令/周期,把延遲從9周期降低到了4周期。這種改進是一個奇怪的選擇,因為大多數代碼避免使用除法指令,因為它們從以前到現在都非常慢。也許是因為龍芯必須從頭開始構建他們的軟件生態系統,所以增加晶體管的數量提高運算單元的速度是值得的。
八、矢量和浮點運行(Vector and Floating Point Execution)
龍芯的3A5000具有LASX擴展的256位矢量功能,但采用了僅兩個256位單元的保守實現。3A6000對FPU進行很大的修改,它現在有四個執行單元。所有四個單元都可以處理封裝為256位的浮點加法運算,使3A6000具有非常強的浮點性能。競爭對手(譯者注:兆芯和海光)的x86 CPU每個周期只能進行兩次封裝為256位的浮點運算。龍芯對封裝為256位的浮點乘法和基本整數運算的性能與Zen 2相似。
奇怪的是,標量浮點運算并沒有得到同樣的增強,只有兩個部件可以處理標量浮點運算。更奇怪的是,標量浮點乘法似乎使用了與矢量乘法不同的單元。
盡管龍芯增加了額外的浮點單元,使整體的浮點性能有所提升,但峰值融合乘加(FMA)吞吐量沒有改變。LA464和LA664每個周期都可以執行一次FMA操作,使其FMA吞吐量達到AMD的Zen 2或Intel Skylake的一半。
除了提高吞吐量,龍芯還降低了執行延遲,浮點加法的延遲為3個周期,與Zen 3一樣。然而,AMD的Zen 3和英特爾的Golden Cove總體上仍然具有更低的浮點執行延遲。尤其英特爾可以在2個周期延遲的情況下完成浮點加法,并且在更高的時鐘頻率下也可以做到。
與整數功能一樣,浮點調度程序條目也增加了50%,達到48個條目。這本身可能比額外的執行單元提供了更多的浮點性能提升,兩者共同使3A6000在矢量和浮點工作負載方面成為一款強大的CPU。
AMD的Zen 2也有四個FPU(浮點計算單元),也可以將所有四個單元用于基本的矢量整數運算。然而,它使用了一個巧妙的非調度隊列,即使36個條目的調度器已滿,也可以避免重命名器停滯。這使得后端可以動態地保存更多的浮點或矢量操作,即使它不能通過搜索這些操作來找到額外的指令級并行性。
九、地址生成(Address Generation)
與LA464相比,龍芯在LA664上極大提高了地址生成能力。LA464有兩個通用裝載(讀內存)/儲存(寫內存)部件,LA664將其分成兩個裝載(讀內存)部件和兩個儲存(寫內存)部件。
這意味著LA664每周期可以處理比Zen 3更多的標量內存操作,并且可以處理與Golden Cove相同數量的內存操作。不過Zen 3和Golden Cove更靈活,因為與LA664的每個循環2個裝載操作相比,它們在一個循環中最多可以發出3個裝載操作,但這是對LA464的每個循環單個操作的重大升級。至于向內存寫入數據,LA664、Zen 3和Golden Cove(12代酷睿)在每個周期都是2個標量儲存操作,而LA464在每個周期只能處理一個儲存操作。LA664每個周期可以處理兩個256位矢量訪問,這些也可以是加載和存儲的任意組合。
十、內存排序(Memory Ordering)
一旦生成了地址,加載/存儲單元就必須確保內存訪問看起來是按程序順序執行的(譯者注:會根據實際的指令執行順序調整內存訪問順序)。加載時也可能必須從剛剛進行的存儲中獲取結果(譯者注:執行內存寫操作后,數據要數個周期后才能真正地保存到內存中,此時不能從內存中加載剛剛存儲的數據),與先前的3A5000一樣,3A6000可以處理從大約7個周期內的先前存儲中加載的情況。部分重疊的情況會導致14個周期的損失,可能加載操作會被阻塞,直到存儲操作完成并寫回L1D(一級數據緩存)。
Zen 2具有相同的7周期延遲和14周期部分重疊產生的損失,但Zen 2可以處理64字線緩存上的轉發,只需額外的周期損失,而龍芯則很難處理這種情況。由于Zen 2可以運行的頻率比LA664高得多,因此7個周期的轉發延遲對于龍芯來說損失的時間更長。Goldmont Plus的目標頻率在2 GHz以上,具有5個周期的存儲轉發延遲和10個周期的故障情況。
LA664的存儲轉發行為看起來很像它的上一代,但LA664消除了因地址未對齊(譯者注:通常當內存地址不是4或8的整數倍時就是未對齊)而造成的10個周期的損失,并將其降至僅3個周期。這方面LA664比Zen 2稍微好一點,Zen 2需要2到5個周期來處理地址未對齊的存儲。
跨越64字節邊界的存儲轉發處理仍然很差,但損失已經從31個周期下降到了可以容忍的21個周期。
下面分別是3A6000和3A5000存儲到加載轉發延遲測試,使用Henry Wong的方法測量,代碼由Clam基于LoongArch指令集編寫:
十一、緩存和內存訪問(Cache and Memory Access)
良好的緩存和內存層次結構對于保持現代高性能CPU的數據供應至關重要。3A6000保留了與3A5000類似的緩存層次結構,但總體上略有改進。
由于龍芯CPU無法動態提高時鐘速度,因此他們通過縮短流水線訪問緩存的路徑減少延遲。
延遲(Latency):
3A6000的L1D(一級數據緩存)延遲從3A5000的四個周期下降到了三個周期。我認為低時鐘CPU的目標就是3個周期的L1D延遲,很高興在3A6000上看到這一點。
許多現代CPU將L2(二級緩存)用作中間緩存,以便在L1(一級緩存)未命中時與延遲相對較高的L3(三級緩存)隔離開來。3A6000與以前的Intel CPU一樣,繼續使用256 KB的二級緩存,較新的AMD和Intel CPU傾向于使用更大的L2。Zen 4使用了1MB的L2,而英特爾的Raptor Lake則選擇了2MB的L2。盡管龍芯沒有實現更大的L2,但他們確實設法將延遲從14個周期降低到了12個周期。假設L1以相同的速度處理命中和未命中,L1到L2的路徑可能只減少了一個流水線級。
Zen 2、3A6000和3A5000都具有一個由四個核心共享的16 MB L3緩存。3A6000將L3延遲減少了幾個周期,盡管這可能是因為檢查L2的速度快了兩個周期。
最后,訪問DRAM的延遲從144ns縮短到了104ns。3A5000有一個(延遲)可怕的DDR4控制器,它之所以被使用,是因為它的運行頻率較低,意味著雖然延遲時間較高,但時鐘周期計數卻和主流產品相近,也就是說對IPC的影響很小。
3A6000的內存控制器得到極大的改進,雖然104 ns的延遲仍然不太好,但它的周期計數方面的延遲遠低于頻率更高的3950X。因此,3A6000至少通過減少DRAM存取延遲的周期弱化了低頻率的一些缺點。盡管如此,對于單片芯片上的DDR4-2666設置來說,104 ns并不是很好。
雖然3A6000的周期計數延遲具有競爭力,但我們必須考慮實際延遲時間。因為龍芯的CPU頻率無法接近現代AMD和Intel CPU,它在包括L1在內的每個緩存級別都較慢。這就解釋了為什么盡管LA664有比Zen 2更強的重新排序能力和更高的IPC,但基于LA664的3A5000在很多方面反而不如基于Zen 2的產品。
帶寬(Bandwidth):
內存帶寬會影響性能,尤其是對于矢量化的多線程應用程序。3A6000在很大程度上繼承了上一代的內存層次結構,但龍芯再次在各個方面進行了改進。
3A5000的每周期L1D帶寬就已經與英特爾的Skylake或AMD的Zen 2類似了,3A6000則通過改進,實現了寫入帶寬翻倍?;旧?,3A6000的任何寫入和讀取組合都可以在每個時鐘周期以256bit的位寬訪問兩次L1D。
因此,盡管3A6000的頻率很低,但它具有令人印象深刻的L1D寫入帶寬。LA664打破了Golden Cove的唯一,和它一起成為了存儲帶寬達到每個周期512bit(譯者注:原文此處誤寫為byte)的面向消費市場的CPU核心。
下圖是三款CPU的單線程讀寫緩存和內存時的帶寬,其中AMD是服務器CPU的數據,因為我手上只有這個數據。訪問小尺寸數據時是CPU內部的L1、L2、L3緩存在起作用,隨著讀寫數據的尺寸增加,超過緩存的容量后,會很快降低到訪問物理內存時的讀寫帶寬。
?。ㄗg者注:從本文后面的內容可知,作者測試龍芯CPU時是使用的DDR4-2666內存,但3A5000及3A600都支持DDR4-3200內存,因對內存帶寬的測試結果沒有完全體現出龍芯CPU訪問內存的速度。)
下圖是三款CPU多線程讀寫內存時的帶寬:
LA664的256KB L2基本上與上一代相同,每個讀取帶寬周期有21-22字節,寫入帶寬相同。因此,3A6000的每周期L2帶寬仍然低于AMD或Intel 最新的任何CPU。與Intel CPU相比,這一差距變得特別大,后者到L2的路徑每周期能訪問64字節。
下圖是三款CPU每個時鐘周期的內存訪問帶寬:
在訪問L3的階段,LA664的帶寬比前代增加了33%。L3的18.7字節/周期使龍芯的表現好于以前的英特爾CPU,但AMD異常強大的L3實現仍然領先。
為多個核心設計共享的緩存帶來了額外的挑戰,因為必須擴展緩存帶寬以滿足多個核心的訪問。當所有硬件線程都在載入數據時,3A6000可以在每個時鐘周期為每個核心提供16.55個字節。這比在只有一個核心運行而沒有其他核心競爭的情況下所能得到的只少一點,總體上表現非常好。較舊的3A5000在所有四個內核都已加載的情況下,每個內核每個周期只能提供略高于10個字節的數據,而在單個內核處于活動狀態的情況下每個周期可以提供13.7個字節。這表明3A5000的L3在多核同時訪問時存在爭搶,3A6000在很大程度上解決了這一問題。AMD的Zen 4再次提供卓越的L3帶寬,即使多個內核正在訪問緩存,每個內核的每個周期也超過24字節。
龍芯的3A5000有一個糟糕得可怕的DDR4控制器。謝天謝地,3A6000有一個更好的。它在技術上支持DDR4-3200,但在使用兩個內存通道時,我們無法以3200的速度穩定啟動(譯者注:龍芯的CPU和主板對內存的兼容性不如Intel和AMD,但整機配套的以及經銷商推薦的型號都是經過測試驗證的)。當配備雙通道DDR4-2666時,3A6000實現的DRAM讀取帶寬大致與Core i5-6600K不相上下。該芯片的第一代DDR4控制器只能以完美的穩定性使用DDR4-2133(至少我得到的樣品是這樣),但與具有更快內存的3A6000相比,它具有更好的DRAM讀取帶寬。
盡管3A6000的DRAM讀取性能平平,但它在寫入方面確實有訣竅。當龍芯檢測到緩存被覆蓋而不依賴于其先前的內容時,它可能會避免讀取訪問請求。這可能有助于某些訪問模式,但好處可能有限,因為程序的讀取量往往遠遠多于寫入量。
十二、核心到核心延遲(Core to Core Latency)
這項測試使用原子指令的比較和交換操作,獲得每個核心之間信號反彈的時間。
龍芯3A6000的表現沒有帶來任何驚喜,但這是一件好事。
十三、結束語(Final Words)
龍芯的工程師們有很多值得驕傲的地方。創建一個與Zen 2類似的分支預測器并不容易,考慮到龍芯在3A5000中的表現,這一成就更加令人印象深刻。同樣,SMT也很難做好,龍芯成功地做到了這兩件事。同時龍芯大幅擴大了亂序執行的規模,并改善了其DDR4控制器的性能。由此帶來的巨大性能提升使基于LA664的3A6000與主頻4.0GHz左右的Zen 1架構的CPU不相上下,至少當物理核心的數量相同時是這樣。
中國在努力減少經濟發展依賴外國CPU的情況,3A6000是努力的一部分。在減少對外國依賴這方面,3A6000是向前邁出的一大步。Zen 1在今天仍然很實用,所以中國消費者可能會發現3A6000的性能對于輕量級的日常任務來說是可以接受的。龍芯的軟件生態系統對芯片可用性的影響將遠遠大于其性能。
但龍芯的次要目標是與Intel和AMD等西方公司一起成為世界級的CPU制造商。在這方面,他們還有很長的路要走。Zen 1級單核性能值得稱贊,但我們必須記住,Zen 1在與英特爾的競爭中獲得了市場份額,是因為它將價格合理的6核和8核產品帶入了消費者平臺,而不是因為它可以在與Skylake的競爭中贏得核心對核心的勝利。3A6000只是一個四核產品,因此缺乏Zen 1最大的優勢。
龍芯還將3A6000與英特爾的酷睿i3-10100進行了比較,后者是一款四核Skylake產品,具有6 MB的緩存和4.3 GHz的睿頻。雖然名義上是第10代部件,但i3-10100與2015年的酷睿i7-6700K(譯者注:i7-6700K是6代酷睿的最高端型號)更具可比性。英特爾的第10代更廣為人知的是,它將10核CPU納入了公司的消費級產品陣容,其中6核和8核產品構成了中端產品。除了更多的核心之外,i5-10600K和i7-10700K等部件還具有更高的睿頻。3A6000將無法與這些產品競爭。龍芯還將與Zen 2作斗爭,我們已經看到3950X在核心對核心的測試中戰勝了3A6000,但只有當超過四個Zen 2核心發揮作用時,這種差距才會擴大。
如今,英特爾的Golden Cove衍生產品和AMD的Zen 4比3A6000的優勢更大。AMD和英特爾的消費級產品陣容中基本上都沒有四核產品。龍芯的3A6000可能是我們在中國看到的最有前途的CPU,它比迭代ARM A72的拙劣嘗試更令人興奮。但龍芯的工程師們仍有工作要做,我們期待著看到他們下一步的表現。
評論