您的位置: 首頁 > 新聞 > 高新技術(shù) > 新聞詳情

深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主崛起 力拼英美

時間:2015-07-01 14:34:35
  • 來源:驅(qū)動之家
  • 作者:liyunfei
  • 編輯:liyunfei

而令人擔心的地方也有三個——

第一,當一級指令緩存發(fā)生缺失時,缺失的地址會送給緩存失效隊列進行處理。引入緩存失效隊列(學(xué)界通稱為MSHR)來負責從下層存儲器取出缺失的和即將使用的預(yù)取數(shù)據(jù)本是早已成為標準配置的做法,但龍芯的緩存失效隊列卻由一級指令緩存和一級數(shù)據(jù)緩存共享,并且這個失效隊列僅有16項,意味著僅能存儲16個失效請求。筆者預(yù)計龍芯此后的設(shè)計將會嘗試將失效隊列分離或是提高容量;

第二,從框架上看,GS464E的指令TLB部分距離國際水準仍有差距,Intel在Sandy Bridge微架構(gòu)上就實現(xiàn)了144項四路組關(guān)聯(lián)的一級指令TLB,AMD的Bulldozer也實現(xiàn)了72項全相連一級指令TLB和512項四路組關(guān)聯(lián)TLB的搭配,而龍芯僅有64項全相連一級指令TLB(一級指令TLB的大小較難提升),且并未出現(xiàn)二級指令TLB的設(shè)計,指令TLB覆蓋范圍的弱勢可能會加劇指令緩存缺失之后的性能損失;

第三,IBM Power7的一級指令緩存部分與龍芯頗為相似,但是加入了先行路選擇技術(shù),推測性地只開啟指令緩存中將要被訪問的一個部分而不是全部,從而削減功耗,在此之外又非常激進地將一級指令緩存切分為16個bank,盡量避免讀寫沖突。而龍芯的指令緩存部分并未提及路預(yù)測技術(shù)的加入,也僅僅切分為4個bank。綜合優(yōu)勢與劣勢來看,尚不能簡單斷言龍芯的取指令效率能夠比肩國際主流水準。

深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起
深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起

可以看到Victim Cache在GS464E處理器架構(gòu)上占據(jù)了不小的空間

再來看前端中另一個不容忽視的模塊—分支預(yù)測器。GS464E的分支預(yù)測器經(jīng)過大幅改造,不難看出是投入了血本、大幅度提高了各項規(guī)格。從表面參數(shù)上來看,它已經(jīng)能夠比肩Sandy Bridge的水準—錦標賽分支預(yù)測器,返回地址棧,間接跳轉(zhuǎn)預(yù)測器,一應(yīng)俱全。

錦標賽分支預(yù)測器有三大主要內(nèi)建部件—專門根據(jù)局部歷史預(yù)測分支走向的局部歷史表(Local Branch History Table),專門根據(jù)全局歷史分支走向的全局歷史表(Global Branch History Table),以及專門負責決斷前兩者哪一個準確率更高的全局選擇表(GSEL)。三者的存儲空間都達到了16K項的大小,推測與Sandy Bridge齊平,也超過了IBM Power7。

專門負責預(yù)測函數(shù)調(diào)用返回地址的返回地址棧(Return Address Stack)能夠存儲16項,與AMD Jaguar和IBM Power7齊平。在基本參數(shù)已經(jīng)追平國際水準的情況下,比拼分支預(yù)測準確率的因素就落在了其他細節(jié)設(shè)計上,例如返回棧是否支持在錯誤預(yù)測下的棧修復(fù)、錦標賽預(yù)測器是否加入了其他設(shè)計技巧降低歷史表的訪問沖突等等。

筆者謹慎樂觀地認為,只要這些細節(jié)設(shè)計不出現(xiàn)明顯失誤,GS464E的分支預(yù)測能力將可以與Intel的設(shè)計一決雌雄。

仍有落后 新一代GS464E之亂序執(zhí)行引擎

盡管同為亂序四發(fā)射的框架,但從表1來看,GS464E的亂序執(zhí)行引擎部分的基本參數(shù)相比Intel的Sandy Bridge仍有顯著落后。

首先,重定序隊列(Re-Order Buffer,ROB)決定了亂序執(zhí)行引擎能夠從多大的指令范圍內(nèi)抽取指令級并行度、挑選不相干指令進行亂序執(zhí)行。而整數(shù)物理寄存器數(shù)量決定了最多容納多少次整數(shù)寄存器重命名,在這些參數(shù)上龍芯仍有較大差距需要追趕。

除此之外,龍芯在發(fā)射隊列上還是選擇了設(shè)計難度較小、容易提高容量、但是也容易導(dǎo)致資源配置不均衡的分離式發(fā)射隊列設(shè)計。AMD和MIPS歷史上都曾使用過這種設(shè)計,在這種設(shè)計里面所有允許亂序執(zhí)行的指令都是分類型分開存儲的,比如整數(shù)指令存儲在自己的獨立發(fā)射隊列中,浮點指令存儲在另一個獨立發(fā)射隊列中,碰到整數(shù)密集型的程序把整數(shù)隊列占滿了之后,浮點發(fā)射隊列可能是全空的。

與之相對的設(shè)計是集中式發(fā)射隊列,集中式的發(fā)射隊列設(shè)計復(fù)雜,極難大幅提高容量,但是所有的指令都存儲在同一個地方,避免了空置的情況,這是與分布式發(fā)射隊列不同的權(quán)衡。

在這種設(shè)計上,Intel已經(jīng)浸淫多年,Intel的第一代亂序多發(fā)射微結(jié)構(gòu)P6就是采用集中式發(fā)射隊列,從Pentium4的Netburst開始改成了分布式發(fā)射隊列,從Core開始又改回了集中式發(fā)射隊列,并一直堅持至今,堪稱是集中式發(fā)射隊列設(shè)計的忠實擁簇。

在Core時代,Intel的集中式發(fā)射隊列容量僅為32條指令,而AMD的K8所配備的分布式發(fā)射隊列的總?cè)萘窟_到了60條指令,幾乎多了一倍,但強大的Intel硬生生地將自己的發(fā)射隊列容量逐年提高,終于在Haswell上實現(xiàn)了72條目的集中式發(fā)射隊列和8發(fā)射端口的設(shè)計。在不存在并發(fā)條件限制的情況下,單單這一個集中式發(fā)射隊列每周期就可以分派8條允許亂序執(zhí)行的指令到各個執(zhí)行單元,可謂是集中式發(fā)射隊列的登峰造極之作。

龍芯在論文中并未透露自己的分派寬度,但從發(fā)射隊列和執(zhí)行單元的配置來看,筆者估計可能在4~6條指令之間。

深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起
深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起

當然,在具體的細節(jié)上,龍芯GS464E這一邊的設(shè)計也有值得稱道的部分。所有頻繁觸及的執(zhí)行單元都能夠單周期完成操作,并通過激進的數(shù)據(jù)前遞設(shè)計在數(shù)據(jù)依賴的情況下支持背靠背發(fā)射,訪存流水線支持訪存指令的推測性發(fā)射和指令回放(一種較為困難的訪存優(yōu)化技巧,可以縮短訪存延遲)。

更值得稱贊的是,物理寄存器堆(PRF)和基于指針的發(fā)射隊列處理邏輯也被早早地引入,這是一條曾經(jīng)被Intel放棄的路線,后來為了引入AVX指令集又不得不選擇相同做法,龍芯非常聰明地避開了Intel曾經(jīng)走過的彎路。

但是這些細節(jié)改進并不足以幫助GS464E在亂序執(zhí)行能力上叫板Core i7,龍芯需要再花費多長時間才能達到Haswell的亂序執(zhí)行引擎的設(shè)計水平,就要看龍芯的物理和電路層設(shè)計水準能不能夠撐得住規(guī)模更大的發(fā)射隊列、更加復(fù)雜的數(shù)據(jù)前遞網(wǎng)絡(luò)以及支持更多并發(fā)讀寫口的物理寄存器堆,這些關(guān)鍵結(jié)構(gòu)是支撐亂序執(zhí)行引擎的設(shè)計重點所在。

容量充足 新一代GS464E之緩存系統(tǒng)

GS464E的一級數(shù)據(jù)緩存部分與指令緩存同為64KB,四路組關(guān)聯(lián),但是改成了串行訪問設(shè)計,亦即先訪問地址標記陣列(Tag Array),確定命中后再訪問數(shù)據(jù)陣列(Data Array)。這種設(shè)計的意圖是犧牲幾個周期的訪存延遲帶來更低的訪存功耗,但在GS464E可以維持4周期的一級數(shù)據(jù)緩存裝載至使用(load-to-use)延遲的情況下,這個代價是可以接受的。

深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起

從更為可靠的SPEC CPU 2000測試來看,相對于上代龍芯3A,GS464E的處理器性能在一些子項測試中的提升幅度可達到最高300%以上。

比較有趣的是一級數(shù)據(jù)緩存之下的部分,每個GS464E核心在一級緩存下還有一道獨立緩存系統(tǒng),龍芯組將它稱之為Victim Cache。

一般來說Victim Cache是附在一級緩存邊的一個小Cache,僅能存儲極少容量,主要為了接住被一級緩存踢出的數(shù)據(jù),并在急需時快速傳回它們。而龍芯的Victim Cache卻有256KB,從術(shù)語約定上來說這就已經(jīng)不是Victim Cache,而是正統(tǒng)的私有二級緩存。稱呼它為Victim Cache的原因應(yīng)該是因為這一道緩存與一級緩存之間是互斥式設(shè)計,亦即出現(xiàn)在一級緩存中的指令和數(shù)據(jù)在二級緩存一定沒有備份。

作為參考,AMD也使用了相同的互斥式設(shè)計。而Intel和IBM則堅持包含式設(shè)計,亦即一級緩存中出現(xiàn)的內(nèi)容在二級緩存中一定存在,這兩種設(shè)計方式主要會影響到緩存命中率以及多核情況下的緩存一致性維護,各有優(yōu)劣。

包含式設(shè)計的優(yōu)點是簡化了多核心計算下的同步問題,因為一級緩存中的數(shù)據(jù)保證在下層中存在,所以查詢數(shù)據(jù)同步狀態(tài)時只需要詢問下層存儲器即可,但缺點也非常明顯,就是浪費了緩存空間,因為多層緩存都保存了多份同樣的數(shù)據(jù)副本。而互斥式設(shè)計避免了空間浪費,但是每次處理多核心同步時都要檢索整個多級緩存體系,讓多核心的一致性問題變得更加復(fù)雜。

深度分析國產(chǎn)龍芯新架構(gòu)CPU:自主當崛起

而從最新公開的測試數(shù)據(jù)來看,在同位1GHz頻率下的環(huán)境里,GS464E架構(gòu)的性能已經(jīng)在浮點性能上超過AMD FX -8320,接近采用Sandy Bridge核心的Core i5 2300。

龍芯的二級緩存采用16路組相連設(shè)計,使用與一級數(shù)據(jù)緩存相同的串行訪問模式,龍芯的論文中稱這道緩存系統(tǒng)采用LRU替換算法,筆者認為這可能屬于筆誤,或者論文撰寫者與緩存模塊實際設(shè)計者雙方出現(xiàn)了溝通不暢。

因為16路組關(guān)聯(lián)如果要采用LRU替換算法就需要維持一個16!的狀態(tài)數(shù)=20922789888000的狀態(tài)機,這顯然是無法實現(xiàn)的。歷史上也從來沒有超過四路組關(guān)聯(lián)設(shè)計的緩存搭配了LRU替換策略,GS464E這里采用的應(yīng)當是一個經(jīng)過簡化的偽LRU算法。

需要指出的是,采用偽LRU算法這并不是一個性能缺陷,好的偽LRU算法的替換準確率與LRU相差無幾,在真LRU無法實現(xiàn)的情況下,所有超過四路組相連的緩存設(shè)計都是采用了偽LRU替換,Intel、AMD、IBM概莫能外。

在這個Victim Cache之下,還有最后一道被稱為SCache的片上共享三級緩存,這一級緩存仍舊是16路組相連,每個SCache模塊是1MB大小,四個核心的SCache模塊拼接起來就是4MB。一般而言末級緩存系統(tǒng)都是切分多個Bank之后通過掛接到Crossbar上,各個獨立核心通過Crossbar訪問共享的末級緩存。龍芯將SCache直接掛接到GS464E核心外,可能說明龍芯已經(jīng)采用了一些NoC(Network on Chip)的設(shè)計思路,在為未來擴展多核、眾核做準備。

值得稱道的是,龍芯的二級、三級兩級緩存都維持了較大的容量和組關(guān)聯(lián)度,但是訪問延遲較長,二級緩存的訪問延遲超過20個周期,比Intel處理器的二級緩存相比慢了幾乎一倍,三級緩存需要超過50個時鐘周期的時間,與Intel處理器基本持平。

友情提示:支持鍵盤左右鍵"←""→"翻頁
0

玩家點評 0人參與,0條評論)

收藏
違法和不良信息舉報
分享:

熱門評論

全部評論

他們都在說 再看看
3DM自運營游戲推薦 更多+