最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【知乎】我國(guó)為什么不推廣龍芯?

2023-12-07 07:39 作者:失傳技術(shù)  | 我要投稿


我國(guó)為什么不推廣龍芯?

龍芯現(xiàn)在看報(bào)道應(yīng)該有賽揚(yáng)J1800或者更強(qiáng)的性能了,雖然不能用windows,但是許多辦公的地方也不打游戲,就是簡(jiǎn)單的用辦公軟件,也許像個(gè)別財(cái)務(wù)部門(mén)等…

被瀏覽

1,188,025

查看我的回答

查看全部 119 個(gè)回答


llk


24 人贊同了該回答

結(jié)論是已經(jīng)花了很多精力,但是市場(chǎng)會(huì)自己做出選擇。除了商業(yè)上的原因,建議題主看看我的龍芯發(fā)展歷史文章,可以從技術(shù)角度得到一些答案。


首發(fā)于個(gè)人github主頁(yè)



前言

最近幾年系統(tǒng)性的學(xué)習(xí)并梳理了近30多年的計(jì)算技術(shù)發(fā)展歷史,稍有感悟。遂決定將之整理成文,目的有二,一來(lái)作為知識(shí)沉淀,串聯(lián)起不同技術(shù),挖掘不同架構(gòu)之間的淵源,二來(lái)通過(guò)整理再次審視歷史,期望窺見(jiàn)未來(lái)發(fā)展方向。我將本系列命名為鑒往知遠(yuǎn), 主要關(guān)注計(jì)算與互聯(lián)。 本文為第二篇,主要回顧龍芯系列。

0. 概述

龍芯根據(jù)架構(gòu)的不同,存在 3 個(gè)處理器系列。

  • 龍芯一號(hào),用于消費(fèi)電子和嵌入式應(yīng)用

  • 龍芯二號(hào),用于嵌入式應(yīng)用和低性能個(gè)人計(jì)算機(jī)的單核處理器

  • 龍芯三號(hào),用于更高性能計(jì)算機(jī)、高性能計(jì)算和服務(wù)器的多核處理器

龍芯處理器核按照微架構(gòu),分為四類(lèi),分別是:

  • 單發(fā)射32位(132)GS132:帶硬件分頻器的基本嵌入式 MIPS32 內(nèi)核。3- (GS132) 或 5- (GS132E) 級(jí)流水線(xiàn)

  • 雙發(fā)射32位(232)GS232:高端嵌入式 MIPS32

  • GS232?最多有 5 級(jí)流水線(xiàn),500MHz,16KB L1。GS232?主要用于龍芯一號(hào)產(chǎn)品

  • GS232E最多有 10 級(jí)流水線(xiàn),1000 MHz,16KB L1,L2 = 4 MB 共享。亂序執(zhí)行

  • 四發(fā)射64位(464) GS464:具有四路超標(biāo)量亂序執(zhí)行的MIPS64內(nèi)核。該設(shè)計(jì)起源于龍芯2F處理器

  • GS464?支持 MIPS64 R2 + LoongMMI(2E 和 2F 中的兩個(gè)不同版本)

  • GS464V?于 2010 年隨龍芯3B?首次推出,是具有矢量功能的?GS464

  • GS464E是?GS464?的改進(jìn)版本,包括更大的緩存和更好的分支預(yù)測(cè)等

  • GS464EV?是?GS464?系列的發(fā)展,首先被?3A4000?處理器使用

  • 雙發(fā)射64位(264)GS264:MIPS64 內(nèi)核,是GS232的64位實(shí)現(xiàn)

另外,LA464?是?GS464的發(fā)展,支持 LoongArch。下圖展示了龍芯各代產(chǎn)品之間繼承和發(fā)展關(guān)系圖:

  • 龍芯 1?即Godson-1是單發(fā)射亂序32位處理器,是中國(guó)國(guó)內(nèi)設(shè)計(jì)的第一個(gè)通用處理器

  • 龍芯 2?是 MIPS III 兼容 64 位處理器系列。與龍芯 3 系列共享 GS464處理器核,龍芯 2的發(fā)展規(guī)劃是從CPU發(fā)展為SOC。龍芯 2E (2006) 是一個(gè) CPU,2F (2007) 集成了北橋。2F 的設(shè)計(jì)是?GS464?核心的基礎(chǔ)

  • 2009年的龍芯 3A1000是第一個(gè)生產(chǎn)的處理器,使用 4 個(gè)?GS464?內(nèi)核,65 nm工藝。?龍芯 3A1000?能夠以接近 1 GHz的時(shí)鐘速度運(yùn)行,首先是4 個(gè) CPU 內(nèi)核(~15 W),然后是 8 個(gè)內(nèi)核(40 W)的龍芯3B1500

  • 2015 年,發(fā)布了?龍芯3A1500?和?龍芯3B2000。使用增強(qiáng)型?GS464E?處理器核,改進(jìn)后的微體系結(jié)構(gòu)提供了更好的性能,據(jù)報(bào)道速度是?龍芯3A1000?的 3 倍,并且還引入了?LoongISA 增強(qiáng)型指令集。?龍芯3A1500?用于嵌入式應(yīng)用,而?龍芯3B2000?用于服務(wù)器和 PC

  • 2017年龍芯發(fā)布龍芯3A3000龍芯3A3000?采用四核 64 位設(shè)計(jì),主頻為 1.5 GHz,功耗僅為 30 W

  • 2019 年底,發(fā)布了?龍芯3A 4000?和?龍芯3B 4000?系列。使用了升級(jí)后的?GS464EV?微架構(gòu)。處理器設(shè)計(jì)有四個(gè)內(nèi)核,8MB 的 L3 緩存和 1.8 GHz 至 2 GHz 之間的工作時(shí)鐘

  • 2021年7月,龍芯3 5000系列發(fā)布。該系列處理器是龍芯首款自主研發(fā)的LoongArch指令集架構(gòu),包括?龍芯3A5000,一個(gè)四核臺(tái)式機(jī) CPU 和?3C5000L,一個(gè)十六核服務(wù)器 CPU,基于單個(gè)封裝中的四個(gè) 3A5000。使用LA464處理器核

  • 2023年11月,龍芯官方發(fā)布龍芯3A6000使用是6發(fā)射雙線(xiàn)程的LA664處理器核

本文主要關(guān)注龍芯三號(hào),其微架構(gòu)主要為四發(fā)射64位,即GS464系列。關(guān)于龍芯指令集架構(gòu)歷史淵源請(qǐng)參考第一章龍芯指令集架構(gòu)的介紹。本文通過(guò)系統(tǒng)性回顧整個(gè)龍芯系列處理器,試圖通過(guò)龍芯系列處理器發(fā)展的歷史脈絡(luò),來(lái)展現(xiàn)國(guó)內(nèi)處理器技術(shù)發(fā)展歷程,以及和國(guó)際主流處理器廠(chǎng)商的差異。下表總結(jié)了各代處理器之間的關(guān)鍵指標(biāo)和規(guī)格:


Godson-1Godson-2BGodson-2CGodson-2ELoongson 2FLoongson 2GLoongson 3A1000Loongson 3B1500Loongson 3A2000Loongson 3A3000Loongson 3A4000Loongson 3A5000Loongson 3A6000Date2001200320042006200820102009201520152016201920212023Core NameGS132NANAGS464r1GS464r1GS464r2GS464r2GS464VGS464EGS464EGS464EVGS464V/LA464LA664Technology0.18um0.18um0.18um90nmST 90nmST 65nmST 65nmSMIC 32nmSMIC 40nmST 28nmST 28nm12nm12nmTransistors4M15M15M47M51M100M425M1.14B8B8BArea(mm^2)NA41.541.5364354140182.5248.6(17.66x14.08)248.6(25.3x28.8)232147TDP(W)0.5NANA5-73-531530-6015405035Frequency(GHz)0.2660.250.4510.810.8-11.50.8-11.2-1.51.82.3-2.52.5No. Inst Decode1444444444444No. Inst Issue1444444444446COREs1111114844444ThreadsSTSTSTSTSTSTSTSTSTSTSTSTSMT2L1 CacheI$: 8K 2 way
D$: 8K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayI$: 64K 4 way
D$: 64K 4 wayL2 CacheNA8MB offchip8MB offchip512K 4 way512K 4 way1M 4 way4M 8 way128K/Core256K/Core 16 way256K/Core256K/Core256K/Core 16 way256K/CoreL3 CacheNANANANANANANA8M4M 16 way8M 16 way8M 16 way16M 16 way16M 16 wayIOPCIPCIPCIPCIPCIPCIHT 1.0 2x8@800MHzHT 2.0 2x16@3.2GHzHT 2x16@3.2GHzHT 2x16@3.2GHzHT 2x16@3.2GHzHT 2x16@3.2GHzHT 3.0 x16@6.4GHzMemory8-256M128bit 64M-2GDDRDDR2DDR2-333DDR2/3DDR2/3DDR2-800/3-1200 2x72DDR2-800/3-1333 2x72DDR2-800/3-1600 2x72DDR4-2400 2x72DDR4-3200 2x72DDR4-3200 2x72@42GB/sCommentsMIPS-III 32MIPS-III 64MIPS-III 64MIPS-III 64MIPS-III 64MIPS64MIPS64LoongISA 1.0LoongISA 1.0LoongISA 1.0LoongISA 2.0LoongISA 2.0


可以發(fā)現(xiàn),龍芯處理器很多精力都花在指令集上了,而本身處理器核的微架構(gòu)更新比較緩慢。

本文組織形式如下:

  • 第一章簡(jiǎn)單介紹龍芯指令集架構(gòu)LoongArch v1.02

  • 第二章介紹Godson-1的微架構(gòu),了解龍芯乃至中國(guó)的第一個(gè)處理器設(shè)計(jì)

  • 第三章介紹Godson-2Godson-3A的處理器核GS464微架構(gòu),后續(xù)龍芯都是以GS464為基礎(chǔ)

  • 第四章簡(jiǎn)單描述Loongson-3B1500?整體架構(gòu)以及支持向量運(yùn)算的處理器核GS464V微架構(gòu)

  • 第五章介紹Loongson-3A2000的處理器核GS464E的微架構(gòu)

  • 第六章簡(jiǎn)單介紹基于GS464E的Loongson-3A3000,主要是基于Loongson-3A2000做了工藝升級(jí)?第

  • 七章簡(jiǎn)單介紹基于GS464EV的Loongson-3A4000,

  • 第八章介紹基于LA464處理器核的Loongson-3A5000

  • 第九章介紹Loongson-3A6000

  • 文章最后列出了主要的參考文獻(xiàn)

1. LoongArch指令集架構(gòu)

龍芯的指令集架構(gòu)分為三個(gè)階段:

  1. MIPS?龍芯在初始階段使用MIPS64 指令集架構(gòu)(ISA)。2009 年 6 月,ICT 直接從MIPS公司獲得了 MIPS32 和 MIPS64 架構(gòu)的許可。2011 年 8 月,龍芯科技有限公司從 MIPS 公司獲得 MIPS32 和 MIPS64 架構(gòu)許可,用于繼續(xù)開(kāi)發(fā)基于 MIPS 的龍芯 CPU 內(nèi)核

  2. LoongISA?2015年龍芯3A2000采用LoongISA 1.0擴(kuò)展指令集,是 MIPS64 的超集。LoongISA?指令作為?GS464E?內(nèi)核的一部分引入。包括下列部分:

  3. LoongEXT,通用擴(kuò)展,148 條指令

  4. LoongVZ,MIPS64 版本 5 中引入的“VZ”系統(tǒng)的虛擬化擴(kuò)展,5 條指令

  5. LoongBT,更快的 x86 和ARM二進(jìn)制翻譯,213 條指令

  6. LoongSIMD,原名LoongMMI(在龍芯2E/F),為128位SIMD,1014條指令

  7. 來(lái)自 MIPS 第 5 版的 MIPS SIMD 架構(gòu) (MSA)、DSP 和 VZ 模塊

  8. LoongArch?隨著龍芯 3 5000?系列的發(fā)布,龍芯在 2021 年轉(zhuǎn)向了自己的處理器指令集架構(gòu)(ISA)。LoongArch?包括一個(gè)簡(jiǎn)化的 32 位版本(LA32R),一個(gè)標(biāo)準(zhǔn)的 32位版本 (LA32S) 和 64 位版本 (LA64)。

LoongArch ISA?手冊(cè)已于 2021 年 8 月部分可用,其第一卷記錄了基本架構(gòu)。根據(jù)LoongArch手冊(cè),ISA使用了MIPS的特權(quán)模型和IRQ機(jī)制,其他部分大多遵循RISC-V的做法:去掉了分支延遲槽,改變了指令編碼。LoongArch?是全新的指令集,不是在 MIPS 上做的擴(kuò)展。包含基礎(chǔ)指令 337 條、虛擬機(jī)擴(kuò)展 10條 、二進(jìn)制翻譯擴(kuò)展176 條、128 位向量擴(kuò)展 1024 條、256 位向量擴(kuò)展 1018 條,共計(jì) 2565 條原生指令。相對(duì)于MIPS,摒棄了部分不適合現(xiàn)代CPU的指令,又做了大量改進(jìn)和擴(kuò)展。例如單條指令支持的立即數(shù)從MIPS的最大16位擴(kuò)展到最大24位,分支跳轉(zhuǎn)偏移也從64K擴(kuò)展到1M字節(jié),以及尋址空間從固定分段改變?yōu)閱我黄矫娴?,都有效減少了編譯結(jié)果的目標(biāo)指令條數(shù)和訪(fǎng)存次數(shù),提高了效能。LoongArch的指令系統(tǒng)在設(shè)計(jì)時(shí),以先進(jìn)性、擴(kuò)展性、兼容性為目標(biāo),其中兼容性是指融合MIPS/x86/ARM指令系統(tǒng)的主要特點(diǎn),高效支持二進(jìn)制翻譯。

1.1 寄存器

LoongArch?為RISC指令集,有32個(gè)通用寄存器、32個(gè)浮點(diǎn)/向量寄存器。其中r0的值為0,PC的值是當(dāng)前指令地址,只能被轉(zhuǎn)移指令,異常陷入和異常返回間接修改。寄存器寬度在LA32下是32比特,在LA64下是64比特。

1.2 計(jì)算模式

龍芯架構(gòu)分為L(zhǎng)A32和LA64兩種計(jì)算模式,LA64可以兼容LA32的應(yīng)用層軟件,具體由CSR.MISC.VA32L1/VA32L2/VA32L3控制,當(dāng)這些值為1時(shí),運(yùn)行在PLV1/PLV2/PLV3級(jí)下的軟件就以32位地址模式運(yùn)行。此時(shí)硬件將訪(fǎng)存虛擬地址低32位零擴(kuò)展至64位之后的值作為訪(fǎng)存的地址。

1.3 指令格式

MIPS只有3種指令格式,LoongArch重新設(shè)計(jì)了指令格式 ,使用32位定長(zhǎng)指令,可用的格式多達(dá)9種 ,其包含3種無(wú)立即數(shù)格式和6種有立即數(shù)格式。重新設(shè)計(jì)的指令格式可以包含更多的指令槽,有利于以后的長(zhǎng)遠(yuǎn)發(fā)展。指令編碼格式如下表所示:

1.4 特權(quán)模型

龍芯架構(gòu)分為4個(gè)特權(quán)等級(jí),分別是PLV0~PLV3,由CSR.CRMD.PLV?確定。其中,PLV0具有最高特權(quán)等級(jí),可以使用特權(quán)指令并訪(fǎng)問(wèn)所有特權(quán)資源。PLV1~PLV3,都不能執(zhí)行特權(quán)指令和訪(fǎng)問(wèn)特權(quán)資源,在MMU采用映射地址翻譯模式下具有不同的訪(fǎng)問(wèn)權(quán)限。

1.5 存儲(chǔ)模型

龍芯架構(gòu)的存儲(chǔ)一致性模型采用弱一致性(Weakly Consistency)模型,程序必須使用同步指令對(duì)寫(xiě)共享單元的訪(fǎng)問(wèn)保護(hù)起來(lái),以保證對(duì)于寫(xiě)共享單元的訪(fǎng)問(wèn)是互斥的。對(duì)訪(fǎng)存的順序限制如下:

  1. 同步指令的執(zhí)行滿(mǎn)足順序一致性條件,即同步操作在所有處理器核中都嚴(yán)格按照程序順序執(zhí)行,在當(dāng)前同步指令完成之前不能開(kāi)始執(zhí)行下一個(gè)同步操作

  2. 在任一訪(fǎng)存指令被執(zhí)行之前,該指令之前的同步指令已經(jīng)完成

  3. 在任一同步指令被執(zhí)行之前,該指令之前的訪(fǎng)存指令都已完成

龍芯架構(gòu)下支持三種存儲(chǔ)訪(fǎng)問(wèn)類(lèi)型,由頁(yè)表中MAT(Memory Access Type)?決定,分別是:

  • 一致可緩存(Coherent Cached)?訪(fǎng)問(wèn)對(duì)象可以是主存也可以是緩存

  • 強(qiáng)序非緩存(Strongly-ordered UnCached)?嚴(yán)格按照程序順序執(zhí)行

  • 弱序非緩存(Weakly-ordered UnCached)?讀允許投機(jī)執(zhí)行,寫(xiě)可以合并

1.6 內(nèi)存管理及虛擬化

龍芯架構(gòu)MMU地址翻譯由CSR.CRMD控制,

  • 當(dāng)CSR.CRMD.DA=1 && CSR.CRMD.PG=0時(shí),虛擬地址就是物理地址

  • 當(dāng)CSR.CRMD.DA=0 && CSR.CRMD.PG=1時(shí),虛擬地址需要經(jīng)過(guò)翻譯,可以分為直接映射和頁(yè)表映射

1.6.1 直接映射地址翻譯模式

軟件通過(guò)設(shè)置CSR.DMW0~CSR.DMW3寄存器來(lái)分別設(shè)置四個(gè)直接映射配置窗口,前兩個(gè)同時(shí)用于取指和存儲(chǔ)加載指令,后兩個(gè)只作用于存儲(chǔ)加載指令。 在LA64架構(gòu)下,當(dāng)虛擬地址最高4位[63:60]與配置窗口寄存器中的VSEG域相等且特權(quán)等級(jí)匹配時(shí),物理地址等于虛擬地址的[PALEN-1:0]。 在LA32架構(gòu)下,每一個(gè)直接映射配置窗口寄存器可以配置一個(gè)$2^{29}$字節(jié)固定大小的虛擬地址空間,當(dāng)虛擬地址的最高3位[31:29]與配置窗口寄存器中的[31:29]相等且特權(quán)等級(jí)匹配時(shí),物理地址等于虛擬地址[28:0]拼接上映射配置寄存器配置的物理地址高位。

1.6.2 頁(yè)表映射

龍芯架構(gòu)下TLB的重填以及TLB與內(nèi)存頁(yè)表的一致性維護(hù)全部需要軟件完成,多級(jí)頁(yè)表結(jié)構(gòu)如下所示:

當(dāng)遍歷頁(yè)表時(shí),PGD由虛擬地址$PALEN-1$決定,?當(dāng)VA[PALEN-1]=0時(shí),PGD來(lái)自CSR.PGDL?當(dāng)VA[PALEN-1]=1時(shí),PGD來(lái)自CSR.PGDH

頁(yè)表項(xiàng)格式如下表所示:

1.7 異常和中斷

異常和中斷會(huì)打斷當(dāng)前正在執(zhí)行的應(yīng)用程序,并切換到異常中斷處理程序入口開(kāi)始執(zhí)行,異常和中斷屬于架構(gòu)中特權(quán)資源處理部分,下面主要介紹常用一些異常:

  • 系統(tǒng)調(diào)用異常?執(zhí)行SYSCALL 指令觸發(fā)

  • 斷點(diǎn)異常?執(zhí)行BREAK指令觸發(fā)

  • 指令不存在異常?所執(zhí)行的指令編碼未定義時(shí)觸發(fā)

  • 特權(quán)指令錯(cuò)異常?在非特權(quán)模式下執(zhí)行特權(quán)指令時(shí)觸發(fā)

  • 地址錯(cuò)異常?當(dāng)取指或訪(fǎng)存指令的地址出現(xiàn)分發(fā)情況時(shí),分別會(huì)觸發(fā)取指指令地址錯(cuò)異?;蛟L(fǎng)存指令地址錯(cuò)異常

  • 浮點(diǎn)錯(cuò)異常?當(dāng)浮點(diǎn)指令的數(shù)據(jù)出現(xiàn)異常情況需要特殊處理時(shí)觸發(fā)

1.7.1 異常和中斷處理

TLB重填異常的入口地址是CSR.TLBRENTRY, 機(jī)器錯(cuò)誤異常的入口是CSR.MERRENTRY,其他異常稱(chēng)為普通異常,入口地址等于$入口頁(yè)號(hào) | 頁(yè)內(nèi)偏移$ ,所有普通異常的入口頁(yè)號(hào)都是CSR.EENTRY ;而頁(yè)內(nèi)偏移由中斷偏移模式和異常號(hào)(ecode)共同決定,等于$2^{CSR.ECFG.VS+2} * (ecode+64)$ 。中斷被當(dāng)成普通異常處理,因此使用普通異常的入口計(jì)算方式,區(qū)別是,中斷對(duì)應(yīng)的異常號(hào)是對(duì)應(yīng)中斷號(hào)加上64。異常ecode如下表所示:

觸發(fā)異常的指令的地址會(huì)被記錄到ERA里,作為異常返回地址;對(duì)于地址錯(cuò)誤相關(guān)的異常,出錯(cuò)的地址會(huì)被記錄到BADV。觸發(fā)異常的指令會(huì)被記錄到BADI里。

2. Godson-1

龍芯第一款處理器龍芯1號(hào)設(shè)計(jì)于2001年,2002年發(fā)布,是一款32位單發(fā)射亂序執(zhí)行CPU,主頻266MHz。學(xué)術(shù)論文上代號(hào)是Godson-1,是中國(guó)科學(xué)院知識(shí)創(chuàng)新工程方向性項(xiàng)目與國(guó)家“八六三”高技術(shù)研究發(fā)展計(jì)劃項(xiàng)目的研究成果。它采用 0.18 微米 CMOS 工藝制造,具有 8 KB L1D、8 KB L1I 和一個(gè) 64 位浮點(diǎn)單元,能夠達(dá)到 200 雙精度 MFLOPS。下圖展示了Godson-1的物理規(guī)劃版圖:

龍芯1號(hào)實(shí)現(xiàn)基于操作隊(duì)列復(fù)用的寄存器重命名技術(shù),采用Tomasulo算法進(jìn)行動(dòng)態(tài)調(diào)度,分支預(yù)測(cè)使用靜態(tài)預(yù)測(cè),即每次都預(yù)測(cè)分支執(zhí)行。主要由取值單元,譯碼單元,操作隊(duì)列,定點(diǎn)和浮點(diǎn)寄存器文件和定點(diǎn)浮點(diǎn)執(zhí)行單元組成。下圖展示了Godson-1的微架構(gòu):

指令譯碼單元按程序順序?qū)⒆g碼后指令分發(fā)到操作隊(duì)列,操作隊(duì)列根據(jù)指令類(lèi)型發(fā)射到對(duì)應(yīng)的保留站,并按序結(jié)束已經(jīng)完成的指令。保留站中的指令經(jīng)過(guò)執(zhí)行單元之后,結(jié)果寫(xiě)回到操作隊(duì)列和結(jié)果總線(xiàn)。如果指令發(fā)射時(shí)源操作數(shù)還沒(méi)有準(zhǔn)備好,并不會(huì)阻止指令的發(fā)射,而是通過(guò)操作隊(duì)列號(hào)建立指令間的數(shù)據(jù)依賴(lài)關(guān)系并發(fā)射到保留站;保留站自動(dòng)偵聽(tīng)總線(xiàn)結(jié)果并接受所需要的值,具體過(guò)程如下:

  1. 指令進(jìn)入操作隊(duì)列時(shí)將該指令的的源寄存器號(hào)與操作隊(duì)列中的每一個(gè)指令的目標(biāo)寄存器號(hào)進(jìn)行比較,得到操作隊(duì)列中最近的寫(xiě)該寄存器的指令的位置Qid

  2. 指令發(fā)射時(shí)檢查Qid的值,如果已經(jīng)寫(xiě)回到操作隊(duì)列則直接讀出,否則將Qid送到保留站并記錄值未準(zhǔn)備好

  3. 當(dāng)保留站中所有操作數(shù)都準(zhǔn)備好后開(kāi)始運(yùn)算并把結(jié)果送到結(jié)果總線(xiàn),對(duì)應(yīng)操作隊(duì)列和保留站

指令流水線(xiàn)分成取值,譯碼,重命名,發(fā)射,執(zhí)行,寫(xiě)回,完成等階段,其中執(zhí)行階段可能需要多拍,具體如下:

  • 取值?根據(jù)當(dāng)前程序計(jì)數(shù)器PC將指令從緩存讀到指令寄存器IR,無(wú)分支指令及異常情況下,下一條指令的PC為當(dāng)前指令的PC+4

  • 譯碼?根據(jù)IR中的指令進(jìn)行譯碼并寫(xiě)入操作隊(duì)列,如果操作隊(duì)列已滿(mǎn),流水線(xiàn)暫停

  • 重命名?該指令的的源寄存器號(hào)與操作隊(duì)列中的每一個(gè)指令的目標(biāo)寄存器號(hào)進(jìn)行比較,得到操作隊(duì)列中最近的寫(xiě)該寄存器的指令的位置Qid

  • 發(fā)射?從操作隊(duì)列中選出一個(gè)指令并發(fā)射到相應(yīng)的保留站,如果指令源操作數(shù)不可用,則需要保留站記錄值未準(zhǔn)備好

  • 執(zhí)行?執(zhí)行單元從保留站中取出所有源操作數(shù)都準(zhǔn)備好的指令進(jìn)行運(yùn)算,并將結(jié)果及指令在操作隊(duì)列位置編號(hào)送到結(jié)果寄存器

  • 寫(xiě)回?把結(jié)果寄存器的值以及相應(yīng)指令在操作隊(duì)列位置編號(hào)送到結(jié)果總線(xiàn),保留站和操作隊(duì)列偵聽(tīng)結(jié)果總線(xiàn)的信息,并更新相應(yīng)狀態(tài)

  • 結(jié)束?如果操作隊(duì)列中的第一個(gè)指令已經(jīng)完成,則結(jié)束該指令并將操作隊(duì)列里的結(jié)果寫(xiě)回到目標(biāo)寄存器。如果操作隊(duì)列中的第一個(gè)指令在執(zhí)行過(guò)程中發(fā)生異常,則進(jìn)行異常處理

3. Godson-2 和 Godson-3

龍芯2F于2007年7月31日流片成功,90納米工藝,4發(fā)射亂序執(zhí)行,面積 $43mm^2$ ,龍芯2F龍芯第一款成功的商用處理器。下圖展示了Godson-2E的物理規(guī)劃圖:

下圖展示了Godson-2F的物理規(guī)劃圖:

龍芯2G是在“龍芯安全適用計(jì)算機(jī)CPU研制與應(yīng)用”核高基重大專(zhuān)項(xiàng)課題支持下研發(fā)的,2008年開(kāi)始投入設(shè)計(jì),2010年研制成功。龍芯2G采用65納米工藝,主頻1.0GHz,晶體管數(shù)目1億,指令集兼容MIPS64,且增加了X86二進(jìn)制翻譯加速指令,以及龍芯媒體擴(kuò)展指令,有64KB的指令和64KB數(shù)據(jù)的L1緩存,以及1MB的L2緩存,功耗3W。在該處理器上,使用了X86二進(jìn)制翻譯技術(shù),提出了在MIPS平臺(tái)上實(shí)現(xiàn)X86動(dòng)態(tài)二進(jìn)制翻譯的方法。龍芯2G相當(dāng)于龍芯3A1000的單核版本。龍芯3A1000于2008年底交付流片,采用意法半導(dǎo)體的65nm工藝流片,主頻800MHz-1GHz。龍芯3A1000進(jìn)行了第一次改版并于2010年5月中旬流片,10月底第一次改版流片成功。3A1000的第二次改版于2012年2月下旬流片,2012年8月中旬流片成功。

龍芯3A1000集成了4個(gè)四發(fā)射亂序執(zhí)行的GS464核,9級(jí)流水線(xiàn),有64KB一級(jí)數(shù)據(jù)緩存和64KB一級(jí)指令緩存,4MB共享二級(jí)緩存,最高主頻1GHz,功耗15w(支持動(dòng)態(tài)降頻),芯片面積 $174mm^2$ ,晶體管數(shù)目4.25億。每個(gè)CPU核包含兩個(gè)浮點(diǎn)乘加部件,雙精度浮點(diǎn)性能峰值為16GFlops。在龍芯3A1000處理器中,實(shí)現(xiàn)了x86二進(jìn)制翻譯加速指令。3A1000集成了PCI控制器、LPC、SPI、UART、GPIO和2個(gè)HT1.0;集成72位DDR2/3控制器。下圖展示了Godson-3A1000的物理規(guī)劃版圖:

龍芯3A1000第一級(jí)互聯(lián)采用6x6的交叉開(kāi)關(guān),用于4個(gè)處理器核,4個(gè)共享緩存模塊和兩個(gè)IO端口的連接。第二級(jí)互聯(lián)采用5x3的交叉開(kāi)關(guān),連接4個(gè)共享的緩存模塊,兩個(gè)內(nèi)存控制器和一個(gè)IO端口。下圖展示了龍芯3A1000整體架構(gòu):

下圖展示了一個(gè)8x8交叉互聯(lián)的架構(gòu):

8個(gè)AXI master link(AML)?和 8個(gè)AXI slave link(ASL)?通過(guò)一個(gè)交叉開(kāi)關(guān)進(jìn)行互聯(lián),AML?使用讀寫(xiě)請(qǐng)求的地址信息進(jìn)行路由,讀寫(xiě)各有8個(gè)地址區(qū)間,對(duì)應(yīng)ASL。ASL通過(guò)相應(yīng)請(qǐng)求的AML?端口號(hào)將讀寫(xiě)響應(yīng)路由到對(duì)應(yīng)的AML。AML和ASL各有兩級(jí)流水,所以交叉互聯(lián)一共有4個(gè)周期延遲。

3.1 GS464微架構(gòu)

下圖展示了GS464的微架構(gòu):

指令流水線(xiàn)分成取值,譯碼,重命名,發(fā)射,執(zhí)行,寫(xiě)回,完成等階段,其中執(zhí)行階段可能需要多拍,具體如下:

  • 取值?根據(jù)當(dāng)前程序計(jì)數(shù)器PC將指令從緩存讀到指令寄存器IR,無(wú)分支指令及異常情況下,下一條指令的PC為當(dāng)前指令的PC+16

  • 預(yù)譯碼?對(duì)指令掃描,識(shí)別出分支指令并對(duì)其分支方向進(jìn)行預(yù)測(cè)

  • 譯碼?根據(jù)IR中的4條指令進(jìn)行譯碼并送到寄存器重命名模塊

  • 重命名?將架構(gòu)寄存器映射到物理寄存器上

  • 分發(fā)?寄存器重命名之后的指令被分發(fā)到定點(diǎn)或浮點(diǎn)保留站以便執(zhí)行,同時(shí)送到重定序隊(duì)列以便順序完成;分支和存儲(chǔ)加載指令被分發(fā)到對(duì)應(yīng)的分支隊(duì)列和存儲(chǔ)加載隊(duì)列。保留站和發(fā)射隊(duì)列每項(xiàng)可保存分發(fā)4條指令

  • 發(fā)射?從保留站中選出操作數(shù)都準(zhǔn)備好且最老的一個(gè)指令并發(fā)送到相應(yīng)的執(zhí)行單元,如果指令源操作數(shù)不可用,則偵聽(tīng)結(jié)果和前饋總線(xiàn)

  • 執(zhí)行?執(zhí)行單元從保留站中取出所有源操作數(shù)都準(zhǔn)備好的指令進(jìn)行運(yùn)算,并將結(jié)果發(fā)送到結(jié)果和前饋總線(xiàn)

  • 結(jié)束?每周期可完成4條指令,完成的指令的結(jié)果被發(fā)送到寄存器映射模塊以便更新架構(gòu)寄存器同時(shí)釋放資源

3.1.1 取指和分支預(yù)測(cè)

GS464包含 1 個(gè)4 路組相聯(lián) 64 KB 的指令緩存, 其緩存行大小為 32 字節(jié), 指令緩存的標(biāo)簽和數(shù)據(jù)部分同時(shí)訪(fǎng)問(wèn)并在下一時(shí)鐘周期進(jìn)行命中的判斷與選擇。其中數(shù)據(jù)部分劃分為 8 個(gè)bank,每次取指令時(shí)只用讀取所需要的bank, 降低了緩存訪(fǎng)問(wèn)時(shí)的動(dòng)態(tài)功耗。指令緩存使用虛地址索引和實(shí)地址標(biāo)識(shí)的索引方案。取指部件的虛實(shí)地址轉(zhuǎn)換通過(guò) 16 項(xiàng)全相聯(lián)結(jié)構(gòu)的指令 TLB 完成, 指令 TLB 中的內(nèi)容是頁(yè)表的子集。其中, 每項(xiàng)存放 1 個(gè)頁(yè)表項(xiàng), 每個(gè)頁(yè)表項(xiàng)均可支持 4 KB-1 GB 之間不同大小的頁(yè)。當(dāng)指令緩存命中時(shí), 取指部件每個(gè)時(shí)鐘周期最多可以從指令緩存中取出 4 條指令, 并送往下 一個(gè)流水級(jí)進(jìn)行分支預(yù)測(cè). 而當(dāng)指令緩存未命中時(shí), 取指部件將生成請(qǐng)求并訪(fǎng)問(wèn)緩存失效隊(duì)列, 訪(fǎng)存失效隊(duì)列負(fù)責(zé)進(jìn)行緩存缺失處理, 并將結(jié)果返回給指令緩存。從緩存失效隊(duì)返回的結(jié)果將整體填回指令緩存, 指令緩存最多可容忍 3 個(gè)緩存行不命中, 即有 3 個(gè)未完成 (outstanding) 的緩存行不命中時(shí), 依舊可以從正確的地址取指令。當(dāng)取指請(qǐng)求恰好落在從緩存失效隊(duì)列返回的緩存請(qǐng)求數(shù)據(jù)上時(shí), 可以直接取出相應(yīng)指令進(jìn)入下一個(gè)流水級(jí)。此 外, 指令緩存的預(yù)取由緩存失效隊(duì)列中的硬件預(yù)取引擎統(tǒng)一完成, 不在取指部件中單獨(dú)進(jìn)行。指令緩存的數(shù)據(jù)部分中還包含預(yù)譯碼信息, 每條指令的預(yù)譯碼信息為 8比特大小, 主要用于指令切分、分支類(lèi)型判定和部分指令例外的判定。預(yù)譯碼信息通過(guò)在緩存失效隊(duì)列重填指令緩存時(shí)計(jì)算得出, 并存儲(chǔ)在指令緩存中。

在預(yù)譯碼階段,會(huì)掃描IR里4條指令中的分支指令并預(yù)測(cè)分支方向和分支目標(biāo),branch-like 和 jump 指令總是預(yù)測(cè)執(zhí)行,對(duì)于條件分支指令,則使用分支歷史表(BHT)來(lái)預(yù)測(cè)分支方向,使用分支目標(biāo)緩沖(BTB)和返回地址堆棧(RAS)預(yù)測(cè)分支目標(biāo)地址。BHT由9比特全局歷史寄存器(global history register) GHR 和4K模式歷史表(pattern history table) PHT組成,PHT里每項(xiàng)有2比特的飽和計(jì)數(shù)器,高位用于分支方向預(yù)測(cè)。BTB有16項(xiàng),每一項(xiàng)由指令地址和跳轉(zhuǎn)指令目標(biāo)地址以及2比特飽和計(jì)數(shù)器組成,計(jì)數(shù)器值為0或1的項(xiàng)首先被替換。RAS有4項(xiàng),當(dāng)遇到branch and link 指令時(shí),將當(dāng)前指令地址加8推進(jìn)RAS,而遇到j(luò)ump register 31 指令時(shí)從RAS中彈出指令地址。

在譯碼階段,4條指令被譯碼并送到寄存器重命名模塊。

3.1.2 寄存器重命名

GS464使用合并的架構(gòu)和重命名寄存器堆,定點(diǎn)和浮點(diǎn)分別是64項(xiàng),相應(yīng)使用64項(xiàng)的PRMT(physical register mapping tables)來(lái)維護(hù)架構(gòu)和物理寄存器之間映射關(guān)系。PRMT每項(xiàng)包含:

  • 狀態(tài) 每個(gè)物理寄存器處在下列狀態(tài)之一:MAP_EMPTY,MAP_MAPPED,?MAP_WTBK,?MAP_COMMIT

  • 名字 物理寄存器對(duì)應(yīng)的架構(gòu)寄存器標(biāo)識(shí)

  • 有效位 如果多個(gè)物理寄存器映射到一個(gè)架構(gòu)寄存器,則標(biāo)識(shí)最新的

寄存器重命名時(shí),需要查找PRMT來(lái)找到兩個(gè)源寄存器src1,src2,目標(biāo)寄存器dest 對(duì)應(yīng)的最新映射的物理寄存器psrc1, psrc2和odest。另外,一個(gè)處于MAP_EMPTY的物理寄存器pdest被映射到dest,且狀態(tài)修改為MAP_MAPPED,有效位置1,odest有效位置0。之后映射的物理寄存器被送到保留站,odest保存在重定序隊(duì)列以便指令結(jié)束時(shí)釋放物理寄存器。當(dāng)指令執(zhí)行完成時(shí),對(duì)應(yīng)的PRMT項(xiàng)狀態(tài)更新為MAP_WTBK, 指示后續(xù)依賴(lài)指令的操作數(shù)準(zhǔn)備好了。當(dāng)指令完成后,pdest的狀態(tài)更新為MAP_COMMIT,odest更新為MAP_EMPTY。

3.1.2 指令發(fā)射

GS464有兩個(gè)保留站,分別是定點(diǎn)和存儲(chǔ)加載保留站和浮點(diǎn)保留站。每個(gè)保留站有16項(xiàng),每周期可接收4條指令。每項(xiàng)包含一個(gè)年齡域,當(dāng)指令進(jìn)入保留站時(shí)設(shè)置成最小值,當(dāng)同一個(gè)功能單元的新指令進(jìn)入時(shí),舊指令的值加一。從保留站中選出操作數(shù)都準(zhǔn)備好且最老的一個(gè)指令并發(fā)送到相應(yīng)的執(zhí)行單元,如果指令源操作數(shù)不可用,則偵聽(tīng)結(jié)果和前饋總線(xiàn)

對(duì)于分支指令,除了發(fā)送到保留站和重定序隊(duì)列之外,還會(huì)進(jìn)入分支隊(duì)列,每周期可接收一條分支指令,同時(shí)最多保存8條分支指令。當(dāng)分支指令執(zhí)行時(shí),結(jié)果寫(xiě)回到分支隊(duì)列,包括JR和JALR指令的地址,條件分支的分支方向,以及預(yù)測(cè)是否正確。每一個(gè)指令都會(huì)分配一個(gè)brqid,對(duì)于分支指令,指示在分支隊(duì)列的位置,對(duì)于其他指令,標(biāo)識(shí)了該指令前一個(gè)分支指令的位置。當(dāng)分支預(yù)測(cè)錯(cuò)誤時(shí),該分支指令之后的指令都會(huì)被取消。

3.1.3 指令完成

寄存器重命名之后指令都被保存在重定序隊(duì)列,直到指令完成。當(dāng)指令執(zhí)行結(jié)束且寫(xiě)回后,重定序隊(duì)列按照程序順序完成,重定序隊(duì)列一共可以保存32條指令,每周期可接收4條指令。新進(jìn)入的指令處于ROQ_MAPPED狀態(tài),當(dāng)指令結(jié)果寫(xiě)回時(shí)后,對(duì)于分支指令,狀態(tài)更新為ROQ_BRWTBK,其他指令則更新成ROQ_WTBK。對(duì)于分支指令,只有分支結(jié)果確定且對(duì)于預(yù)測(cè)錯(cuò)誤的分支指令沖刷流水線(xiàn)之后才會(huì)更新成ROQ_WTBK。當(dāng)指令到達(dá)重定序隊(duì)列隊(duì)頭且處于ROQ_WTBK時(shí)才可以結(jié)束。每周期可完成4條指令。當(dāng)指令完成時(shí),pdest和odest發(fā)送到寄存器重命名模塊以便更新處理器架構(gòu)狀態(tài)并釋放odest項(xiàng)。對(duì)于產(chǎn)生異常的指令,也會(huì)在指令到達(dá)隊(duì)頭時(shí)處理。

3.1.4 訪(fǎng)存隊(duì)列

GS464有64K的指令緩存和數(shù)據(jù)緩存,都是4路組相聯(lián);64項(xiàng)的TLB,為全相聯(lián)結(jié)構(gòu)。訪(fǎng)存隊(duì)列一共有16項(xiàng),最多可以跟蹤16條存儲(chǔ)加載指令。當(dāng)加載指令進(jìn)入隊(duì)列時(shí),會(huì)檢查所有更老的存儲(chǔ)指令;當(dāng)存儲(chǔ)指令進(jìn)入隊(duì)列時(shí),會(huì)檢查所有更年輕的加載指令。

4. Loongson 3B1000和3B1500

龍芯3B1000由核高基項(xiàng)目課題“高性能多核CPU研發(fā)與應(yīng)用”支持,采用意法半導(dǎo)體65納米工藝設(shè)計(jì),主頻1GHz,功耗25W,片內(nèi)集成8個(gè)64位四發(fā)射亂序執(zhí)行龍芯向量處理器核GS464V,4MB的二級(jí)緩存,每個(gè)核包含兩個(gè)256位向量部件,峰值浮點(diǎn)性能達(dá)到128GFLOPS。龍芯3B1000的最大特色是龍芯向量處理器核的設(shè)計(jì),該處理器核將GS464核的的浮點(diǎn)部件和浮點(diǎn)寄存器堆替換為2個(gè)256位的向量處理部件和1個(gè)128x256位的向量寄存器堆,使龍芯3B在1GHz下的峰值雙精度浮點(diǎn)計(jì)算能力達(dá)到128GFlops。在龍芯3B1000處理器中,實(shí)現(xiàn)了300多條專(zhuān)用的向量處理指令。龍芯3B1000芯片面積 $300mm^2$ , 晶體管數(shù)目接近6億。

龍芯3B1500集成了8個(gè)四發(fā)射亂序執(zhí)行的64位GS464V處理器核,9級(jí)流水線(xiàn),每個(gè)處理器核有64KB的私有一級(jí)指令緩存和64KB的私有一級(jí)數(shù)據(jù)緩存,128KB私有二級(jí)緩存,有8MB三級(jí)共享緩存,采用中芯國(guó)際32納米工藝生產(chǎn),芯片面積 $180mm^2$ , 晶體管數(shù)11億,主頻1.5GHz,單芯片雙精度浮點(diǎn)計(jì)算能力達(dá)到192GFlops,功耗30w(典型)/60w(向量)。 有2個(gè)HT2.0,PCI、LPC、SPI、UART、GPIO,72位DDR2/3控制器。龍芯3B1500由2個(gè)處理器節(jié)點(diǎn)組成,每個(gè)處理器節(jié)點(diǎn)有4個(gè)GS464V處理器核,兩個(gè)處理器節(jié)點(diǎn)之間通過(guò)交叉開(kāi)關(guān)互聯(lián)。下圖展示了龍芯3B1500?整體架構(gòu)圖:

下圖展示了龍芯3B1500物理版圖:

4.1 GS464V微架構(gòu)

GS464V在32nm工藝下面積為 $6.6mm^2$ ,有兩個(gè)256比特的向量算術(shù)單元,每一個(gè)可以執(zhí)行4個(gè)雙精度的乘加運(yùn)算;對(duì)外是一個(gè)128比特的AXI接口。下圖展示了GS464V的物理規(guī)劃圖:

下圖展示了GS464V的微架構(gòu),和GS464的區(qū)別就是浮點(diǎn)單元換成了向量單元,其他流水線(xiàn)都是一樣的。

4.2 存儲(chǔ)層次

龍芯3B1500?每個(gè)GS464V處理器核內(nèi)有4路組相聯(lián)64KB的指令緩存,4路組相聯(lián)64KB的數(shù)據(jù)緩存,以及4路組相聯(lián)作為victim緩存的128K的L2緩存;8個(gè)GS464V處理器核共享8MB的L3緩存。

下圖展示了各級(jí)存儲(chǔ)測(cè)試的延遲:

5. Loongson 3A2000

龍芯3A2000處理器集成了4個(gè)四發(fā)射亂序執(zhí)行64位GS464E處理器核,也是首款采用GS464E微結(jié)構(gòu)的處理器。 采用中芯國(guó)際40納米CMOS工藝生產(chǎn),主頻800~1000MHz

GS464E處理器核是GS464的改進(jìn)版,集成了64KB一級(jí)指令緩存,64KB一級(jí)數(shù)據(jù)緩存,256KB二級(jí)緩存和4MB三級(jí)緩存。流水線(xiàn)從GS464的9級(jí)提高到了12級(jí)。峰值浮點(diǎn)性能16GFlops。在接口上,龍芯3A200集成了兩個(gè)HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,72位DDR2/3-1333×2控制器。

5.1 GS464E微架構(gòu)

通過(guò)調(diào)研IBM POWER7等處理器,GS464E相比于之前的?GS464?架構(gòu), 重點(diǎn)強(qiáng)化了訪(fǎng)存性能和分支預(yù)測(cè)準(zhǔn)確率, 實(shí)現(xiàn)了 MIPS DSP 指 令集和虛擬機(jī)支持, 增大了處理器中各項(xiàng)隊(duì)列的項(xiàng)數(shù), 并增大了緩存容量和 TLB 容量。訪(fǎng)存子系統(tǒng)擁有 3 級(jí)緩存結(jié)構(gòu), 每一級(jí)都采用 LRU 替換策略, 可以支持多核緩存一致性協(xié)議。下圖展示了GS464E的物理規(guī)劃圖,主要由取指單元,寄存器重命名單元,定點(diǎn)單元,浮點(diǎn)單元,訪(fǎng)存單元,L2緩存等組成。

與GS464相比,GS464E?處理器核主要更新:?取指單元?取指單元的功能是通過(guò)分支預(yù)測(cè)持續(xù)獲得指令流, 并進(jìn)行指令譯碼. 在?GS464E?處理器核中, 通過(guò)重新設(shè)計(jì), 消除了分支指令預(yù)測(cè)跳轉(zhuǎn)后的取指空泡; 通過(guò)加入循環(huán)緩沖器 (loop buffer), 使得最多 56 條指令組成的循環(huán)程序執(zhí)行時(shí)不需訪(fǎng)問(wèn)指令緩存?寄存器重命名?寄存器重命名部件的功能是進(jìn)行各種寄存器的重命名, 用于動(dòng)態(tài)流水線(xiàn)中的亂序發(fā)射。GS464E?處理器核中的寄存器重命名表擴(kuò)展到 128 項(xiàng)定點(diǎn)物理寄存器和 128 項(xiàng)浮點(diǎn)物理寄存器, 此外, DSP 控制寄存器、HILO 寄存器以及浮點(diǎn)比較結(jié)果寄存器都單獨(dú)進(jìn)行重命名?指令重定序?指令重定序單元的功能是將亂序發(fā)射的指令進(jìn)行重定序, 并進(jìn)行分支預(yù)測(cè)錯(cuò)與指令異常的處理. 指令重定序隊(duì)列 (reorder queue, ROQ) 從 64 項(xiàng)增大到 128 項(xiàng); 分支指令隊(duì)列從 8 項(xiàng) 擴(kuò)大到 24 項(xiàng)?定點(diǎn)單元?定點(diǎn)單元用于進(jìn)行定點(diǎn)計(jì)算. 在?GS464E?處理器核中, 通過(guò)激進(jìn)的計(jì)算結(jié)果提前反饋 (forward) 邏輯設(shè)計(jì), 存在寄存器數(shù)據(jù)相關(guān)的 2 條定點(diǎn)指令之間的延遲 (load-to-use) 從 2 個(gè)時(shí)鐘周期減少到了 1 個(gè); 此外還加入了數(shù)字信號(hào)處理 (digital signal processing, DSP) 功能單元?浮點(diǎn)單元?浮點(diǎn)單元用于進(jìn)行浮點(diǎn)計(jì)算. 浮點(diǎn)比較結(jié)果寄存器現(xiàn)在可以單獨(dú)進(jìn)行重命名, 因此浮點(diǎn)比較以及使用浮點(diǎn)比較結(jié)果的指令可以亂序發(fā)射和動(dòng)態(tài)流水?訪(fǎng)存單元?訪(fǎng)存部件用于處理訪(fǎng)存指令. 訪(fǎng)存指令專(zhuān)用發(fā)射隊(duì)列大小為 32 項(xiàng), 可以將訪(fǎng)存指令亂序發(fā)射到 2 個(gè)訪(fǎng)存功能部件, 每個(gè)功能部件均可執(zhí)行讀取 (load) 或存儲(chǔ) (store) 指令; 訪(fǎng)存重定序隊(duì)列的項(xiàng)數(shù)從 24 項(xiàng)提升至 64 項(xiàng). 一級(jí)數(shù)據(jù)緩存采用了 LRU 替換策略, 并將 緩存行大小擴(kuò)展為 64 字節(jié)長(zhǎng). 地址翻譯快速查找表 (translation lookaside buffer, TLB) 的項(xiàng)數(shù)也有大幅擴(kuò)充, 采用了 64 項(xiàng)可變大小頁(yè)外加 1024 項(xiàng)固定大小頁(yè)的雙重 TLB 設(shè)計(jì)?緩存失效隊(duì)列?緩存失效隊(duì)列由指令緩存失效請(qǐng)求與數(shù)據(jù)緩存失效請(qǐng)求所共用, 用于處理緩存失效并重填緩存行. 在?GS464E?處理器核中, 其項(xiàng)數(shù)從 8 項(xiàng)提升至 16 項(xiàng), 并實(shí)現(xiàn)了激進(jìn)的指令和數(shù)據(jù)預(yù)取引擎, 該預(yù)取引擎會(huì)根據(jù)緩存失效隊(duì)列中的信息自動(dòng)生成預(yù)取請(qǐng)求, 并通過(guò)緩存失效隊(duì)列來(lái)處理這些預(yù)取請(qǐng)求. 該預(yù)取機(jī)制不會(huì)導(dǎo)致一級(jí)緩存污染?Victim Cache?Victim Cache 是片內(nèi)的第二級(jí)緩存, 當(dāng)一級(jí)緩存失效時(shí)被查詢(xún). 在?GS464E?處理器核中, 其總?cè)萘繑U(kuò)大為 256 KB, 相聯(lián)結(jié)構(gòu)從 8 路組相聯(lián)改為 16 路組相聯(lián), 并采用了 LRU 替換策略, 提高了 Victim Cache 的命中率

下圖展示了GS464E的微架構(gòu):

5.1.1 取指單元

GS464E的取值單元主要包括L1指令緩存,指令TLB,分支預(yù)測(cè)器,指令隊(duì)列和譯碼單元。下圖展示了GS464E的取值單元的流水線(xiàn):

每個(gè)?GS464E?處理器核包含 1 個(gè)4 路組相聯(lián) 64 KB 的指令緩存, 其緩存行大小為 64 字節(jié), 指令緩存的標(biāo)簽和數(shù)據(jù)部分同時(shí)訪(fǎng)問(wèn)并在下一時(shí)鐘周期進(jìn)行命中的判斷與選擇。其中數(shù)據(jù)部分劃分為 8 個(gè)bank,每次取指令時(shí)只用讀取所需要的bank, 降低了緩存訪(fǎng)問(wèn)時(shí)的動(dòng)態(tài)功耗。指令緩存使用虛地址索引和實(shí)地址標(biāo)識(shí)的索引方案。取指部件的虛實(shí)地址轉(zhuǎn)換通過(guò) 64 項(xiàng)全相聯(lián)結(jié)構(gòu)的指令 TLB 完成, 指令 TLB 中的內(nèi)容是頁(yè)表的子集。其中, 每項(xiàng)存放 1 個(gè)頁(yè)表項(xiàng), 每個(gè)頁(yè)表項(xiàng)均可支持 4 KB-1 GB 之間不同大小的頁(yè)。當(dāng)指令緩存命中時(shí), 取指部件每個(gè)時(shí)鐘周期最多可以從指令緩存中取出 8 條指令, 并送往下 一個(gè)流水級(jí)進(jìn)行分支預(yù)測(cè). 而當(dāng)指令緩存未命中時(shí), 取指部件將生成請(qǐng)求并訪(fǎng)問(wèn)緩存失效隊(duì)列, 訪(fǎng)存失效隊(duì)列負(fù)責(zé)進(jìn)行緩存缺失處理, 并將結(jié)果返回給指令緩存。從緩存失效隊(duì)返回的結(jié)果將整體填回指令緩存, 指令緩存最多可容忍 3 個(gè)緩存行不命中, 即有 3 個(gè)未完成 (outstanding) 的緩存行不命中時(shí), 依舊可以從正確的地址取指令。當(dāng)取指請(qǐng)求恰好落在從緩存失效隊(duì)列返回的緩存請(qǐng)求數(shù)據(jù)上時(shí), 可以直接取出相應(yīng)指令進(jìn)入下一個(gè)流水級(jí)。此 外, 指令緩存的預(yù)取由緩存失效隊(duì)列中的硬件預(yù)取引擎統(tǒng)一完成, 不在取指部件中單獨(dú)進(jìn)行。指令緩存的數(shù)據(jù)部分中還包含預(yù)譯碼信息, 每條指令的預(yù)譯碼信息為 8比特大小, 主要用于指令切分、分支類(lèi)型判定和部分指令例外的判定。預(yù)譯碼信息通過(guò)在緩存失效隊(duì)列重填指令緩存時(shí)計(jì)算得出, 并存儲(chǔ)在指令緩存中。

GS464E?處理器核采用了多種不同的機(jī)制來(lái)預(yù)測(cè)分支指令的跳轉(zhuǎn)方向和跳轉(zhuǎn)目標(biāo), 并通過(guò)分支目標(biāo)緩沖器 (BrBTB) 來(lái)處理分支指令之后取指空泡的情況。分支預(yù)測(cè)機(jī)制在每個(gè)時(shí)鐘周期最多可以處理 4 條分支指令, 但只有最后一條可以是預(yù)測(cè)為跳轉(zhuǎn)的分支指令, 預(yù)測(cè)為跳轉(zhuǎn)的分支指令的后續(xù)指令將在下一個(gè)時(shí)鐘周期進(jìn)行處理。GS464E?處理器核采用 3 個(gè)時(shí)鐘周期延遲的 “取指 — 分支” 循環(huán)迭代設(shè)計(jì),?第 1 個(gè)時(shí)鐘周期 根據(jù)程序計(jì)數(shù)器 (program counter, PC) 的值訪(fǎng)問(wèn)指令緩存?第 2 個(gè)時(shí)鐘周期 指令緩存查詢(xún)完畢, 取出最多 8 條指令 * 第 3 個(gè)時(shí)鐘周期 逐條解析指令, 預(yù)測(cè)分支指令的跳轉(zhuǎn)方向和跳轉(zhuǎn)目標(biāo), 如果取出的多條指令中存在預(yù)測(cè)為跳轉(zhuǎn)的分支指令, 則需要根據(jù)此類(lèi)指令中最早的那條來(lái)更新 PC 值

由于取出指令并預(yù)測(cè)出后續(xù)指令 PC 需要花費(fèi) 3 個(gè)時(shí)鐘周期, 其中有 2 個(gè)時(shí)鐘周期無(wú)法確保能取出有意義的指令, 為避免性能損失,?GS464E?處理器核實(shí)現(xiàn)了分支目標(biāo)緩沖器 (BrBTB), 直接根據(jù)取指所使用的 PC 值預(yù)測(cè)后續(xù)指令的 PC 值。如果取出的指令中沒(méi)有預(yù)測(cè)為跳轉(zhuǎn)的分支指令, BrBTB 也沒(méi)有預(yù)測(cè)出需要跳變的 PC 值, 則取指部件從當(dāng)前 PC 向后順序取指令。BrBTB 為 128 項(xiàng)全相聯(lián)結(jié) 構(gòu), 使用當(dāng)前時(shí)鐘周期的 PC 值來(lái)索引下個(gè)時(shí)鐘周期的預(yù)測(cè) PC, 在其預(yù)測(cè)正確的情況下, 即使有需要跳轉(zhuǎn)的分支指令, 取指流水線(xiàn)也不會(huì)斷流。BrBTB 的功能是根據(jù)當(dāng)前 PC 來(lái)預(yù)測(cè)下一個(gè)時(shí)鐘周期的取指 PC, 用于消除分支指令之后的取指空泡, 但是分支預(yù)測(cè)工作還是需要解析不同的指令來(lái)進(jìn)行不同處理的。

分支指令跳轉(zhuǎn)方向的預(yù)測(cè)使用一套組合分支歷史表 (BHTs), 包括 1 個(gè) 16384 項(xiàng)的全局分支歷史表 (global branch history table, GBHT), 1 個(gè) 16384 項(xiàng)的局部分支歷史表 (local branch history table, LBHT) 和 1 個(gè) 16384 項(xiàng)的全局選擇歷史表 (global branch select table, GSEL)。每個(gè)時(shí)鐘周期取出的最多 8 條指令可以同時(shí)查找這套分支歷史表,上述 3 個(gè)分支歷史表中的每項(xiàng)都是 2 bit 飽和計(jì)數(shù)器, 其最高比特位在 GBHT 和 LBHT 中用于指明跳轉(zhuǎn)方向, 而在 GSEL 中則用于決定選用 GBHT 還是 LBHT 的預(yù)測(cè)方向。

間接跳轉(zhuǎn)指令的跳轉(zhuǎn)目標(biāo)預(yù)測(cè)分為兩種情況:?函數(shù)返回跳轉(zhuǎn)指令 (MIPS 指令集中的 JR r31 指令) 采用 16 項(xiàng)的返回地址棧 (return address stack, RAS) 進(jìn)行預(yù)測(cè)。當(dāng)分支預(yù)測(cè)階段發(fā)現(xiàn)函數(shù)調(diào)用跳轉(zhuǎn)指令時(shí), 將該指令延遲槽之后指令的 PC 值壓入 (push) 至 RAS 中。當(dāng)分支預(yù)測(cè)階段發(fā)現(xiàn)函數(shù)返回跳轉(zhuǎn)指令時(shí), 則彈出 (pop) RAS 棧頂所存放的 PC 值作為跳轉(zhuǎn)目標(biāo)的預(yù)測(cè)值。為了防止在錯(cuò)誤推測(cè)路徑上執(zhí)行對(duì) RAS 棧頂指令或棧頂內(nèi)容的錯(cuò)誤修改, RAS 的棧頂指針和當(dāng)前棧頂?shù)?PC 值都有其臨 時(shí)備份, 用于自糾正?除上述函數(shù)返回跳轉(zhuǎn)指令之外的的間接跳轉(zhuǎn)指令使用項(xiàng)數(shù)為 1024 的跳轉(zhuǎn)目標(biāo)緩存器 (jump branch target address cache, JBTAC) 進(jìn)行預(yù)測(cè), 該緩存器使用取指 PC 及跳轉(zhuǎn)歷史信息進(jìn)行索引。

當(dāng)指令被取出后, 會(huì)根據(jù)預(yù)譯碼信息的指示, 按照不同的指令類(lèi)型, 分別使用上述 3 種機(jī)制中的某 一種機(jī)制進(jìn)行分支預(yù)測(cè). 經(jīng)過(guò)分支預(yù)測(cè)階段后, 指令被存入大小為 64 項(xiàng)的指令隊(duì)列中. 在?GS464E?處 理器核中, 基于該指令隊(duì)列的資源還實(shí)現(xiàn)了循環(huán)緩沖器 (loop buffer). 循環(huán)緩沖器會(huì)監(jiān)測(cè)進(jìn)入指令隊(duì)列的指令流 PC 特征, 當(dāng)發(fā)現(xiàn)指令流中包含一個(gè)不大于 56 條指令的單層循環(huán)時(shí), 將停止從指令緩存取指, 而是直接從指令隊(duì)列中取出指令送到譯碼階段. 當(dāng)循環(huán)次數(shù)達(dá)到并退出循環(huán)時(shí), 循環(huán)緩沖器會(huì)被清空.

譯碼功能部件在每個(gè)時(shí)鐘周期會(huì)從指令隊(duì)列頭部取出 4 條指令進(jìn)行譯碼。譯碼過(guò)程的行為較簡(jiǎn)單, 就是將指令碼翻譯為方便功能部件處理的內(nèi)部碼, 標(biāo)識(shí)出指令類(lèi)型、所需要操作的寄存器號(hào)以及指令碼中可能包含的立即數(shù), 用于接下來(lái)的寄存器重命名階段。

5.1.2 指令分配與提交單元

指令分配與提交單元負(fù)責(zé)指令在處理器核中的分配與定序, 具體包括寄存器重命名,指令分配,指令發(fā)射,指令重定序,指令提交及分支與異常處理這幾個(gè)功能。

譯碼后的指令首先進(jìn)行寄存器重命名, 隨后根據(jù)操作類(lèi)型分配至不同的發(fā)射隊(duì)列中。寄存器重命名是動(dòng)態(tài)流水線(xiàn)中進(jìn)行亂序發(fā)射的關(guān)鍵技術(shù), 將為指令中指定的邏輯寄存器各自分配一個(gè)物理寄存器。在?GS464E?處理器核中, 需要進(jìn)行重命名的寄存器有: 通用定點(diǎn)寄存器、通用浮點(diǎn)寄存器、HILO 寄存器、DSP 控制寄存器、浮點(diǎn)比較結(jié)果寄存器。這些需要重命名的寄存器各自進(jìn)行映射, 通過(guò)物理寄存器映射表 (physical register map table, PRMT) 來(lái)保存物理寄存器和邏輯寄存器之間的關(guān)系. 用于通用定點(diǎn)寄存器重命名的為 128 項(xiàng) 64位寬的寄存器堆, 用于通用浮點(diǎn)寄存器重命名的為 128 項(xiàng) 64位寬的寄存器堆, 用于 HILO 寄存器重命名的為 16 項(xiàng) 128位寬的寄存器堆, 用于 DSP 控制寄存器 重命名的為 32 項(xiàng) 32位寬的寄存器堆, 用于浮點(diǎn)比較結(jié)果寄存器重命名的為 32 項(xiàng) 32位寬的寄存 器堆。

GS464E?處理器核中有 3 個(gè)獨(dú)立的發(fā)射隊(duì)列:?16 項(xiàng)的定點(diǎn)發(fā)射隊(duì)列,定點(diǎn)發(fā)射隊(duì)列負(fù)責(zé)源操作數(shù)和目標(biāo)操作數(shù)均為通用定點(diǎn)寄存器、HILO 寄存器或 DSP 控制寄存器的運(yùn)算指令和分支指令?24 項(xiàng)的浮點(diǎn)發(fā)射隊(duì)列,浮點(diǎn)發(fā)射隊(duì)列負(fù)責(zé)源操作數(shù)和目標(biāo)操作數(shù)均為通用浮點(diǎn)寄存器或浮點(diǎn)比較結(jié)果寄存器的運(yùn)算指令和分支指令 * 32 項(xiàng)的訪(fǎng)存發(fā)射隊(duì)列,訪(fǎng)存發(fā)射隊(duì)列除了負(fù)責(zé)所有定點(diǎn),浮點(diǎn)的訪(fǎng)存操作指令外, 還包括控制寄存器操作指令 (CP0 指令) 以及在定點(diǎn)與浮點(diǎn)寄存器間交互數(shù)據(jù)的指令 從控制功耗的角度出發(fā), 3 個(gè)發(fā)射隊(duì)列均采用移動(dòng)指針而非移動(dòng)隊(duì)列中存儲(chǔ)內(nèi)容的管理策略, 每 個(gè)時(shí)鐘周期需要計(jì)算當(dāng)前應(yīng)當(dāng)發(fā)射指令的指針。只有源寄存器都已經(jīng)就緒的指令才能被發(fā)射, 而指令在寄存器重命名階段時(shí)就會(huì)先檢查其源寄存器是否已經(jīng)就緒。若其源操作數(shù)還沒(méi)有準(zhǔn)備好, 則該指令在進(jìn)行指令分配以及在發(fā)射隊(duì)列中的時(shí)候, 都要將自身的源寄存器號(hào)同結(jié)果總線(xiàn)或前饋總線(xiàn)的目標(biāo)寄存器號(hào)相互比較, 以確定本條指令所需的源寄存器是否就緒。此時(shí)所使用的寄存器號(hào)都是經(jīng)過(guò)寄存器重命名后的物理寄存器號(hào)。上述的 3 個(gè)發(fā)射隊(duì)列都采用亂序發(fā)射機(jī)制, 指令的所有源操作數(shù)只要準(zhǔn)備好就可以發(fā)射。當(dāng)存在多個(gè)發(fā)射候選時(shí), 最早進(jìn)入的指令具有最高的優(yōu)先級(jí)。

在?GS464E?處理器核中, 指令被順序譯碼和重命名,亂序發(fā)射和執(zhí)行, 但是要有序提交。重定序隊(duì)列負(fù)責(zé)指令的有序結(jié)束, 它從寄存器重命名模塊獲取程序指令序信息, 并有序地保存流水線(xiàn)中所有已經(jīng)完成寄存器重命名但未提交的指令。指令在功能單元執(zhí)行完畢并寫(xiě)回 (writeback) 后, 重定序隊(duì)列按照程序指令序順序提交這些指令。重定序隊(duì)列最多可同時(shí)容納 128 條指令。重定序隊(duì)列每個(gè)時(shí)鐘周期最多可以提交隊(duì)列頂端的 4 條已經(jīng)處于寫(xiě)回狀態(tài)的指令。指令的提交信息會(huì)送往寄存器重命名模塊, 用于修改重命名的狀態(tài), 同時(shí)還需要通知訪(fǎng)存重定序隊(duì)列, 因?yàn)榇鎯?chǔ)指令需要提交后才能修改存儲(chǔ)器的內(nèi)容。GS464E?處理器核實(shí)現(xiàn)了精確異常, 當(dāng)取指令,譯碼或執(zhí)行時(shí)發(fā)生異常時(shí), 異常信息被送至重定序隊(duì)列保存下來(lái), 只有異常指令成為重定序隊(duì)列頭時(shí), 才進(jìn)行異常報(bào)告與處理。硬件進(jìn)行的異常處理工作包括: 將異常原因、異常指令的 PC 值等信息記錄到有關(guān)的 CP0 寄存器中, 并根據(jù)異常類(lèi)型把異常處理程序的入口地址送到程序計(jì)數(shù)器中。

分支指令在寄存器重命名后進(jìn)入重定序隊(duì)列和發(fā)射隊(duì)列的同時(shí)還會(huì)順序地進(jìn)入分支指令隊(duì)列。GS464E?處理器核中的分支指令隊(duì)列最多可以容納 24 條分支指令, 該隊(duì)列會(huì)記錄分支指令進(jìn)行分支預(yù)測(cè)時(shí)的預(yù)測(cè)結(jié)果。分支指令和其他指令一樣都需要在功能部件執(zhí)行, 但是其結(jié)果總線(xiàn)額外包含分支結(jié)果, 分支結(jié)果會(huì)寫(xiě)回到分支指令隊(duì)列。這些結(jié)果包括 JR 和 JALR 指令的目標(biāo)地址, 以及條件轉(zhuǎn)移指令的轉(zhuǎn)移方向, 利用這些結(jié)果可以判斷這條指令的分支預(yù)測(cè)是否準(zhǔn)確. 不論預(yù)測(cè)成功與否, 分支指令的執(zhí)行結(jié)果都會(huì)反饋到取指部件, 用于修正相關(guān)的分支預(yù)測(cè)器, 以幫助后續(xù)分支指令的預(yù)測(cè)。預(yù)測(cè)錯(cuò)誤的分支指令和在它之后取進(jìn)來(lái)的指令都需要取消。分支指令隊(duì)列負(fù)責(zé)發(fā)送分支錯(cuò)誤取消總線(xiàn), 根據(jù)隊(duì)列中記錄的程序指令序, 準(zhǔn)確地進(jìn)行分支取消操作, 同時(shí)將正確的 PC 值送到程序計(jì)數(shù) 器中。

5.1.3 定點(diǎn)單元和浮點(diǎn)單元

GS464E?處理器核中的定點(diǎn)單元包含 1 個(gè)多端口定點(diǎn)寄存器堆以及 2 個(gè)完全相同的定點(diǎn)運(yùn)算單元。定點(diǎn)寄存器堆共 128 項(xiàng), 一共有 8 個(gè)讀端口和 4 個(gè)寫(xiě)端口。每條定點(diǎn)運(yùn)算流水線(xiàn)中均包含: 用于 執(zhí)行定點(diǎn)加、減、比較、陷阱指令的算術(shù)邏輯單元 (arithmetic logic unit, ALU), 用于執(zhí)行移位、循環(huán) 移位和比特提取與截?cái)嘀噶畹难h(huán)桶形移位器, 位操作單元, 前導(dǎo)零計(jì)數(shù)器, 分支處理單元, 除法部件和乘法器, 每種運(yùn)算單元的數(shù)量均為 1 個(gè)。所有頻繁執(zhí)行的指令均在 1 個(gè)時(shí)鐘周期內(nèi)執(zhí)行完畢, 且通過(guò)激進(jìn)的前饋機(jī)制設(shè)計(jì), 使得存在寄存器相關(guān)的多條指令可以背靠背連續(xù)發(fā)射。乘法器采用全流水設(shè)計(jì), 可進(jìn)行 64x64有符號(hào)或無(wú)符號(hào)乘法運(yùn)算, 運(yùn)算延遲為 3 個(gè)時(shí)鐘周期, 全流水設(shè)計(jì)使得每個(gè)乘法器在每個(gè)時(shí)鐘周期都可接受 1 條新的指令, 并產(chǎn)生 128比特的乘積結(jié)果。

GS464E?處理器核中的浮點(diǎn)部件包含 1 個(gè)多端口浮點(diǎn)寄存器堆以及 2 個(gè)完全相同的浮點(diǎn)運(yùn)算單元。浮點(diǎn)多端口寄存器堆共 128 項(xiàng), 一共有 8 個(gè)讀端口和 4 個(gè)寫(xiě)端口。每條浮點(diǎn)運(yùn)算流水線(xiàn)中均包含: 格式轉(zhuǎn)換單元 (用于執(zhí)行 “定點(diǎn)轉(zhuǎn)為浮點(diǎn)”,“單精度浮點(diǎn)轉(zhuǎn)為雙精度浮點(diǎn)” 這類(lèi)格式轉(zhuǎn)換指令), 浮點(diǎn)比較單元, 浮點(diǎn)除法單元, 浮點(diǎn)開(kāi)方與求倒數(shù)單元, 以及浮點(diǎn)乘加 (fused multiply–add) 單元 (用于執(zhí)行浮點(diǎn)加、減、乘、乘加、乘減指令), 每種運(yùn)算單元的數(shù)量均為 1 個(gè)。其中格式轉(zhuǎn)換單元采用 3 級(jí)全流水設(shè)計(jì), 浮點(diǎn)乘加單元采用 4 級(jí)全流水設(shè)計(jì)。

5.1.4 訪(fǎng)存單元

訪(fǎng)存部件包含以下的子部件: 訪(fǎng)存指令發(fā)射隊(duì)列 mmqueue,訪(fǎng)存專(zhuān)用定點(diǎn)寄存器堆 mr,兩個(gè)訪(fǎng)存地址生成部件 memaddr, 一級(jí)數(shù)據(jù)緩存,一級(jí)數(shù)據(jù) TLB ,兩 個(gè)訪(fǎng)存標(biāo)簽比較部件 dtagcmp、訪(fǎng)存重定序隊(duì)列 cp0queue, 以及二級(jí) TLB 部件 sec tlb。只有一份的子部件由兩條訪(fǎng)存流水線(xiàn)共享使用。下圖展示了訪(fǎng)存單元流水線(xiàn):

訪(fǎng)存指令發(fā)射隊(duì)列 mmqueue 接收寄存器重命名部件送來(lái)的指令信息, 并將當(dāng)前已經(jīng)就緒且 程序指令序上最老的訪(fǎng)存指令發(fā)射到訪(fǎng)存流水線(xiàn)上。大部分訪(fǎng)存指令都可以在兩個(gè)訪(fǎng)存部件中的任意一個(gè)執(zhí)行, 存儲(chǔ)操作和加載操作一樣, 會(huì)等待地址和數(shù)據(jù)同時(shí)就緒后, 才發(fā)射到流水線(xiàn)中。兩條訪(fǎng)存流水線(xiàn)在擁有 4 個(gè)讀端口的寄存器堆 mr 中讀取所需的操作數(shù); 一些特殊指令需要發(fā)送額外請(qǐng)求去定點(diǎn)部件或浮點(diǎn)部件, 以獲取所需的源數(shù)據(jù), 例如, 浮點(diǎn)存儲(chǔ)指令 SDC1 所需要存儲(chǔ)的數(shù)據(jù)只存放在浮點(diǎn)寄存器堆中。所有類(lèi)型的訪(fǎng)存指令的地址肯定會(huì)存放在 mr 中, 不需要從定點(diǎn)部件或浮點(diǎn)部件取。兩條訪(fǎng)存流水線(xiàn)分別擁有一個(gè)地址計(jì)算模塊 memaddr,地址計(jì)算模塊根據(jù)訪(fǎng)存指令的類(lèi)型, 利用 mr 讀出的寄存器內(nèi)容計(jì)算訪(fǎng)存指令的虛擬地址 (effective address, EA 或虛地址)。虛地址低位送到數(shù)據(jù)緩存模塊進(jìn)行索引查找, 整個(gè)虛地址送到 DTLB 模塊進(jìn)行虛實(shí)地址翻譯。 一級(jí)數(shù)據(jù)緩存是由 4 路組相聯(lián)、每一路 16 KB 大小的雙端口隨機(jī)存儲(chǔ)器 (random access memory, RAM) 構(gòu)成的, 兩個(gè)端口分別對(duì)應(yīng)一條訪(fǎng)存流水線(xiàn)。每個(gè)端口根據(jù)地址的低位讀取 RAM 中存放的標(biāo)簽和數(shù)據(jù), 并將讀出的結(jié)果送至 dtagcmp 部件準(zhǔn)備進(jìn)行標(biāo)簽比較。同時(shí), 存儲(chǔ)指令需要存儲(chǔ)的數(shù)據(jù)在此單元計(jì)算, 同樣也送到 dtagcmp 部件。一級(jí)數(shù)據(jù) TLB 與一級(jí)數(shù)據(jù)緩存同時(shí)被查詢(xún)。一級(jí)數(shù)據(jù) TLB 部件使用 2 個(gè) 64比特虛地址作為輸入, 查詢(xún)雙端口的全相聯(lián)組織的 DTLB, 得到 2 條訪(fǎng)存指令的虛地址所對(duì)應(yīng)的 48比特物理地址 (physical address, PA 或?qū)嵉刂?, 并送至 dtagcmp 模塊準(zhǔn)備進(jìn)行標(biāo)簽比較。此外, 大部分 CP0 相關(guān)的特權(quán)指令, 如 MTC0 及 MFC0 都是在 DTLB 模塊執(zhí)行的。兩個(gè)實(shí)地址比較模塊 dtagcmp 模塊分別對(duì)應(yīng)一條訪(fǎng)存流水線(xiàn)。這個(gè)模塊將數(shù)據(jù)緩存模塊讀出的 4 路標(biāo)簽與 DTLB 模塊得到的實(shí)地址進(jìn)行比較, 確定一級(jí)數(shù)據(jù)緩存是否命中, 以及命中在哪一路。命中路的數(shù)據(jù)會(huì)被取出, 和數(shù)據(jù)送來(lái)的 存儲(chǔ)指令所要存儲(chǔ)的數(shù)據(jù)一起計(jì)算, 得到訪(fǎng)存指令的執(zhí)行結(jié)果, 并送到訪(fǎng)存重定序隊(duì)列 cp0queue。訪(fǎng)存重定序隊(duì)列 cp0queue 接收程序指令序信息, 接收 dtagcmp 模塊送來(lái)的指令地址與數(shù)據(jù)信 息, 并通過(guò)回滾機(jī)制來(lái)維護(hù)亂序發(fā)射的訪(fǎng)存指令之間的正確執(zhí)行序。Cp0queue 除了訪(fǎng)存指令重定序工作之外, 在每個(gè)時(shí)鐘周期還需要寫(xiě)回最多 2 條可寫(xiě)回的 加載指令和 最多 2 條可寫(xiě)回的存儲(chǔ)指令,將最多 1 條訪(fǎng)存失效的指令送往緩存失效隊(duì)列,將最多 2 條已經(jīng)提交 且被允許寫(xiě)一級(jí)數(shù)據(jù)緩存的存儲(chǔ)指令發(fā)送到一級(jí)數(shù)據(jù)緩存的寫(xiě)端口。Cp0queue 可以被視作訪(fǎng)存指令的歸宿, 所有訪(fǎng)存指令都在這里進(jìn)行緩存失效處理和寫(xiě)回。目標(biāo)寄存器為定點(diǎn)寄存器的加載類(lèi)型訪(fǎng)存指令在從數(shù)據(jù)緩存流水級(jí)到 dtagcmp 流水級(jí)傳遞時(shí), 會(huì)進(jìn)行猜測(cè)提前反饋操作, 稱(chēng)為 specfwd。在從 dtagcmp 流水級(jí)到 cp0queue 傳遞時(shí), 會(huì)重新發(fā)送上一 個(gè)時(shí)鐘周期的 specfwd 信息, 形成 fwdbus 總線(xiàn)。兩條訪(fǎng)存總線(xiàn)的最多 4 條用于提前反饋的信息會(huì)被 送至定點(diǎn)發(fā)射隊(duì)列和訪(fǎng)存發(fā)射隊(duì)列, 并置猜測(cè)就緒標(biāo)記, 使得指令可以猜測(cè)地發(fā)射。如果猜測(cè)前饋猜測(cè)錯(cuò)誤, 則會(huì)發(fā)送對(duì)應(yīng)該訪(fǎng)存流水線(xiàn)的猜測(cè)取消信號(hào) spec cancel, 猜測(cè)錯(cuò)誤的條件包括: 一級(jí)數(shù)據(jù)緩存未命中,或者一級(jí) DTLB 未命中,或者該指令在 cp0queue 被回滾。猜測(cè)取消信號(hào)將會(huì)取消對(duì)應(yīng)的 specfwd 以及 fwdbus 總線(xiàn)帶來(lái)的所有后果, 已經(jīng)猜測(cè)發(fā)射的相應(yīng)指令也會(huì)被取消, 并回到發(fā)射隊(duì)列重新等待發(fā)射機(jī)會(huì)。在上述 前饋機(jī)制的作用下, 可以得知訪(fǎng)存指令在理想情況下的延遲: 訪(fǎng)存指令到定點(diǎn)指令以及訪(fǎng)存指令到訪(fǎng)存指令的 load-to-use 延遲為 4 個(gè)時(shí)鐘周期, 訪(fǎng)存指令到浮點(diǎn)指令的 load-to-use 延遲 為 6 個(gè)時(shí)鐘周期。

訪(fǎng)存重定序機(jī)制是用于維護(hù)亂序發(fā)射的訪(fǎng)存指令之間執(zhí)行順序的機(jī)制。在之前的?GS464?處理器核設(shè)計(jì)中, 訪(fǎng)存重定序采取的是數(shù)據(jù)傳遞機(jī)制, 使用數(shù)據(jù)傳遞機(jī)制進(jìn)行訪(fǎng)存指令重定序的方法為: 當(dāng)一條指令經(jīng)過(guò)發(fā)射路徑到達(dá)重定序隊(duì)列時(shí), 這條指令需要從所有執(zhí)行序在它之前的,與其相關(guān)的存儲(chǔ)指令處獲取對(duì)應(yīng)數(shù)據(jù); 同時(shí), 如果這條指令是存儲(chǔ)指令, 那么這條指令還要將它自己的數(shù)據(jù)傳遞給所有的已經(jīng)在重定序隊(duì)列中與其相關(guān)的且執(zhí)行序在它后面的指令。簡(jiǎn)單說(shuō)來(lái), 該機(jī)制可以描述成 “取前給后”。在物理設(shè)計(jì)上, 實(shí)現(xiàn)這樣的數(shù)據(jù)傳遞機(jī)制代價(jià)很大: 該指令可能從多條指令處取得數(shù)據(jù), 可能從任意指令處拿取任意字節(jié)的數(shù)據(jù); 存儲(chǔ)指令可能把自己的數(shù)據(jù)傳遞給多條指令, 可能將數(shù)據(jù)傳遞給任意指令的任意字節(jié)位置。這個(gè)機(jī)制的物理設(shè)計(jì)過(guò)于復(fù)雜, 嚴(yán)重限制了隊(duì)列的規(guī)模, 致使?GS464?處理器核中的訪(fǎng)存重定序隊(duì)列只有 24 項(xiàng)大小。 在?GS464E?處理器核中實(shí)現(xiàn)了 2 個(gè)訪(fǎng)存功能單元, 同一時(shí)刻可能有 2 條指令進(jìn)入訪(fǎng)存重定序隊(duì)列, 數(shù)據(jù)傳遞機(jī)制的實(shí)現(xiàn)代價(jià)更是難以接受。為了提高指令并行度,將訪(fǎng)存重定序隊(duì)列項(xiàng)數(shù)增大, 在?GS464E?處理器核中, 只保留了指令是否相關(guān)的判斷, 取消了數(shù)據(jù)傳遞的功能, 通過(guò)指令回滾到發(fā)射隊(duì)列重新發(fā)射的機(jī)制來(lái)保證執(zhí)行的正確性。其具體操作方式如下所述: 當(dāng)一條指令經(jīng)過(guò)發(fā)射路徑到達(dá)重定序隊(duì)列時(shí), 發(fā)現(xiàn)隊(duì)列中有執(zhí)行序在它之前的與其相關(guān)的存儲(chǔ)指令, 那么該指令回滾到訪(fǎng)存發(fā)射隊(duì)列 mmqueue, 并等待該存儲(chǔ)指令寫(xiě)入一級(jí)數(shù)據(jù) 緩存后再次發(fā)射; 如果一條存儲(chǔ)指令經(jīng)過(guò)發(fā)射路徑到達(dá)重定序隊(duì)列時(shí), 發(fā)現(xiàn)隊(duì)列中已有執(zhí)行序在它之后的與其相關(guān)的指令, 那么將這些指令回滾到 mmqueue, 讓這些指令重新發(fā)射。其中, 指令相關(guān)的判斷會(huì)根據(jù)指令的操作類(lèi)型,訪(fǎng)存地址等信息進(jìn)行精確的判斷, 例如, 對(duì) A 地址的半字存儲(chǔ) SH 操作并不會(huì)使得對(duì) A+2 地址的半字取 LH 操作回滾。簡(jiǎn)單說(shuō)來(lái), 該機(jī)制可以描述為 “等前打后”。通過(guò)采取 “等前打后” 的訪(fǎng)存重定序策略來(lái)代替 “取前給后” 的策略, 略增加了發(fā)射隊(duì)列和訪(fǎng)存重定序隊(duì)列的設(shè)計(jì)復(fù)雜度, 在一些情況下會(huì)帶來(lái)少許性能降低, 但是卻大大降低了物理設(shè)計(jì)的難度, 可以在同樣的設(shè)計(jì)主頻下使用更大的訪(fǎng)存重定序隊(duì)列, 增加訪(fǎng)存指令并行度, 可以更好的容忍訪(fǎng)存延遲。同時(shí), 也為支持更大的訪(fǎng)存寬度, 如 256比特向量訪(fǎng)存指令, 提供了可能性。

GS464E?處理器核中的一級(jí)數(shù)據(jù)緩存采取 4 路組相聯(lián)結(jié)構(gòu), 總大小為 64 KB。其中, 每一路大小為 16 KB, 分為 256 個(gè)緩存行, 每一行為 64 字節(jié)。一級(jí)數(shù)據(jù)緩存使用虛地址索引, 實(shí)地址標(biāo)識(shí), 每一個(gè)緩存行需要 48比特的標(biāo)簽來(lái)存儲(chǔ)實(shí)地址信息, 以及 512比特的數(shù)據(jù)來(lái)存儲(chǔ)數(shù)據(jù), 標(biāo)簽和數(shù)據(jù)部分都使用 ECC 校驗(yàn)碼來(lái)進(jìn)行冗余保護(hù)。一級(jí)數(shù)據(jù)緩存采用 LRU 替換策略, 當(dāng)一個(gè)緩存行被查詢(xún)命中時(shí), 或因緩存失效而被新填入時(shí), 會(huì)被調(diào)整到最難被替換的優(yōu)先級(jí); 如果一個(gè)緩存行因多核一致性導(dǎo)致的外部請(qǐng)求被無(wú)效, 該緩存行會(huì)被調(diào)整至最容易被替換的優(yōu)先級(jí)。一級(jí)數(shù)據(jù)緩存是一個(gè)雙端口的緩存結(jié)構(gòu), 每一個(gè)時(shí)刻最多可以實(shí)現(xiàn) 2 條訪(fǎng)存指令的查詢(xún)操作;同時(shí), 存儲(chǔ)指令從訪(fǎng)存重定序隊(duì)列發(fā)出寫(xiě)緩存操作時(shí), 也通過(guò)這 2 個(gè)端口進(jìn)行寫(xiě)操作, 其優(yōu)先級(jí)低于訪(fǎng)存指令的查詢(xún)操作。除此之外, ECC 校驗(yàn)出錯(cuò)時(shí)的自糾正操作和緩存失效重填請(qǐng)求都需要從第一個(gè)寫(xiě)端口進(jìn)行寫(xiě)入, 寫(xiě)入操作將按照特定優(yōu)先級(jí)進(jìn)行, 并對(duì)低優(yōu)先級(jí)的操作產(chǎn)生阻塞。

虛實(shí)地址翻譯工作在硬件實(shí)現(xiàn)上是由兩級(jí) TLB 來(lái)完成的。一級(jí)數(shù)據(jù) TLB 對(duì)軟件透明, 每次訪(fǎng)存操作執(zhí)行時(shí)被查詢(xún); 軟件可見(jiàn)的是二級(jí) TLB, 軟件修改 TLB 的指令 (如 TLBWR) 會(huì)直接修改二級(jí) TLB。 二級(jí) TLB 對(duì)一級(jí)數(shù)據(jù) TLB 是包含關(guān)系, 一級(jí)數(shù)據(jù) TLB 的缺失會(huì)自動(dòng)從二級(jí) TLB 中查找并取 回, 硬件會(huì)自動(dòng)維護(hù)包含關(guān)系。 此外, 指令 TLB 也是根據(jù)二級(jí) TLB 中的內(nèi)容填入的。 一級(jí)數(shù)據(jù) TLB 的規(guī)模為 32 項(xiàng), 二級(jí) TLB 則是由 2 個(gè)部分組成, 包括 64 項(xiàng)全相聯(lián)的可變頁(yè)大小的地址可尋址存儲(chǔ)器 (content addressable memory, CAM) 部分, 以及 8 路組相聯(lián),每一路 128 項(xiàng), 共計(jì) 1024 項(xiàng)的固定頁(yè)大小的 RAM 部分, 這兩級(jí) TLB 中的每一項(xiàng)都可以裝載 1 個(gè)標(biāo)準(zhǔn) MIPS 雙頁(yè)。一 級(jí)數(shù)據(jù) TLB 是雙端口的, 分別對(duì)應(yīng)于 2 個(gè)訪(fǎng)存功能部件, 一級(jí) TLB 查詢(xún)發(fā)生不命中時(shí), 會(huì)選擇在程序指令序上較老的那條指令來(lái)查詢(xún)只有 1 個(gè)端口的二級(jí) TLB。二級(jí) TLB 查詢(xún)需要花費(fèi) 2 個(gè)時(shí)鐘周期, 如果命中, 那么命中的結(jié)果會(huì)寫(xiě)入一級(jí)數(shù)據(jù) TLB, 其替換策略為隨機(jī)替換; 如果未命中, 其結(jié)果也會(huì)通知訪(fǎng)存重定序隊(duì)列。需要查詢(xún)二級(jí) TLB 的指令經(jīng)過(guò)訪(fǎng)存重定序隊(duì)列中的回滾機(jī)制, 重新回到發(fā)射隊(duì)列, 再次發(fā)射時(shí), 二級(jí) TLB 的查詢(xún)結(jié)果已經(jīng)返回, 因此可以判斷是否真正的發(fā)生了 TLB 失效異常。 二級(jí) TLB 中可變頁(yè)部分 (CAM 部分) 和固定頁(yè)部分 (RAM 部分) 會(huì)被同時(shí)查詢(xún), 但是軟件進(jìn)行 TLB 寫(xiě)入時(shí), 只有其中一個(gè)會(huì)被修改: 如果寫(xiě)入項(xiàng)的頁(yè)大小與提前配置好的固定頁(yè)相同, 則 TLB 指令 會(huì)將 TLB 表項(xiàng)寫(xiě)入固定頁(yè)部分, 否則, 將寫(xiě)入可變頁(yè)部分。 64 項(xiàng)的 CAM 部分和 8 路組相聯(lián)的 RAM 部分都采用隨機(jī)替換策略。

GS464E?處理器核的一級(jí)數(shù)據(jù)緩存是一個(gè)寫(xiě)回 (writeback) 式的緩存, 所有的存儲(chǔ)操作都需要對(duì)一級(jí)數(shù)據(jù)緩存進(jìn)行寫(xiě)入。 當(dāng)存儲(chǔ)指令發(fā)生緩存失效時(shí), 需要將存儲(chǔ)指令所需的緩存行從內(nèi)存搬運(yùn)至一級(jí)數(shù)據(jù)緩存, 再進(jìn)行寫(xiě)入。然而在很多情況下, 存儲(chǔ)指令都傾向于填滿(mǎn)整個(gè)緩存行, 因此這個(gè)搬運(yùn)過(guò)程就顯得多余, 還帶來(lái)了不少的時(shí)間與功耗開(kāi)銷(xiāo)。 為了降低這個(gè)開(kāi)銷(xiāo),?GS464E?處理器核中引入了存儲(chǔ)填充 (store fill) 機(jī)制。該機(jī)制的工作原理為: 當(dāng)存儲(chǔ)指令在一級(jí)數(shù)據(jù)緩存中發(fā)生緩存失效時(shí), 其訪(fǎng)存失效請(qǐng)求會(huì)將待存儲(chǔ)的數(shù)據(jù)一并送至位于緩存失效隊(duì)列中的存儲(chǔ)填充緩沖區(qū), 同時(shí), 該訪(fǎng)存失效請(qǐng)求暫緩訪(fǎng)問(wèn) SCache。如果接下來(lái)的多條存儲(chǔ)請(qǐng)求在該緩沖區(qū)中成功地拼滿(mǎn)了緩存行, 那么只需向 SCache 請(qǐng)求空白的緩存行即可。收到空白行請(qǐng)求的 SCache 不會(huì)訪(fǎng)問(wèn)內(nèi)存, 在進(jìn)行多核一致性處理后直接返回, 緩存失效隊(duì)列負(fù)責(zé)將緩沖區(qū)中拼滿(mǎn)的數(shù)據(jù)重填回一級(jí)數(shù)據(jù)緩存。在存儲(chǔ)填充進(jìn)行期間, 相應(yīng)的存儲(chǔ)指令可以退出流水線(xiàn), 釋放隊(duì)列空間。如果較長(zhǎng)時(shí)間沒(méi)有拼滿(mǎn)一個(gè)緩存行, 或遇到了屬于同一個(gè)緩存行的加載操作, 或遇到內(nèi)存屏障類(lèi)操作 (如 SYNC 或 CACHE 指令), 存儲(chǔ)填充機(jī)制就會(huì)進(jìn)行退出處理, 向 SCache 請(qǐng)求一個(gè)正常的緩存行, 待結(jié)果返回后, 在緩沖區(qū)進(jìn)行數(shù)據(jù)拼湊操作, 將拼湊后的結(jié)果填回一級(jí)數(shù)據(jù)緩存。 硬件會(huì)記錄存儲(chǔ)填充成功與否的近期歷史, 并對(duì)存儲(chǔ)填充機(jī)制進(jìn)行自動(dòng)調(diào)整。?GS464E?處理器核中實(shí)現(xiàn)的存儲(chǔ)填充機(jī)制可以適用于多核處理器的情況, 減少了存儲(chǔ)指令導(dǎo)致的內(nèi)存讀取, 并允許存儲(chǔ)指令提前退出流水線(xiàn), 提升了處理器的整體執(zhí)行性能。

5.1.5 緩存失效隊(duì)列

緩存失效隊(duì)列位于一級(jí)緩存與 SCache 之間, 負(fù)責(zé)對(duì) Victim Cache 進(jìn)行訪(fǎng)問(wèn)和管理, 實(shí)現(xiàn)緩存失效請(qǐng)求的處理和重填工作, 并負(fù)責(zé)硬件預(yù)取請(qǐng)求的生成和處理。 在?GS464E?處理器設(shè)計(jì)中, 對(duì)緩存失效的處理過(guò)程進(jìn)行了多項(xiàng)創(chuàng)新性的改動(dòng), 包括基于緩存失效隊(duì)列的無(wú)污染硬件預(yù)取引擎設(shè)計(jì)以及可以支持多核情況的存儲(chǔ)填充機(jī)制。

緩存失效隊(duì)列共有 16 項(xiàng), 進(jìn)入該隊(duì)列的請(qǐng)求包括訪(fǎng)存重定序隊(duì)列發(fā)來(lái)的訪(fǎng)存失效請(qǐng)求、取指部件發(fā)來(lái)的指令失效請(qǐng)求以及 SCache 發(fā)來(lái)的多核一致性請(qǐng)求, 此外, 硬件預(yù)取引擎會(huì)將生成的數(shù)據(jù)和指令預(yù)取請(qǐng)求也送給緩存失效隊(duì)列, 由該隊(duì)列進(jìn)行處理。所有進(jìn)隊(duì)請(qǐng)求的地址均為實(shí)地址。緩存失效隊(duì)列中的緩存失效請(qǐng)求會(huì)先查詢(xún) Victim Cache, 如果命中, 則會(huì)將結(jié)果重填回一級(jí)緩存, 并將一級(jí)緩存替換出的緩存行填入 Victim Cache 中之前被取出的位置; 如果 Victim Cache 查詢(xún)未命中, 則會(huì)訪(fǎng)問(wèn) SCache, 待 SCache 的結(jié)果返回后, 填入一級(jí)緩存, 將一級(jí)緩存替換出的有效數(shù)據(jù)根據(jù) LRU 算法寫(xiě)入 Victim Cache, 并將 Victim Cache 替換出的有效臟數(shù)據(jù)寫(xiě)回到 SCache。 緩存失效請(qǐng)求總是會(huì)先查詢(xún) Victim Cache, 查詢(xún)未命中時(shí)再查詢(xún) SCache, 這種串行訪(fǎng)問(wèn)的設(shè)計(jì)降低了緩存一致性維護(hù)的復(fù)雜度。緩存失效隊(duì)列中由 SCache 發(fā)來(lái)的多核一致性請(qǐng)求會(huì)對(duì)一級(jí)緩存和 Victim Cache 進(jìn)行查詢(xún), 根據(jù)查詢(xún)結(jié)果和一致性請(qǐng)求的類(lèi)型, 對(duì)緩存行進(jìn)行無(wú)效、寫(xiě)回等操作, 并將結(jié)果返回 SCache。緩存失效隊(duì)列中的硬件預(yù)取請(qǐng)求會(huì)對(duì) SCache 進(jìn)行查詢(xún), 根據(jù)查詢(xún)結(jié)果, 將預(yù)取來(lái)的數(shù)據(jù)暫存在隊(duì)列中。如果有緩存失效請(qǐng)求和硬件預(yù)取請(qǐng)求操作同一個(gè)緩存行, 那么預(yù)取到的數(shù)據(jù)會(huì)發(fā)送給這個(gè)緩存失效請(qǐng)求。緩存失效隊(duì)列會(huì)定期清除掉那些一直沒(méi)有被使用到的預(yù)取數(shù)據(jù)。這樣的預(yù)取處理方式不會(huì)帶來(lái)任何一級(jí)緩存污染。請(qǐng)求同一個(gè)緩存行的緩存失效操作會(huì)在緩存失效隊(duì)列中進(jìn)行合并, 但只限于同屬于數(shù)據(jù)緩存失效或指令緩存失效。緩存失效隊(duì)列還有專(zhuān)門(mén)的緩沖區(qū)用于存儲(chǔ)訪(fǎng)存失效存儲(chǔ)指令的數(shù)據(jù), 以支持存儲(chǔ)填充機(jī)制。

GS464E?處理器核中使用了最多同時(shí)支持 4 個(gè)數(shù)據(jù)訪(fǎng)問(wèn)流和 1 個(gè)指令訪(fǎng)問(wèn)流的流式硬件預(yù)取引擎, 數(shù)據(jù)和指令的預(yù)取相對(duì)獨(dú)立。 其中, 數(shù)據(jù)流式預(yù)取引擎可以支持升序和降序模式, 使用訪(fǎng)存失效請(qǐng)求來(lái)建立和維護(hù)訪(fǎng)問(wèn)流信息; 而指令預(yù)取只能支持升序的預(yù)取, 使用指令失效請(qǐng)求來(lái)建立和維護(hù)流信 息。 當(dāng)失效請(qǐng)求為連續(xù)的 2 個(gè)緩存行時(shí), 將會(huì)建立訪(fǎng)問(wèn)流, 每個(gè)訪(fǎng)問(wèn)流都配有 3比特的倒數(shù)計(jì)數(shù)器, 用于計(jì)算這個(gè)訪(fǎng)問(wèn)流是否已過(guò)期。緩存失效請(qǐng)求如果在某個(gè)訪(fǎng)問(wèn)流上延續(xù), 那么配屬于這個(gè)訪(fǎng)問(wèn)流的計(jì)數(shù)器會(huì)刷新到最大值。訪(fǎng)問(wèn)流建立后, 就可以觸發(fā)預(yù)取, 預(yù)取請(qǐng)求的觸發(fā)包括下列兩種情況. 如果緩存失效請(qǐng)求在緩存失效隊(duì)列中和預(yù)取請(qǐng)求合并, 證明預(yù)取是有益的, 將會(huì)根據(jù)此次失效的地址查詢(xún)預(yù)取引擎中已經(jīng)建立的訪(fǎng)問(wèn)流信息。指令失效請(qǐng)求會(huì)查詢(xún)指令預(yù)取引擎, 而訪(fǎng)存失效請(qǐng)求會(huì)查詢(xún)數(shù)據(jù)預(yù)取引擎。如果訪(fǎng)問(wèn)流查詢(xún)命中, 則根據(jù)訪(fǎng)問(wèn)流的升序或降序信息, 產(chǎn)生 1 個(gè)預(yù)取請(qǐng)求, 預(yù)取請(qǐng)求的地址是失效地址加上特定增量; 如果訪(fǎng)問(wèn)流查詢(xún)不命中, 則尋找計(jì)數(shù)器為零或計(jì)數(shù)器最小的訪(fǎng)問(wèn)流, 將其頂替。如果未能和預(yù)取請(qǐng)求合并的緩存失效請(qǐng)求在 Victim Cache 中查詢(xún)未命中, 則證明需要進(jìn)行預(yù)取, 此時(shí)會(huì)根據(jù)此次失效的地址查詢(xún)預(yù)取引擎中的訪(fǎng)問(wèn)流信息, 如果訪(fǎng)問(wèn)流信息查詢(xún)命中, 則根據(jù)訪(fǎng)問(wèn)流的升序或降序信息, 產(chǎn)生預(yù)取請(qǐng)求, 預(yù)取請(qǐng)求地址是失效地址加上特定增量; 訪(fǎng)問(wèn)流查詢(xún)未命中則不進(jìn)行操作。每次觸發(fā)預(yù)取時(shí), 預(yù)取地址相對(duì)于失效地址的增量會(huì)隨著這個(gè)訪(fǎng)問(wèn)流的歷史觸發(fā)次數(shù)而變化, 被觸發(fā)過(guò)的次數(shù)越多, 其預(yù)取增量越大。這個(gè)增量值的上限則由已建立的訪(fǎng)問(wèn)流的個(gè)數(shù)決定: 當(dāng)只有 1 個(gè)訪(fǎng)問(wèn)流存在時(shí), 增量上限被設(shè)定為 4 個(gè)緩存行大小; 當(dāng)超過(guò) 1 個(gè)訪(fǎng)問(wèn)流時(shí), 該增量被設(shè)定為 2 個(gè)緩存行大小,指令預(yù)取的增量上限一直設(shè)定為 4 個(gè)緩存行。GS464E?處理器核使用增量預(yù)取策略, 相對(duì)于每次觸發(fā)就預(yù)取多條的策略, 在訪(fǎng)問(wèn)流預(yù)測(cè)正確的情況下效果是相同的, 但是訪(fǎng)問(wèn)流預(yù)測(cè)錯(cuò)誤時(shí), 增量預(yù)取策略會(huì)少一些無(wú)效的預(yù)取請(qǐng)求。

緩存

GS464E?處理器核使用了三級(jí)片上緩存結(jié)構(gòu), 其中位于每個(gè)處理器核內(nèi)部的私有緩存包括一級(jí)數(shù)據(jù)緩存和一級(jí)指令緩存, 以及數(shù)據(jù)和指令共用的 Victim Cache, 第三級(jí)緩存為 SCache, 由所有處理器核共享。一級(jí)指令緩存為 4 路組相聯(lián)設(shè)計(jì), 64 KB 容量, 緩存行大小64 字節(jié), 隨機(jī)替換。一級(jí)數(shù)據(jù)緩存采用 LRU 替換策略,4 路組相聯(lián)設(shè)計(jì), 64 KB 容量, 緩存行大小64 字節(jié)。 Victim Cache 與兩個(gè)一級(jí)緩存是exclusive關(guān)系, 處于一級(jí)緩存中的緩存行必定不存在于 Victim Cache 中; Victim Cache 與 SCache 維護(hù)包含 (inclusive) 關(guān)系, 也即處于 Victim Cache 中的緩存行必定在 SCache 中有其對(duì)應(yīng)的備份。一級(jí)緩存和 SCache 是Inclusive關(guān)系。

Victim Cache 為 16 路組相聯(lián), 每一路 16 KB, 共計(jì) 256 KB, 緩存行大小為 64 字節(jié), 使用 LRU 替換策略。Victim Cache 位于一級(jí)緩存之下, 由緩存失效隊(duì)列進(jìn)行管理, 當(dāng)一級(jí)緩存發(fā)生緩存失效時(shí)被查詢(xún)。 查詢(xún) Victim Cache 時(shí), 先讀取標(biāo)簽再讀取命中路的數(shù)據(jù)的方式, 使用少量延遲來(lái)?yè)Q取功耗的降低。 在緩存失效請(qǐng)求查詢(xún) Victim Cache 未命中情況下, 由緩存失效隊(duì)列負(fù)責(zé)向 SCache 發(fā)出失效請(qǐng)求. 當(dāng)一個(gè)緩存行從一級(jí)緩存中替換出來(lái)時(shí), 會(huì)被填入 Victim Cache, 而 Victim Cache 替換出的數(shù)據(jù)將會(huì)寫(xiě)回到 SCache。 指令緩存行與數(shù)據(jù)緩存行都可以存放在 Victim Cache 中, 以緩存行標(biāo)簽域中的一個(gè)額外比特來(lái)做區(qū)分。

SCache 為片上末級(jí)緩存, 由所有處理器核共享, 一個(gè)四核處理器就會(huì)擁有 4 個(gè) SCache 以 供 4 個(gè)處理器核使用。每個(gè) SCache 為 16 路組相聯(lián), 容量為 1 MB, 緩存行大小為 64 字節(jié), 使用 LRU 替換算法。 每個(gè) SCache 使用大小為 16 項(xiàng)的管理隊(duì)列來(lái)查詢(xún)和維護(hù). 相比于一級(jí)緩存和 Victim Cache, 每個(gè) SCache 的緩存行還額外包含 64比特的目錄域, 用于記錄該 緩存行被哪個(gè)處理器核持有, 以及被處理器核持有的是指令行還是數(shù)據(jù)行。在這個(gè)目錄的設(shè)計(jì)規(guī)模下, 最多支持一個(gè)芯片集成 32 個(gè)處理器核. 在區(qū)分?jǐn)?shù)據(jù)行和指令行之外, SCache 并不區(qū)分一級(jí)緩存和 Victim Cache, 因此一級(jí)數(shù)據(jù)緩存持有的緩存行或 Victim Cache 持有的數(shù)據(jù)緩存行都會(huì)被視作該處理器核持有數(shù)據(jù)緩存行。在?GS464E?處理器核配屬的 SCache 中, 加入了基于緩存一致性的硬件抗別名設(shè)計(jì)。當(dāng)程序使用的頁(yè)的大小比一級(jí)緩存中每個(gè)緩存路的容量更小的情況下, 就會(huì)出現(xiàn)別名的情況, 同一個(gè)物理地址會(huì)被放置在一級(jí)緩存中的多個(gè)索引上。為了保證映射到同一個(gè)物理地址的多個(gè)虛地址之間的數(shù)據(jù)是一致的, SCache 在標(biāo)簽域中加入了額外的 2比特的頁(yè)染色域, 利用 SCache 對(duì)片內(nèi)兩級(jí)緩存的包含關(guān)系, 保證這個(gè)緩存行只能存在于滿(mǎn)足當(dāng)前頁(yè)染色域的特定索引位置上。當(dāng)一個(gè)訪(fǎng)存請(qǐng)求要求頁(yè)染色域的另一個(gè)值時(shí), 會(huì)發(fā)生緩存失效, SCache 發(fā)現(xiàn)該請(qǐng)求頁(yè)染色不命中之后, 會(huì)通過(guò)一致性請(qǐng)求, 寫(xiě)回并無(wú)效處于一級(jí)緩存或 Victim Cache 之中的緩存行備份, 修改頁(yè)染色域的值為新值后, 再行返回, 以此保證每個(gè)物理地址只對(duì)應(yīng)一個(gè)實(shí)例?;诰彺嬉恢滦缘挠布箘e名設(shè)計(jì)是?GS464E?處理器核的創(chuàng)新性功能, 在保持一級(jí)緩存大容量的前提下, 實(shí)現(xiàn)了對(duì)較小頁(yè)的高效硬件支持。SCache 中還為使用原子操作指令 (例如, LL/SC 指令) 進(jìn)行多核的同步加入了特殊設(shè)計(jì): 當(dāng)一個(gè) 處理器核使用原子操作指令獲得一個(gè)緩存行時(shí), SCache 在短時(shí)間內(nèi)將禁止把這個(gè)緩存行轉(zhuǎn)讓給其他處理器核。該時(shí)間間隔為隨機(jī)數(shù), 隨機(jī)的范圍可以通過(guò)軟件進(jìn)行配置。通過(guò)上述設(shè)計(jì), 多個(gè)處理器核同時(shí)爭(zhēng)搶同一個(gè)內(nèi)存地址時(shí), 可以在時(shí)間上串行開(kāi)來(lái), 減少了競(jìng)爭(zhēng)。這個(gè)特殊設(shè)計(jì)可以提高多核同步的性能, 并可以防止因每個(gè)處理器核都占有時(shí)間過(guò)短,無(wú)法修改共享數(shù)據(jù)而導(dǎo)致的活鎖現(xiàn)象。在 SCache 中查詢(xún)失效的請(qǐng)求會(huì)向下一級(jí)存儲(chǔ)設(shè)備發(fā)出訪(fǎng)存請(qǐng)求。下一級(jí)存儲(chǔ)設(shè)備包括內(nèi)存, PCI, SPI 或其他外部設(shè)備。

在一級(jí)數(shù)據(jù)緩存命中的加載指令延遲為 4 個(gè)時(shí)鐘周期;在 Victim Cache 命中, 則會(huì)給這條訪(fǎng)存指令帶來(lái)額外 18 個(gè)時(shí)鐘周期的延遲;如果是 Victim Cache 也失效但是在 SCache 中命中的訪(fǎng)存指令, 相比一級(jí)緩存命中的情況要多 50 個(gè)時(shí)鐘周期的延遲, 其中訪(fǎng)問(wèn) SCache 需要的時(shí)間為 11 個(gè)時(shí)鐘周期, 其他延遲包括請(qǐng)求在片內(nèi)傳遞的延遲, 以及為支持處理器核降頻設(shè)計(jì)所需要的異步隊(duì)列所帶來(lái)的延遲。

6 Loongson 3A3000

龍芯 3A3000/3B3000主頻 1.2Hz–1.5GHz,為4核處理器,采用4個(gè)四發(fā)射亂序執(zhí)行的64 位超標(biāo)量處理器核GS464E,支持 MIPS64 指令集,支持龍芯擴(kuò)展指令集,采用12 級(jí)超標(biāo)量流水線(xiàn); 每核有2 個(gè)定點(diǎn)單元、2 個(gè)浮點(diǎn)單元和 2 個(gè)訪(fǎng)存單元。每個(gè)處理器核包含 64KB 私有一級(jí)指令緩存和 64KB 私有一級(jí)數(shù)據(jù)緩存;每個(gè)處理器包含 256KB 私有二級(jí)緩存;所有處理器核共享 8MB 三級(jí)緩存。

龍芯3A2000相比,除了流片工藝從中芯國(guó)際的40納米提升到意法半導(dǎo)體的28納米CMOS 工藝,處理器的三級(jí)緩存也從4MB提高到8MB。峰值浮點(diǎn)性能24GFlops,典型功耗 <40W@1.5GHz。集成的接口有兩個(gè)HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,兩個(gè)72位DDR2/3-1600,支持ECC。

7 Loongson 3A4000

龍芯3A4000采用龍芯最新研發(fā)的GS464V,盡管龍芯3A4000仍然采用28nm工藝, 但主頻提高到2.0GHz, 綜合性能是上一代龍芯3A3000的兩倍。用于片間互連及連接橋片的HT控制器帶寬提高一倍以上,內(nèi)存控制器從DDR3升級(jí)到DDR4,對(duì)虛擬機(jī)支持更加完善,效率達(dá)到95%以上。龍芯3A4000/3B4000也是首次在片內(nèi)集成漏洞防范設(shè)計(jì)、硬件國(guó)密算法、安全可信模塊與安全訪(fǎng)問(wèn)控制機(jī)制的處理器。龍芯3B4000龍芯3A4000的基礎(chǔ)上支持多路互連。

8 Loongson 3A5000

龍芯3A5000采用和龍芯3A4000的處理器同樣的GS464EV, 采用12nm工藝流片, 主頻提升到2.5GHz。龍芯3A5000依然是4核處理器,而龍芯3C5000將是一款16核處理器。龍芯3A5000/3B5000是面向個(gè)人計(jì)算機(jī)、服務(wù)器等信息化領(lǐng)域的通用處理器,基于龍芯自主指令系統(tǒng)LoongArch的LA464微結(jié)構(gòu)的四核處理器,在與龍芯3A4000處理器保持引腳兼容的基礎(chǔ)上,頻率提升至2.5GHz,功耗降低30%以上,性能提升50%以上。龍芯3B5000龍芯3A5000的基礎(chǔ)上在HT0接口上支持一致性互聯(lián)以便支持多路互連。下圖展示了其芯片架構(gòu):

第一級(jí)互聯(lián)采用5x5的交叉開(kāi)關(guān),用于4個(gè)處理器核,4個(gè)共享緩存模塊和一個(gè)IO端口的連接。第二級(jí)互聯(lián)采用5x3的交叉開(kāi)關(guān),連接4個(gè)共享的緩存模塊,兩個(gè)內(nèi)存控制器和一個(gè)IO端口。IO環(huán)總線(xiàn)一共8個(gè)端口,分別連接4個(gè)HT控制器,慢速輸入輸出模塊,安全模塊以及兩級(jí)交叉開(kāi)關(guān)。兩個(gè)HT控制器共用16條HT總線(xiàn),可以作為兩個(gè)8位HT或一個(gè)16位HT使用。

上述互聯(lián)結(jié)構(gòu)都采用讀寫(xiě)分離的數(shù)據(jù)通道,位寬128比特,與處理器同頻;處理器核和第一級(jí)交叉開(kāi)關(guān)讀通道是256比特。

下圖展示了龍芯3A5000的物理規(guī)劃版圖:

8.1 LA464處理器核

LA464是一個(gè)4發(fā)射的超標(biāo)量處理器,有4個(gè)定點(diǎn)單元,2個(gè)256位的向量單元和2個(gè)訪(fǎng)存單元。每個(gè)向量單元支持8個(gè)單精度或4個(gè)雙精度乘加運(yùn)算;訪(fǎng)存單元支持256位存儲(chǔ)訪(fǎng)問(wèn).下圖展示了LA464處理器核的微架構(gòu):

8.1.1 共享緩存

Scache模塊是龍芯3A5000內(nèi)部所有處理器核共享的L3緩存,采用16路組相聯(lián),由緩存管理模塊和緩存訪(fǎng)問(wèn)模塊組成:?緩存管理模塊?負(fù)責(zé)處理來(lái)自處理器和DMA的訪(fǎng)問(wèn)請(qǐng)求?緩存訪(fǎng)問(wèn)模塊?負(fù)責(zé)存放緩存標(biāo)簽,目錄和數(shù)據(jù)

8.1.2 SMP互聯(lián)

通過(guò)HT進(jìn)行互聯(lián)可以組成2路,4路,8路或16路SMP系統(tǒng),整個(gè)系統(tǒng)物理地址寬度為48位,地址高4位用來(lái)識(shí)別單個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)實(shí)際可用地址空間是44位。當(dāng)系統(tǒng)節(jié)點(diǎn)數(shù)目不足16時(shí),需要配置路由設(shè)置寄存器,保證沒(méi)有對(duì)應(yīng)節(jié)點(diǎn)的地址能夠返回響應(yīng)。

9 Loongson 3A6000

龍芯3A6000處理器是龍芯第四代微架構(gòu)的首款產(chǎn)品,集成4個(gè)最新研發(fā)的高性能6發(fā)射64位LA664處理器核。主頻達(dá)到2.5GHz,支持128位向量處理擴(kuò)展指令(LSX)和256位高級(jí)向量處理擴(kuò)展指令(LASX),支持同時(shí)多線(xiàn)程技術(shù)(SMT2),全芯片共8個(gè)邏輯核。龍芯3A6000片內(nèi)集成雙通道DDR4-3200控制器,集成安全可信模塊,可提供安全啟動(dòng)方案和國(guó)密(SM2、SM3、SM4等)應(yīng)用支持。和3A5000相比,主要是更新了處理器內(nèi)核,芯片整體架構(gòu)如下圖所示:

第一級(jí)互連采用 5x5 的交叉開(kāi)關(guān),用于連接四個(gè)處理器核、四個(gè)共享 Cache 模塊、以及一個(gè) IO 端口連接 IO-RING。 第二級(jí)互連采用 5x3 的交叉開(kāi)關(guān),連接 4 個(gè)共享 Cache 模塊,兩個(gè) DDR4 內(nèi)存控制器、 以及一個(gè) IO 端口連接 IO-RING。 IO-RING 包含多個(gè)端口,連接包括 HT 控制器,MISC 模塊,SE 模塊與兩級(jí)交叉開(kāi)關(guān)。HT 控制器內(nèi)集成一個(gè) DMA 控制器,DMA 控制器負(fù)責(zé) IO 的 DMA 控制并負(fù)責(zé)片間一致性的維護(hù)。 上述互連結(jié)構(gòu)都采用讀寫(xiě)分離的數(shù)據(jù)通道,數(shù)據(jù)通道寬度為 128 位,工作在與處理器 核相同的頻率,用以提供高速的片上數(shù)據(jù)傳輸。此外,一級(jí)交叉開(kāi)關(guān)連接 4 個(gè)處理器核與 scache 的讀數(shù)據(jù)通道為 256 位,以提高片內(nèi)處理器核訪(fǎng)問(wèn) scache 的讀帶寬。

SCache 模塊是龍芯 3A6000?處理器內(nèi)部所有處理器核所共享的三級(jí)緩存。SCache 模塊支持16 項(xiàng)緩存訪(fǎng)問(wèn)隊(duì)列,采用 16 路組相聯(lián)結(jié)構(gòu),支持 ECC 校驗(yàn)。 共 享緩存模 塊包括共享 緩存管理模塊scachemanage 及共享緩存訪(fǎng)問(wèn)模塊scacheaccess。Scachemanage 模塊負(fù)責(zé)處理器來(lái)自處理器和 DMA 的訪(fǎng)問(wèn)請(qǐng)求,而共享緩存的標(biāo)簽、目錄和數(shù)據(jù)等信息存放在 scacheaccess 模塊中。為降低功耗,共享緩存的標(biāo)簽、 目錄和數(shù)據(jù)可以分開(kāi)訪(fǎng)問(wèn),共享 緩存狀態(tài)位、w 位與標(biāo)簽一起存儲(chǔ),標(biāo)簽存放在 TAG RAM 中,目錄存放在 DIR RAM 中,數(shù)據(jù)存放在 DATA RAM 中。失效請(qǐng)求訪(fǎng)問(wèn)共享緩存,同時(shí)讀出所有路的標(biāo)簽、目錄,并根據(jù) 標(biāo)簽來(lái)選出目錄,并根據(jù)命中情況讀取數(shù)據(jù)。替換請(qǐng)求、重 填請(qǐng)求和寫(xiě)回請(qǐng)求只操作一路的 標(biāo)簽、目錄和數(shù)據(jù)。

LA664?是六發(fā)射 64 位的處理器核。在龍芯 3A6000?中的多個(gè)?LA664?核以及共享緩存模塊通過(guò) AXI 互連網(wǎng)絡(luò)形成一個(gè)分布式共享片上末級(jí)緩存的多核結(jié)構(gòu)。LA664 支持同時(shí)多線(xiàn)程技術(shù)(SMT2);有四個(gè)定點(diǎn)、四個(gè)向量、四個(gè)訪(fǎng)存單元;每個(gè)向量單元寬度為 256 位,最多支持 8 個(gè)單精度或 4 個(gè)雙精度乘加運(yùn)算; 訪(fǎng)存單元支持 256 位存儲(chǔ)訪(fǎng)問(wèn),虛地址為 64 位,物理地址為 48 位;一級(jí)指令緩存和數(shù)據(jù)緩存大小各為 64KB,4 路組相聯(lián); Victim Cache 作為私有二級(jí)緩存,大小為 256KB,16 路組相連; 一級(jí)緩存實(shí)現(xiàn)奇偶校驗(yàn),二級(jí)、片上末級(jí)緩存實(shí)現(xiàn) ECC 校驗(yàn),均支持一位糾正。

參考文獻(xiàn)

  1. LoongArch-Vol1-v1.02

  2. Loongson 3A5000/3B5000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.

  3. Wang H., Wang W., Wu R., Hu W., 2015. 龍芯GS464E處理器核架構(gòu)設(shè)計(jì). Sci. Sin.-Inf. 45, 480–500.?https://doi.org/10.1360/N112014-00292

  4. Hu, W., Wang, J., Gao, X., Chen, Y., Liu, Q., Li, G., 2009. Godson-3: A Scalable Multicore RISC Processor with x86 Emulation. IEEE Micro 29, 17–29.?https://doi.org/10.1109/MM.2009.30

  5. W. Hu et al., "Godson-3B1500: A 32nm 1.35GHz 40W 172.8GFLOPS 8-core processor," 2013 IEEE International Solid-State Circuits Conference Digest of Technical Papers, San Francisco, CA, USA, 2013, pp. 54-55, doi: 10.1109/ISSCC.2013.6487634.

  6. W. Hu et al., "Godson-3B: A 1GHz 40W 8-core 128GFLOPS processor in 65nm CMOS," 2011 IEEE International Solid-State Circuits Conference, San Francisco, CA, USA, 2011, pp. 76-78, doi: 10.1109/ISSCC.2011.5746226.

  7. Gao, X., Chen, Y.-J., Wang, H.-D., Tang, D., Hu, W.-W., 2010. System Architecture of Godson-3 Multi-Core Processors. J. Comput. Sci. Technol. 25, 181–191.?https://doi.org/10.1007/s11390-010-9315-3

  8. Hu W W, Tang Z M. Microarchitecture design of the Godson1 Processor. Chinese Journal of Computers, April 2003, 26(4): 385-396.

  9. Hu W W, Zhang F X, Li Z S. Microarchitecture of the Godson-2 processor. Journal of Computer Science and Technology, March 2005, 20(2): 243-249.

  10. Loongson 3A6000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.


發(fā)布于 2023-12-06 14:18?IP 屬地上海

發(fā)布一條帶圖評(píng)論吧


2 條評(píng)論

默認(rèn)

最新

銅線(xiàn)

市場(chǎng)自己選擇沒(méi)錯(cuò),問(wèn)題就是也沒(méi)有花費(fèi)力氣去推廣啊

12 小時(shí)前?·?IP 屬地浙江

銅線(xiàn)

市場(chǎng)自己選擇內(nèi)存,問(wèn)題就是也沒(méi)有花費(fèi)力氣去推廣啊

12 小時(shí)前?·?IP 屬地浙江


【知乎】我國(guó)為什么不推廣龍芯?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
房产| 阿拉善盟| 随州市| 广汉市| 濮阳县| 沁水县| 潼南县| 广汉市| 磐安县| 新干县| 福州市| 乌兰察布市| 获嘉县| 平武县| 利川市| 武功县| 平舆县| 武冈市| 仁寿县| 萝北县| 中宁县| 台东市| 古蔺县| 陇西县| 远安县| 新安县| 德安县| 合水县| 外汇| 林州市| 定安县| 来凤县| 石城县| 伊吾县| 新沂市| 丰都县| 乌兰浩特市| 应用必备| 邹平县| 鄂托克旗| 宜城市|