万年历 购物 网址 日历 小说 | 三峰软件 天天财富 小游戏 视频推荐 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页  日历2024  日历2025  日历2026  日历知识  | 每日头条  视频推荐  数码知识 两性话题 情感天地 心理咨询 旅游天地 | 明星娱乐 电视剧  职场天地  体育  娱乐 
日历软件  煮酒论史  历史 中国历史 世界历史 春秋战国 三国 唐朝 宋朝 明朝 清朝 哲学 厚黑学 心理学 | 文库大全  文库分类 
电影票房 娱乐圈 娱乐 弱智 火研 中华城市 仙家 六爻 佛门 风水 钓鱼 双色球 戒色 航空母舰 网球 乒乓球 足球 nba 象棋 体操
    
  知识库 -> 数码 -> 我国为什么不推广龙芯? -> 正文阅读

[数码]我国为什么不推广龙芯?

[收藏本文] 【下载本文】
龙芯现在看报道应该有赛扬J1800或者更强的性能了,虽然不能用windows,但是许多办公的地方也不打游戏,就是简单的用办公软件,也许像个别财务部门等…
几个根本性的问题:
兼容性
龙芯都是 MIPS, 但是作为 MIPS 来说, 他的特性又不完全兼容其他 MIPS:
作者:尧以俊德
链接:https://www.zhihu.com/question/48881215/answer/518741822
一开始是发现 gobject-introspection 会死锁(没有反应,按 ^C 可退出),我们也没有找到解决方案,就暂且关掉了一些 GTK 包的文档构建。后来发现部分别的应用也会死锁,我们就开始 gdb 看问题,找到问题陷在 FFmpeg 的库里,于是我们又去找是不是 FFmpeg 的构建配置不对,开错了什么开关。找了半天(实际上有一个月)都不知道为什么会陷入死锁,最后把 Glibc 的调试信息打开发现代码陷在了 pthread 里,而 pthread 此时正巧执行到了一段 MIPS 指令中的 Load Link / Store Conditional(ll / sc)指令对。到了这里我们才意识到我们碰到了硬件问题:在龙芯 3 号中,每次执行 ll 指令之前一定要执行一次 sync,并且 ll 指令之后 sc 指令之前的代码如果有跳转,跳转目标一定是 sync 指令。其中前者需要打上 GCC 和 Binutils 补丁,后者需要代码自行添加。[5]
这个问题主要影响 FFmpeg,所以所有依赖 FFmpeg 的软件都会各种死锁,FFmpeg 自己带的命令则各种 SIGBUS、SIGILL 和 SIGSEGV,最后整个多媒体栈基本上都是坏的,但是不依赖 FFmpeg 的软件跑得还是挺欢的。
ffmpeg 是一个多媒体工具/库, 很多软解播放器/OBS 这样的多媒体应用都依赖他. 这个问题说大不大, 但是说小也不小, 因为意味着很多面向 MIPS-Linux 的应用就要为此单独发布一个版本.
另外就是显然不能原生兼容 x86 应用. 虽说通过 qemu 进行跨平台 ISA 模拟, 然后运行 wine 就能够跑起来差不多七八成的 Windows 原生应用... 但是性能就很感人了. 要知道 x86 上是可以几乎以 100% 甚至超过 100%(Linux wine 在 IO 上面有些实现是异步非阻塞的) 性能运行 Windows 应用.
Linux 方面有主线, GPU 用 AMD + 开源驱动的就算是勉强能用了.
2. 性能
惨. J1800 在 Windows 上也就是几乎不能用的水平(现在能用的底线是 J5005 或者 4415Y). 如果只是勉强与其持平, 可以想象大多数能跑的办公软件, libreoffice, 或者哪天移植了 WPS, 基本上跑不动. Office 走虚拟化+wine 的话估计跑 03 都吃力.
能效上完全的垫底.
3. 集成度
和 J1800 接近的性能的代价是数倍的功耗, 外加 CPU die 上不集成南北桥和 GPU. 之前就被 HT 的 AMD 芯片组断供折腾了好久.
4. 生态
首先 nix 上的桌面不是基于古老的 X 就是基于 Wayland. 然后这些桌面系统和内核的耦合度不高. 每一个基本都是凑合着用的水平. 而之前也说了, 如果要能跑, 基本得等到原生二进制. 那可以想象真的没啥东西好跑了. 就算 Chrome/Firefox 能跑, 这性能也非常惨... 还有, 个别政府机关的网站还有 IE Only, 以及依赖 Flash、ActiveX 和 SliverLight 扩展的...
5. 价格
一个性能接近 J1800 的东西, 基本就要卖到 3000 到 4000 多... J1800 这种只要 300 就能搞定主板, 500 搞定整机, 还是 thin itx... 而龙芯这边怎么搞也只能做到 matx...
怎么推广,我随便打个比方,你看看靠谱不,能不能套用在龙芯上:
老百姓:什么玩意,又难用又贵,老子才不买呢,政府扶持的让政府、机关、事业单位、国企、央企先当小白鼠去。
中央政府:总不能让我先试吧,万一出点什么问题那就完蛋了,我都是用最稳定的东西,不求新不求快不求贵贱,这些新出的玩意你还是让别人试好试稳定了再来吧!
地方政府:
这玩意儿是咱们扶持的吗?不是呀?不是的话谁扶持的谁想办法去,我们先当小白鼠,出了问题这板子打谁身上?再说了,上级都不敢用,说明这玩意儿不靠谱,我们为啥要用,又有风险又没好处,这事儿不干。
这玩意儿是咱们扶持的吗?是啊!那让下面先试试吧,那么多机关、国企,挑几个先试试。
下级机关、国企:
又推广新东西了?上级批资金吗?没批?那这事儿干不了。
又推广新东西了?上级批资金吗?居然批了!那买点吧,意思意思,别买多,耽误干正事!
————————————————————
这都有实例,早年中央就号召说,我们跟美国关系紧张,美国的东西要慎用,不能让自己的命脉抓在一众美国企业手里,要支持国产,尤其是你们这些高信息化企业,要摆脱对IOE的依赖。
这IOE指的是美国三家著名公司,分别是IBM、Oracle(甲骨文)、EMC(易安信,现在已经被戴尔并购了),主营业务分别是计算、数据库、存储,他们的产品可谓是我国信息支柱的半壁江山。
中央喊了这么多年“去IOE”,有效果吗?多少有一点。真去了吗?没有!证券、银行、保险、交通运输等等还是用的这些东西。
冰冻三尺非一日之寒,想解冻,想崛起,慢慢来吧。
有个前苏州笑话。
你支持国产操作系统吗?
必须支持!
你支持国产CPU吗?
当然支持!
你支持华为鸿蒙吗?
转体三百六十度支持!
你愿意办公用龙芯电脑吗?
不愿意!
为什么呢?
因为真的买得到。




这么说吧,就是龙芯性能太低,无法满足基本的“办公需求”,就这么简单。
龙芯的却可以用来办公,这是没问题的,但是办公需求不仅仅是简单的办公。
除了少数企业和部门,大部分的办公人员的电脑,往往不会仅仅是用一般的办公软件。他们也会安装各种,不经常用或者经常用的大软件,更别说很多企业的员工怎么可能上班就专心办公呢?不要休闲娱乐么?真的就用用excel的实在太少了。
这一点都设计软件生态,和硬件性能。
软件你可以找到替代方案,但是终究要让人去适应。而大部分人是拒绝改变的,就连很多人把xp换win7 win7换win10都不开心呢。
外加就是硬件性能不足。
所以一个是要搭载主流系统,一个是提升性能,这些会慢慢改变,但是目前还是瓶颈,这个不是国家推广与否能改变的,这是市场需求决定的。
我国推广鸿蒙:
华为:我们发布了搭载鸿蒙1.0系统的荣耀智慧屏,全面兼容Android TV的各种应用,内置ADB!
网友A:沸腾了!华为打破美国垄断,贸易战制裁下所有关键部件必须国产!
网友B:鸿蒙支持的应用再少我也要买鸿蒙,初期的鸿蒙肯定是不完美的,因为鸿蒙是不完美的战士,安卓是完美的苍蝇,哪怕不支持几个应用我也要花钱支持一下,中华有为!
--
我国推广龙芯:
龙芯:求求大家用用吧,已经赶上了i3的性能了,当台式机已经没啥问题了,浏览器已经有了,Office也有了,常用软件都有中文替代免费版了。
网友A:这么烂的性能,你凭啥让我用?
网友B:为啥只能跑Linux?我不爱用Linux,何况连QQ和微软office都没有,你还好意思让我用?
推广没问题,但是别像某些厂子绑架爱国情怀,能用MIPS的用户都不是小白,别用那1000多的板子配点垃圾配件,上来就8000或10000的玩。
Linux没问题,不过还是想用OpenBSD。龙芯自己加入了一些特定指令集,并非MIPS64标准指令集,编译器更新似乎没跟上进度。所以OpenBSD在某个特定版本之后,就没新的CPU支持了。
更新下:
RISC-V出来了,MIPS压力也很大。
在IoT市场上,RISC-V + BSD家族的产品,完全可以商业闭源的玩商业市场,国际上也说的过去。
利益相关:Fullstack CRUD boy
消费者并不使用硬件,消费者使用的是app。
app开发者也不使用硬件,app开发者使用的是操作系统(提供的api)进行编程。
操作系统才是直接使用硬件的一方。但,有没有为龙芯开发的操作系统?有,但并不流行。
所以,整个构架是:消费者使用app,app开发者使用操作系统,操作系统使用硬件。
你只推广国产硬件,不推广支持这个硬件的操作系统,那有什么用呢?
可能有人觉得某某是国产操作系统,但是某某国产操作系统,它(至少目前)并不支持龙芯。
因此,推广龙芯,是一整条产业链,除了推广硬件,还得推广龙芯相关操作系统,还得让开发者为相关操作系统开发软件。。。
这一系列的工作,全都由国家来做的话,很难做到。我相信国家想还是想的,但根本没有足够的投入跟预算来做这件事。
某私人企业或许能做到这样的推广能力跟执行力,但人家又不鸟龙芯,怎么办呢?
这个问题应该问么?这么多国产CPU为什么在知乎上,就龙芯一直在问,为啥不支持我?市场经济,用户自由选择,还因为啥?应该问的是为啥没有别的CPU来卖惨?兆芯应该问,为啥除了上海,都不待见他?部分原因是龙芯把兆芯喷成买办了吧。华为的鲲鹏强吧,为啥不能问问,为啥老美就使劲制裁他,原因是他强啊!还有海光、飞腾和申威,都上制裁名单了,因为它们真的可以做高性能计算!龙芯是不是应该在问销量之前先问问自己,为啥宣传最自主的自己,进不了美D的法眼啊?
说到底,还是产品不行,贵,生态差,最要命不稳定。它宣传最起劲的是指令集,其实不是用户和国家的痛点,国内什么指令集都有,在这点上老美根本卡不住。其它方面都比别人差,包括微架构,别人用更小的面积功耗,能做出更稳定性能差不多或更好的核,它一直攻击的飞腾兆芯和海思,这些都是自己做CPU核的。
它起步早,从中科院出来,自认为国家应该支持它,但现在作为夫妻店民营企业,应该调整心态,能力不行做点边边角角就好了,能力强就去争,跑到知乎自问自答卖惨算干嘛滴,20年已经沾了中科院不少光,胡老板也成了国内xc最有钱的老板,还想干啥,没有人像联想一样,追究原罪就不错了,买计算所的知识产权价格是谁定的?国家啥时候放弃企业控制权的?
因为龙芯在国产CPU中并不突出,包括其卖力宣传的自主可控。
现在没有专门推广龙芯,几个信创cpu各自开拓市场。现在还是华为与海光(amd)相对做的好一些。因为华为内部生态好,amd适配性好。
龙芯的道路本身要难一点,平地起高楼,真正在“造计算机”,而且搓出了国内单核最强的cpu(基准测试略高于9000s,kx7000g目前没有可售产品,性能不可知,amd的不能算),顺带做了一批中小cpu ,二次开发几个操作系统,做了一批编译器,虚拟机,做了浏览器,做了应用软件,几百人的规模,做这么多事情,还是不容易。希望龙芯能挣到一些钱,搓出更好的cpu。
麒麟鲲鹏已经得到了美国商务部的认可,今天飞腾神威也得到了美国商务部的认可。
或者说大疆无人机都能获得认可,但仍然距离龙芯还有好远的感觉。
卸腰……
因为就没有能用的民用产品。而且除非全都换了不然跨平台很蛋疼的,指令集都不一样
1.龙芯不是X86架构,用不了Windows。
2.龙芯不是ARM架构,连用安卓都得不到很好支持。龙芯是MIPS。
所以你要在普通用途上推广是药丸的。一个什么主流系统都用不了的玩意能有市场?
只不过龙芯虽然不做普通民用领域,但能做专业军工领域。
比如DSP芯片的IP核
说那些有的没的都没有用,图吧垃圾佬一测就知道
视频:【图吧杂谈】龙芯圈没有资格定义兆芯是否挤牙膏,兆芯6年性能提升7倍达到7代I5水平 BV1W14y127FB
原视频:英特尔痛失牙膏厂名,牙膏王惟您兆芯独尊 BV1v84y1q7d7
gueenet· 2022-10-21 (龙芯吧小吧主)
此人被图吧垃圾佬的多项测试打脸,目前已破防把咱拉黑,咱却从始至终并没有拉黑这位龙芯吧小吧主
本篇为视频笔记存档,并没有太多的论证
省流:


这是十年前的兆芯A双核板U,垃圾佬于2023年初以48江浙沪包邮的价格购入,型号C4350AL




开机CPU会占用100%很长时间无法动弹
缓一会儿才能好




象棋跑分只有3倍多,CPUz跑分200出头


19年的KX6000(兆芯E)八核板U,整机于2022年底550包邮购入,如今已经450包邮,CPU型号KX-U6780A




象棋跑分超过22倍,CPUz超过1400分


图吧的I5 2500K跑分,可以看到象棋跑分25.07 12033(4.0G)


17年的I5 7400与8400跑分对比,可以看到I5 7400 象棋10202,这跑分反倒下降了六分之一,英特尔挤了这么多年的牙膏害缩回去了
I5 7400 17年发布,售价$182.00
I5 2500K 11年发布,售价1400RMB,19年售价170
翻译翻译,龙芯吧小吧主说兆芯挤牙膏什么叫真正的挤牙膏?这?才叫真正的挤牙膏
——当年咱总觉得罗永浩老打断王自如显得很没礼貌,现在回头看老罗没当场真人快打现场PK是老罗真有涵养。
就这些
结论是已经花了很多精力,但是市场会自己做出选择。除了商业上的原因,建议题主看看我的龙芯发展历史文章,可以从技术角度得到一些答案。
前言
最近几年系统性的学习并梳理了近30多年的计算技术发展历史,稍有感悟。遂决定将之整理成文,目的有二,一来作为知识沉淀,串联起不同技术,挖掘不同架构之间的渊源,二来通过整理再次审视历史,期望窥见未来发展方向。我将本系列命名为鉴往知远, 主要关注计算与互联。 本文为第二篇,主要回顾龙芯系列。
0. 概述
龙芯根据架构的不同,存在 3 个处理器系列。
龙芯一号,用于消费电子和嵌入式应用 龙芯二号,用于嵌入式应用和低性能个人计算机的单核处理器 龙芯三号,用于更高性能计算机、高性能计算和服务器的多核处理器
龙芯处理器核按照微架构,分为四类,分别是:
单发射32位(132)GS132:带硬件分频器的基本嵌入式 MIPS32 内核。3- (GS132) 或 5- (GS132E) 级流水线 双发射32位(232)GS232:高端嵌入式 MIPS32 GS232 最多有 5 级流水线,500MHz,16KB L1。GS232 主要用于龙芯一号产品 GS232E最多有 10 级流水线,1000 MHz,16KB L1,L2 = 4 MB 共享。乱序执行 四发射64位(464) GS464:具有四路超标量乱序执行的MIPS64内核。该设计起源于龙芯2F处理器 GS464 支持 MIPS64 R2 + LoongMMI(2E 和 2F 中的两个不同版本) GS464V 于 2010 年随龙芯3B 首次推出,是具有矢量功能的 GS464GS464E是 GS464 的改进版本,包括更大的缓存和更好的分支预测等 GS464EV 是 GS464 系列的发展,首先被 3A4000 处理器使用 双发射64位(264)GS264:MIPS64 内核,是GS232的64位实现
另外,LA464 是 GS464的发展,支持 LoongArch。下图展示了龙芯各代产品之间继承和发展关系图:


龙芯 1 即Godson-1是单发射乱序32位处理器,是中国国内设计的第一个通用处理器 龙芯 2 是 MIPS III 兼容 64 位处理器系列。与龙芯 3 系列共享 GS464处理器核,龙芯 2的发展规划是从CPU发展为SOC。龙芯 2E (2006) 是一个 CPU,2F (2007) 集成了北桥。2F 的设计是 GS464 核心的基础 2009年的龙芯 3A1000是第一个生产的处理器,使用 4 个 GS464 内核,65 nm工艺。 龙芯 3A1000 能够以接近 1 GHz的时钟速度运行,首先是4 个 CPU 内核(~15 W),然后是 8 个内核(40 W)的龙芯3B1500 2015 年,发布了 龙芯3A1500 和 龙芯3B2000。使用增强型 GS464E 处理器核,改进后的微体系结构提供了更好的性能,据报道速度是 龙芯3A1000 的 3 倍,并且还引入了 LoongISA 增强型指令集。 龙芯3A1500 用于嵌入式应用,而 龙芯3B2000 用于服务器和 PC 2017年龙芯发布龙芯3A3000。龙芯3A3000 采用四核 64 位设计,主频为 1.5 GHz,功耗仅为 30 W 2019 年底,发布了 龙芯3A 4000 和 龙芯3B 4000 系列。使用了升级后的 GS464EV 微架构。处理器设计有四个内核,8MB 的 L3 缓存和 1.8 GHz 至 2 GHz 之间的工作时钟 2021年7月,龙芯3 5000系列发布。该系列处理器是龙芯首款自主研发的LoongArch指令集架构,包括 龙芯3A5000,一个四核台式机 CPU 和 3C5000L,一个十六核服务器 CPU,基于单个封装中的四个 3A5000。使用LA464处理器核 2023年11月,龙芯官方发布龙芯3A6000使用是6发射双线程的LA664处理器核
本文主要关注龙芯三号,其微架构主要为四发射64位,即GS464系列。关于龙芯指令集架构历史渊源请参考第一章龙芯指令集架构的介绍。本文通过系统性回顾整个龙芯系列处理器,试图通过龙芯系列处理器发展的历史脉络,来展现国内处理器技术发展历程,以及和国际主流处理器厂商的差异。下表总结了各代处理器之间的关键指标和规格:
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
可以发现,龙芯处理器很多精力都花在指令集上了,而本身处理器核的微架构更新比较缓慢。
本文组织形式如下:
第一章简单介绍龙芯指令集架构LoongArch v1.02 第二章介绍Godson-1的微架构,了解龙芯乃至中国的第一个处理器设计 第三章介绍Godson-2和Godson-3A的处理器核GS464微架构,后续龙芯都是以GS464为基础 第四章简单描述Loongson-3B1500 整体架构以及支持向量运算的处理器核GS464V微架构 第五章介绍Loongson-3A2000的处理器核GS464E的微架构 第六章简单介绍基于GS464E的Loongson-3A3000,主要是基于Loongson-3A2000做了工艺升级 第七章简单介绍基于GS464EV的Loongson-3A4000, 第八章介绍基于LA464处理器核的Loongson-3A5000 第九章介绍Loongson-3A6000文章最后列出了主要的参考文献1. LoongArch指令集架构
龙芯的指令集架构分为三个阶段:
MIPS 龙芯在初始阶段使用MIPS64 指令集架构(ISA)。2009 年 6 月,ICT 直接从MIPS公司获得了 MIPS32 和 MIPS64 架构的许可。2011 年 8 月,龙芯科技有限公司从 MIPS 公司获得 MIPS32 和 MIPS64 架构许可,用于继续开发基于 MIPS 的龙芯 CPU 内核 LoongISA 2015年龙芯3A2000采用LoongISA 1.0扩展指令集,是 MIPS64 的超集。LoongISA 指令作为 GS464E 内核的一部分引入。包括下列部分: LoongEXT,通用扩展,148 条指令 LoongVZ,MIPS64 版本 5 中引入的“VZ”系统的虚拟化扩展,5 条指令 LoongBT,更快的 x86 和ARM二进制翻译,213 条指令 LoongSIMD,原名LoongMMI(在龙芯2E/F),为128位SIMD,1014条指令 来自 MIPS 第 5 版的 MIPS SIMD 架构 (MSA)、DSP 和 VZ 模块LoongArch 随着龙芯 3 5000 系列的发布,龙芯在 2021 年转向了自己的处理器指令集架构(ISA)。LoongArch 包括一个简化的 32 位版本(LA32R),一个标准的 32位版本 (LA32S) 和 64 位版本 (LA64)。
LoongArch ISA 手册已于 2021 年 8 月部分可用,其第一卷记录了基本架构。根据LoongArch手册,ISA使用了MIPS的特权模型和IRQ机制,其他部分大多遵循RISC-V的做法:去掉了分支延迟槽,改变了指令编码。LoongArch 是全新的指令集,不是在 MIPS 上做的扩展。包含基础指令 337 条、虚拟机扩展 10条 、二进制翻译扩展176 条、128 位向量扩展 1024 条、256 位向量扩展 1018 条,共计 2565 条原生指令。相对于MIPS,摒弃了部分不适合现代CPU的指令,又做了大量改进和扩展。例如单条指令支持的立即数从MIPS的最大16位扩展到最大24位,分支跳转偏移也从64K扩展到1M字节,以及寻址空间从固定分段改变为单一平面等,都有效减少了编译结果的目标指令条数和访存次数,提高了效能。LoongArch的指令系统在设计时,以先进性、扩展性、兼容性为目标,其中兼容性是指融合MIPS/x86/ARM指令系统的主要特点,高效支持二进制翻译。
1.1 寄存器
LoongArch 为RISC指令集,有32个通用寄存器、32个浮点/向量寄存器。其中r0的值为0,PC的值是当前指令地址,只能被转移指令,异常陷入和异常返回间接修改。寄存器宽度在LA32下是32比特,在LA64下是64比特。


1.2 计算模式
龙芯架构分为LA32和LA64两种计算模式,LA64可以兼容LA32的应用层软件,具体由CSR.MISC.VA32L1/VA32L2/VA32L3控制,当这些值为1时,运行在PLV1/PLV2/PLV3级下的软件就以32位地址模式运行。此时硬件将访存虚拟地址低32位零扩展至64位之后的值作为访存的地址。
1.3 指令格式
MIPS只有3种指令格式,LoongArch重新设计了指令格式 ,使用32位定长指令,可用的格式多达9种 ,其包含3种无立即数格式和6种有立即数格式。重新设计的指令格式可以包含更多的指令槽,有利于以后的长远发展。指令编码格式如下表所示:


1.4 特权模型
龙芯架构分为4个特权等级,分别是PLV0~PLV3,由CSR.CRMD.PLV 确定。其中,PLV0具有最高特权等级,可以使用特权指令并访问所有特权资源。PLV1~PLV3,都不能执行特权指令和访问特权资源,在MMU采用映射地址翻译模式下具有不同的访问权限。
1.5 存储模型
龙芯架构的存储一致性模型采用弱一致性(Weakly Consistency)模型,程序必须使用同步指令对写共享单元的访问保护起来,以保证对于写共享单元的访问是互斥的。对访存的顺序限制如下:
同步指令的执行满足顺序一致性条件,即同步操作在所有处理器核中都严格按照程序顺序执行,在当前同步指令完成之前不能开始执行下一个同步操作 在任一访存指令被执行之前,该指令之前的同步指令已经完成 在任一同步指令被执行之前,该指令之前的访存指令都已完成
龙芯架构下支持三种存储访问类型,由页表中MAT(Memory Access Type) 决定,分别是:
一致可缓存(Coherent Cached) 访问对象可以是主存也可以是缓存 强序非缓存(Strongly-ordered UnCached) 严格按照程序顺序执行 弱序非缓存(Weakly-ordered UnCached) 读允许投机执行,写可以合并1.6 内存管理及虚拟化
龙芯架构MMU地址翻译由CSR.CRMD控制,
当CSR.CRMD.DA=1 && CSR.CRMD.PG=0时,虚拟地址就是物理地址 当CSR.CRMD.DA=0 && CSR.CRMD.PG=1时,虚拟地址需要经过翻译,可以分为直接映射和页表映射1.6.1 直接映射地址翻译模式
软件通过设置CSR.DMW0~CSR.DMW3寄存器来分别设置四个直接映射配置窗口,前两个同时用于取指和存储加载指令,后两个只作用于存储加载指令。 在LA64架构下,当虚拟地址最高4位[63:60]与配置窗口寄存器中的VSEG域相等且特权等级匹配时,物理地址等于虚拟地址的[PALEN-1:0]。 在LA32架构下,每一个直接映射配置窗口寄存器可以配置一个$2^{29}$字节固定大小的虚拟地址空间,当虚拟地址的最高3位[31:29]与配置窗口寄存器中的[31:29]相等且特权等级匹配时,物理地址等于虚拟地址[28:0]拼接上映射配置寄存器配置的物理地址高位。
1.6.2 页表映射
龙芯架构下TLB的重填以及TLB与内存页表的一致性维护全部需要软件完成,多级页表结构如下所示:


当遍历页表时,PGD由虚拟地址$PALEN-1$决定, 当VA[PALEN-1]=0时,PGD来自CSR.PGDL 当VA[PALEN-1]=1时,PGD来自CSR.PGDH
页表项格式如下表所示:


1.7 异常和中断
异常和中断会打断当前正在执行的应用程序,并切换到异常中断处理程序入口开始执行,异常和中断属于架构中特权资源处理部分,下面主要介绍常用一些异常:
系统调用异常 执行SYSCALL 指令触发 断点异常 执行BREAK指令触发 指令不存在异常 所执行的指令编码未定义时触发 特权指令错异常 在非特权模式下执行特权指令时触发 地址错异常 当取指或访存指令的地址出现分发情况时,分别会触发取指指令地址错异常或访存指令地址错异常 浮点错异常 当浮点指令的数据出现异常情况需要特殊处理时触发1.7.1 异常和中断处理
TLB重填异常的入口地址是CSR.TLBRENTRY, 机器错误异常的入口是CSR.MERRENTRY,其他异常称为普通异常,入口地址等于$入口页号 | 页内偏移$ ,所有普通异常的入口页号都是CSR.EENTRY ;而页内偏移由中断偏移模式和异常号(ecode)共同决定,等于$2^{CSR.ECFG.VS+2} * (ecode+64)$ 。中断被当成普通异常处理,因此使用普通异常的入口计算方式,区别是,中断对应的异常号是对应中断号加上64。异常ecode如下表所示:


触发异常的指令的地址会被记录到ERA里,作为异常返回地址;对于地址错误相关的异常,出错的地址会被记录到BADV。触发异常的指令会被记录到BADI里。
2. Godson-1
龙芯第一款处理器龙芯1号设计于2001年,2002年发布,是一款32位单发射乱序执行CPU,主频266MHz。学术论文上代号是Godson-1,是中国科学院知识创新工程方向性项目与国家“八六三”高技术研究发展计划项目的研究成果。它采用 0.18 微米 CMOS 工艺制造,具有 8 KB L1D、8 KB L1I 和一个 64 位浮点单元,能够达到 200 双精度 MFLOPS。下图展示了Godson-1的物理规划版图:


龙芯1号实现基于操作队列复用的寄存器重命名技术,采用Tomasulo算法进行动态调度,分支预测使用静态预测,即每次都预测分支执行。主要由取值单元,译码单元,操作队列,定点和浮点寄存器文件和定点浮点执行单元组成。下图展示了Godson-1的微架构:


指令译码单元按程序顺序将译码后指令分发到操作队列,操作队列根据指令类型发射到对应的保留站,并按序结束已经完成的指令。保留站中的指令经过执行单元之后,结果写回到操作队列和结果总线。如果指令发射时源操作数还没有准备好,并不会阻止指令的发射,而是通过操作队列号建立指令间的数据依赖关系并发射到保留站;保留站自动侦听总线结果并接受所需要的值,具体过程如下:
指令进入操作队列时将该指令的的源寄存器号与操作队列中的每一个指令的目标寄存器号进行比较,得到操作队列中最近的写该寄存器的指令的位置Qid 指令发射时检查Qid的值,如果已经写回到操作队列则直接读出,否则将Qid送到保留站并记录值未准备好 当保留站中所有操作数都准备好后开始运算并把结果送到结果总线,对应操作队列和保留站
指令流水线分成取值,译码,重命名,发射,执行,写回,完成等阶段,其中执行阶段可能需要多拍,具体如下:
取值 根据当前程序计数器PC将指令从缓存读到指令寄存器IR,无分支指令及异常情况下,下一条指令的PC为当前指令的PC+4 译码 根据IR中的指令进行译码并写入操作队列,如果操作队列已满,流水线暂停 重命名 该指令的的源寄存器号与操作队列中的每一个指令的目标寄存器号进行比较,得到操作队列中最近的写该寄存器的指令的位置Qid 发射 从操作队列中选出一个指令并发射到相应的保留站,如果指令源操作数不可用,则需要保留站记录值未准备好 执行 执行单元从保留站中取出所有源操作数都准备好的指令进行运算,并将结果及指令在操作队列位置编号送到结果寄存器 写回 把结果寄存器的值以及相应指令在操作队列位置编号送到结果总线,保留站和操作队列侦听结果总线的信息,并更新相应状态 结束 如果操作队列中的第一个指令已经完成,则结束该指令并将操作队列里的结果写回到目标寄存器。如果操作队列中的第一个指令在执行过程中发生异常,则进行异常处理3. Godson-2 和 Godson-3
龙芯2F于2007年7月31日流片成功,90纳米工艺,4发射乱序执行,面积 $43mm^2$ ,龙芯2F是龙芯第一款成功的商用处理器。下图展示了Godson-2E的物理规划图:


下图展示了Godson-2F的物理规划图:


龙芯2G是在“龙芯安全适用计算机CPU研制与应用”核高基重大专项课题支持下研发的,2008年开始投入设计,2010年研制成功。龙芯2G采用65纳米工艺,主频1.0GHz,晶体管数目1亿,指令集兼容MIPS64,且增加了X86二进制翻译加速指令,以及龙芯媒体扩展指令,有64KB的指令和64KB数据的L1缓存,以及1MB的L2缓存,功耗3W。在该处理器上,使用了X86二进制翻译技术,提出了在MIPS平台上实现X86动态二进制翻译的方法。龙芯2G相当于龙芯3A1000的单核版本。龙芯3A1000于2008年底交付流片,采用意法半导体的65nm工艺流片,主频800MHz-1GHz。龙芯3A1000进行了第一次改版并于2010年5月中旬流片,10月底第一次改版流片成功。3A1000的第二次改版于2012年2月下旬流片,2012年8月中旬流片成功。
龙芯3A1000集成了4个四发射乱序执行的GS464核,9级流水线,有64KB一级数据缓存和64KB一级指令缓存,4MB共享二级缓存,最高主频1GHz,功耗15w(支持动态降频),芯片面积 $174mm^2$ ,晶体管数目4.25亿。每个CPU核包含两个浮点乘加部件,双精度浮点性能峰值为16GFlops。在龙芯3A1000处理器中,实现了x86二进制翻译加速指令。3A1000集成了PCI控制器、LPC、SPI、UART、GPIO和2个HT1.0;集成72位DDR2/3控制器。下图展示了Godson-3A1000的物理规划版图:


龙芯3A1000第一级互联采用6x6的交叉开关,用于4个处理器核,4个共享缓存模块和两个IO端口的连接。第二级互联采用5x3的交叉开关,连接4个共享的缓存模块,两个内存控制器和一个IO端口。下图展示了龙芯3A1000整体架构:


下图展示了一个8x8交叉互联的架构:


8个AXI master link(AML) 和 8个AXI slave link(ASL) 通过一个交叉开关进行互联,AML 使用读写请求的地址信息进行路由,读写各有8个地址区间,对应ASL。ASL通过相应请求的AML 端口号将读写响应路由到对应的AML。AML和ASL各有两级流水,所以交叉互联一共有4个周期延迟。
3.1 GS464微架构
下图展示了GS464的微架构:


指令流水线分成取值,译码,重命名,发射,执行,写回,完成等阶段,其中执行阶段可能需要多拍,具体如下:
取值 根据当前程序计数器PC将指令从缓存读到指令寄存器IR,无分支指令及异常情况下,下一条指令的PC为当前指令的PC+16 预译码 对指令扫描,识别出分支指令并对其分支方向进行预测 译码 根据IR中的4条指令进行译码并送到寄存器重命名模块 重命名 将架构寄存器映射到物理寄存器上 分发 寄存器重命名之后的指令被分发到定点或浮点保留站以便执行,同时送到重定序队列以便顺序完成;分支和存储加载指令被分发到对应的分支队列和存储加载队列。保留站和发射队列每项可保存分发4条指令 发射 从保留站中选出操作数都准备好且最老的一个指令并发送到相应的执行单元,如果指令源操作数不可用,则侦听结果和前馈总线 执行 执行单元从保留站中取出所有源操作数都准备好的指令进行运算,并将结果发送到结果和前馈总线 结束 每周期可完成4条指令,完成的指令的结果被发送到寄存器映射模块以便更新架构寄存器同时释放资源3.1.1 取指和分支预测
GS464包含 1 个4 路组相联 64 KB 的指令缓存, 其缓存行大小为 32 字节, 指令缓存的标签和数据部分同时访问并在下一时钟周期进行命中的判断与选择。其中数据部分划分为 8 个bank,每次取指令时只用读取所需要的bank, 降低了缓存访问时的动态功耗。指令缓存使用虚地址索引和实地址标识的索引方案。取指部件的虚实地址转换通过 16 项全相联结构的指令 TLB 完成, 指令 TLB 中的内容是页表的子集。其中, 每项存放 1 个页表项, 每个页表项均可支持 4 KB-1 GB 之间不同大小的页。当指令缓存命中时, 取指部件每个时钟周期最多可以从指令缓存中取出 4 条指令, 并送往下 一个流水级进行分支预测. 而当指令缓存未命中时, 取指部件将生成请求并访问缓存失效队列, 访存失效队列负责进行缓存缺失处理, 并将结果返回给指令缓存。从缓存失效队返回的结果将整体填回指令缓存, 指令缓存最多可容忍 3 个缓存行不命中, 即有 3 个未完成 (outstanding) 的缓存行不命中时, 依旧可以从正确的地址取指令。当取指请求恰好落在从缓存失效队列返回的缓存请求数据上时, 可以直接取出相应指令进入下一个流水级。此 外, 指令缓存的预取由缓存失效队列中的硬件预取引擎统一完成, 不在取指部件中单独进行。指令缓存的数据部分中还包含预译码信息, 每条指令的预译码信息为 8比特大小, 主要用于指令切分、分支类型判定和部分指令例外的判定。预译码信息通过在缓存失效队列重填指令缓存时计算得出, 并存储在指令缓存中。
在预译码阶段,会扫描IR里4条指令中的分支指令并预测分支方向和分支目标,branch-like 和 jump 指令总是预测执行,对于条件分支指令,则使用分支历史表(BHT)来预测分支方向,使用分支目标缓冲(BTB)和返回地址堆栈(RAS)预测分支目标地址。BHT由9比特全局历史寄存器(global history register) GHR 和4K模式历史表(pattern history table) PHT组成,PHT里每项有2比特的饱和计数器,高位用于分支方向预测。BTB有16项,每一项由指令地址和跳转指令目标地址以及2比特饱和计数器组成,计数器值为0或1的项首先被替换。RAS有4项,当遇到branch and link 指令时,将当前指令地址加8推进RAS,而遇到jump register 31 指令时从RAS中弹出指令地址。
在译码阶段,4条指令被译码并送到寄存器重命名模块。
3.1.2 寄存器重命名
GS464使用合并的架构和重命名寄存器堆,定点和浮点分别是64项,相应使用64项的PRMT(physical register mapping tables)来维护架构和物理寄存器之间映射关系。PRMT每项包含:
状态 每个物理寄存器处在下列状态之一:MAP_EMPTY,MAP_MAPPED, MAP_WTBK, MAP_COMMIT 名字 物理寄存器对应的架构寄存器标识 有效位 如果多个物理寄存器映射到一个架构寄存器,则标识最新的
寄存器重命名时,需要查找PRMT来找到两个源寄存器src1,src2,目标寄存器dest 对应的最新映射的物理寄存器psrc1, psrc2和odest。另外,一个处于MAP_EMPTY的物理寄存器pdest被映射到dest,且状态修改为MAP_MAPPED,有效位置1,odest有效位置0。之后映射的物理寄存器被送到保留站,odest保存在重定序队列以便指令结束时释放物理寄存器。当指令执行完成时,对应的PRMT项状态更新为MAP_WTBK, 指示后续依赖指令的操作数准备好了。当指令完成后,pdest的状态更新为MAP_COMMIT,odest更新为MAP_EMPTY。
3.1.2 指令发射
GS464有两个保留站,分别是定点和存储加载保留站和浮点保留站。每个保留站有16项,每周期可接收4条指令。每项包含一个年龄域,当指令进入保留站时设置成最小值,当同一个功能单元的新指令进入时,旧指令的值加一。从保留站中选出操作数都准备好且最老的一个指令并发送到相应的执行单元,如果指令源操作数不可用,则侦听结果和前馈总线
对于分支指令,除了发送到保留站和重定序队列之外,还会进入分支队列,每周期可接收一条分支指令,同时最多保存8条分支指令。当分支指令执行时,结果写回到分支队列,包括JR和JALR指令的地址,条件分支的分支方向,以及预测是否正确。每一个指令都会分配一个brqid,对于分支指令,指示在分支队列的位置,对于其他指令,标识了该指令前一个分支指令的位置。当分支预测错误时,该分支指令之后的指令都会被取消。
3.1.3 指令完成
寄存器重命名之后指令都被保存在重定序队列,直到指令完成。当指令执行结束且写回后,重定序队列按照程序顺序完成,重定序队列一共可以保存32条指令,每周期可接收4条指令。新进入的指令处于ROQ_MAPPED状态,当指令结果写回时后,对于分支指令,状态更新为ROQ_BRWTBK,其他指令则更新成ROQ_WTBK。对于分支指令,只有分支结果确定且对于预测错误的分支指令冲刷流水线之后才会更新成ROQ_WTBK。当指令到达重定序队列队头且处于ROQ_WTBK时才可以结束。每周期可完成4条指令。当指令完成时,pdest和odest发送到寄存器重命名模块以便更新处理器架构状态并释放odest项。对于产生异常的指令,也会在指令到达队头时处理。
3.1.4 访存队列
GS464有64K的指令缓存和数据缓存,都是4路组相联;64项的TLB,为全相联结构。访存队列一共有16项,最多可以跟踪16条存储加载指令。当加载指令进入队列时,会检查所有更老的存储指令;当存储指令进入队列时,会检查所有更年轻的加载指令。
4. Loongson 3B1000和3B1500
龙芯3B1000由核高基项目课题“高性能多核CPU研发与应用”支持,采用意法半导体65纳米工艺设计,主频1GHz,功耗25W,片内集成8个64位四发射乱序执行龙芯向量处理器核GS464V,4MB的二级缓存,每个核包含两个256位向量部件,峰值浮点性能达到128GFLOPS。龙芯3B1000的最大特色是龙芯向量处理器核的设计,该处理器核将GS464核的的浮点部件和浮点寄存器堆替换为2个256位的向量处理部件和1个128x256位的向量寄存器堆,使龙芯3B在1GHz下的峰值双精度浮点计算能力达到128GFlops。在龙芯3B1000处理器中,实现了300多条专用的向量处理指令。龙芯3B1000芯片面积 $300mm^2$ , 晶体管数目接近6亿。
龙芯3B1500集成了8个四发射乱序执行的64位GS464V处理器核,9级流水线,每个处理器核有64KB的私有一级指令缓存和64KB的私有一级数据缓存,128KB私有二级缓存,有8MB三级共享缓存,采用中芯国际32纳米工艺生产,芯片面积 $180mm^2$ , 晶体管数11亿,主频1.5GHz,单芯片双精度浮点计算能力达到192GFlops,功耗30w(典型)/60w(向量)。 有2个HT2.0,PCI、LPC、SPI、UART、GPIO,72位DDR2/3控制器。龙芯3B1500由2个处理器节点组成,每个处理器节点有4个GS464V处理器核,两个处理器节点之间通过交叉开关互联。下图展示了龙芯3B1500 整体架构图:


下图展示了龙芯3B1500物理版图:


4.1 GS464V微架构
GS464V在32nm工艺下面积为 $6.6mm^2$ ,有两个256比特的向量算术单元,每一个可以执行4个双精度的乘加运算;对外是一个128比特的AXI接口。下图展示了GS464V的物理规划图:


下图展示了GS464V的微架构,和GS464的区别就是浮点单元换成了向量单元,其他流水线都是一样的。


4.2 存储层次
龙芯3B1500 每个GS464V处理器核内有4路组相联64KB的指令缓存,4路组相联64KB的数据缓存,以及4路组相联作为victim缓存的128K的L2缓存;8个GS464V处理器核共享8MB的L3缓存。


下图展示了各级存储测试的延迟:


5. Loongson 3A2000
龙芯3A2000处理器集成了4个四发射乱序执行64位GS464E处理器核,也是首款采用GS464E微结构的处理器。 采用中芯国际40纳米CMOS工艺生产,主频800~1000MHz
GS464E处理器核是GS464的改进版,集成了64KB一级指令缓存,64KB一级数据缓存,256KB二级缓存和4MB三级缓存。流水线从GS464的9级提高到了12级。峰值浮点性能16GFlops。在接口上,龙芯3A200集成了两个HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,72位DDR2/3-1333×2控制器。
5.1 GS464E微架构
通过调研IBM POWER7等处理器,GS464E相比于之前的 GS464 架构, 重点强化了访存性能和分支预测准确率, 实现了 MIPS DSP 指 令集和虚拟机支持, 增大了处理器中各项队列的项数, 并增大了缓存容量和 TLB 容量。访存子系统拥有 3 级缓存结构, 每一级都采用 LRU 替换策略, 可以支持多核缓存一致性协议。下图展示了GS464E的物理规划图,主要由取指单元,寄存器重命名单元,定点单元,浮点单元,访存单元,L2缓存等组成。


与GS464相比,GS464E 处理器核主要更新: 取指单元 取指单元的功能是通过分支预测持续获得指令流, 并进行指令译码. 在 GS464E 处理器核中, 通过重新设计, 消除了分支指令预测跳转后的取指空泡; 通过加入循环缓冲器 (loop buffer), 使得最多 56 条指令组成的循环程序执行时不需访问指令缓存 寄存器重命名 寄存器重命名部件的功能是进行各种寄存器的重命名, 用于动态流水线中的乱序发射。GS464E 处理器核中的寄存器重命名表扩展到 128 项定点物理寄存器和 128 项浮点物理寄存器, 此外, DSP 控制寄存器、HILO 寄存器以及浮点比较结果寄存器都单独进行重命名 指令重定序 指令重定序单元的功能是将乱序发射的指令进行重定序, 并进行分支预测错与指令异常的处理. 指令重定序队列 (reorder queue, ROQ) 从 64 项增大到 128 项; 分支指令队列从 8 项 扩大到 24 项 定点单元 定点单元用于进行定点计算. 在 GS464E 处理器核中, 通过激进的计算结果提前反馈 (forward) 逻辑设计, 存在寄存器数据相关的 2 条定点指令之间的延迟 (load-to-use) 从 2 个时钟周期减少到了 1 个; 此外还加入了数字信号处理 (digital signal processing, DSP) 功能单元 浮点单元 浮点单元用于进行浮点计算. 浮点比较结果寄存器现在可以单独进行重命名, 因此浮点比较以及使用浮点比较结果的指令可以乱序发射和动态流水 访存单元 访存部件用于处理访存指令. 访存指令专用发射队列大小为 32 项, 可以将访存指令乱序发射到 2 个访存功能部件, 每个功能部件均可执行读取 (load) 或存储 (store) 指令; 访存重定序队列的项数从 24 项提升至 64 项. 一级数据缓存采用了 LRU 替换策略, 并将 缓存行大小扩展为 64 字节长. 地址翻译快速查找表 (translation lookaside buffer, TLB) 的项数也有大幅扩充, 采用了 64 项可变大小页外加 1024 项固定大小页的双重 TLB 设计 缓存失效队列 缓存失效队列由指令缓存失效请求与数据缓存失效请求所共用, 用于处理缓存失效并重填缓存行. 在 GS464E 处理器核中, 其项数从 8 项提升至 16 项, 并实现了激进的指令和数据预取引擎, 该预取引擎会根据缓存失效队列中的信息自动生成预取请求, 并通过缓存失效队列来处理这些预取请求. 该预取机制不会导致一级缓存污染 Victim Cache Victim Cache 是片内的第二级缓存, 当一级缓存失效时被查询. 在 GS464E 处理器核中, 其总容量扩大为 256 KB, 相联结构从 8 路组相联改为 16 路组相联, 并采用了 LRU 替换策略, 提高了 Victim Cache 的命中率
下图展示了GS464E的微架构:


5.1.1 取指单元
GS464E的取值单元主要包括L1指令缓存,指令TLB,分支预测器,指令队列和译码单元。下图展示了GS464E的取值单元的流水线:


每个 GS464E 处理器核包含 1 个4 路组相联 64 KB 的指令缓存, 其缓存行大小为 64 字节, 指令缓存的标签和数据部分同时访问并在下一时钟周期进行命中的判断与选择。其中数据部分划分为 8 个bank,每次取指令时只用读取所需要的bank, 降低了缓存访问时的动态功耗。指令缓存使用虚地址索引和实地址标识的索引方案。取指部件的虚实地址转换通过 64 项全相联结构的指令 TLB 完成, 指令 TLB 中的内容是页表的子集。其中, 每项存放 1 个页表项, 每个页表项均可支持 4 KB-1 GB 之间不同大小的页。当指令缓存命中时, 取指部件每个时钟周期最多可以从指令缓存中取出 8 条指令, 并送往下 一个流水级进行分支预测. 而当指令缓存未命中时, 取指部件将生成请求并访问缓存失效队列, 访存失效队列负责进行缓存缺失处理, 并将结果返回给指令缓存。从缓存失效队返回的结果将整体填回指令缓存, 指令缓存最多可容忍 3 个缓存行不命中, 即有 3 个未完成 (outstanding) 的缓存行不命中时, 依旧可以从正确的地址取指令。当取指请求恰好落在从缓存失效队列返回的缓存请求数据上时, 可以直接取出相应指令进入下一个流水级。此 外, 指令缓存的预取由缓存失效队列中的硬件预取引擎统一完成, 不在取指部件中单独进行。指令缓存的数据部分中还包含预译码信息, 每条指令的预译码信息为 8比特大小, 主要用于指令切分、分支类型判定和部分指令例外的判定。预译码信息通过在缓存失效队列重填指令缓存时计算得出, 并存储在指令缓存中。
GS464E 处理器核采用了多种不同的机制来预测分支指令的跳转方向和跳转目标, 并通过分支目标缓冲器 (BrBTB) 来处理分支指令之后取指空泡的情况。分支预测机制在每个时钟周期最多可以处理 4 条分支指令, 但只有最后一条可以是预测为跳转的分支指令, 预测为跳转的分支指令的后续指令将在下一个时钟周期进行处理。GS464E 处理器核采用 3 个时钟周期延迟的 “取指 — 分支” 循环迭代设计, 第 1 个时钟周期 根据程序计数器 (program counter, PC) 的值访问指令缓存 第 2 个时钟周期 指令缓存查询完毕, 取出最多 8 条指令 * 第 3 个时钟周期 逐条解析指令, 预测分支指令的跳转方向和跳转目标, 如果取出的多条指令中存在预测为跳转的分支指令, 则需要根据此类指令中最早的那条来更新 PC 值
由于取出指令并预测出后续指令 PC 需要花费 3 个时钟周期, 其中有 2 个时钟周期无法确保能取出有意义的指令, 为避免性能损失, GS464E 处理器核实现了分支目标缓冲器 (BrBTB), 直接根据取指所使用的 PC 值预测后续指令的 PC 值。如果取出的指令中没有预测为跳转的分支指令, BrBTB 也没有预测出需要跳变的 PC 值, 则取指部件从当前 PC 向后顺序取指令。BrBTB 为 128 项全相联结 构, 使用当前时钟周期的 PC 值来索引下个时钟周期的预测 PC, 在其预测正确的情况下, 即使有需要跳转的分支指令, 取指流水线也不会断流。BrBTB 的功能是根据当前 PC 来预测下一个时钟周期的取指 PC, 用于消除分支指令之后的取指空泡, 但是分支预测工作还是需要解析不同的指令来进行不同处理的。
分支指令跳转方向的预测使用一套组合分支历史表 (BHTs), 包括 1 个 16384 项的全局分支历史表 (global branch history table, GBHT), 1 个 16384 项的局部分支历史表 (local branch history table, LBHT) 和 1 个 16384 项的全局选择历史表 (global branch select table, GSEL)。每个时钟周期取出的最多 8 条指令可以同时查找这套分支历史表,上述 3 个分支历史表中的每项都是 2 bit 饱和计数器, 其最高比特位在 GBHT 和 LBHT 中用于指明跳转方向, 而在 GSEL 中则用于决定选用 GBHT 还是 LBHT 的预测方向。
间接跳转指令的跳转目标预测分为两种情况: 函数返回跳转指令 (MIPS 指令集中的 JR r31 指令) 采用 16 项的返回地址栈 (return address stack, RAS) 进行预测。当分支预测阶段发现函数调用跳转指令时, 将该指令延迟槽之后指令的 PC 值压入 (push) 至 RAS 中。当分支预测阶段发现函数返回跳转指令时, 则弹出 (pop) RAS 栈顶所存放的 PC 值作为跳转目标的预测值。为了防止在错误推测路径上执行对 RAS 栈顶指令或栈顶内容的错误修改, RAS 的栈顶指针和当前栈顶的 PC 值都有其临 时备份, 用于自纠正 除上述函数返回跳转指令之外的的间接跳转指令使用项数为 1024 的跳转目标缓存器 (jump branch target address cache, JBTAC) 进行预测, 该缓存器使用取指 PC 及跳转历史信息进行索引。
当指令被取出后, 会根据预译码信息的指示, 按照不同的指令类型, 分别使用上述 3 种机制中的某 一种机制进行分支预测. 经过分支预测阶段后, 指令被存入大小为 64 项的指令队列中. 在 GS464E 处 理器核中, 基于该指令队列的资源还实现了循环缓冲器 (loop buffer). 循环缓冲器会监测进入指令队列的指令流 PC 特征, 当发现指令流中包含一个不大于 56 条指令的单层循环时, 将停止从指令缓存取指, 而是直接从指令队列中取出指令送到译码阶段. 当循环次数达到并退出循环时, 循环缓冲器会被清空.
译码功能部件在每个时钟周期会从指令队列头部取出 4 条指令进行译码。译码过程的行为较简单, 就是将指令码翻译为方便功能部件处理的内部码, 标识出指令类型、所需要操作的寄存器号以及指令码中可能包含的立即数, 用于接下来的寄存器重命名阶段。
5.1.2 指令分配与提交单元
指令分配与提交单元负责指令在处理器核中的分配与定序, 具体包括寄存器重命名,指令分配,指令发射,指令重定序,指令提交及分支与异常处理这几个功能。
译码后的指令首先进行寄存器重命名, 随后根据操作类型分配至不同的发射队列中。寄存器重命名是动态流水线中进行乱序发射的关键技术, 将为指令中指定的逻辑寄存器各自分配一个物理寄存器。在 GS464E 处理器核中, 需要进行重命名的寄存器有: 通用定点寄存器、通用浮点寄存器、HILO 寄存器、DSP 控制寄存器、浮点比较结果寄存器。这些需要重命名的寄存器各自进行映射, 通过物理寄存器映射表 (physical register map table, PRMT) 来保存物理寄存器和逻辑寄存器之间的关系. 用于通用定点寄存器重命名的为 128 项 64位宽的寄存器堆, 用于通用浮点寄存器重命名的为 128 项 64位宽的寄存器堆, 用于 HILO 寄存器重命名的为 16 项 128位宽的寄存器堆, 用于 DSP 控制寄存器 重命名的为 32 项 32位宽的寄存器堆, 用于浮点比较结果寄存器重命名的为 32 项 32位宽的寄存 器堆。
GS464E 处理器核中有 3 个独立的发射队列: 16 项的定点发射队列,定点发射队列负责源操作数和目标操作数均为通用定点寄存器、HILO 寄存器或 DSP 控制寄存器的运算指令和分支指令 24 项的浮点发射队列,浮点发射队列负责源操作数和目标操作数均为通用浮点寄存器或浮点比较结果寄存器的运算指令和分支指令 * 32 项的访存发射队列,访存发射队列除了负责所有定点,浮点的访存操作指令外, 还包括控制寄存器操作指令 (CP0 指令) 以及在定点与浮点寄存器间交互数据的指令 从控制功耗的角度出发, 3 个发射队列均采用移动指针而非移动队列中存储内容的管理策略, 每 个时钟周期需要计算当前应当发射指令的指针。只有源寄存器都已经就绪的指令才能被发射, 而指令在寄存器重命名阶段时就会先检查其源寄存器是否已经就绪。若其源操作数还没有准备好, 则该指令在进行指令分配以及在发射队列中的时候, 都要将自身的源寄存器号同结果总线或前馈总线的目标寄存器号相互比较, 以确定本条指令所需的源寄存器是否就绪。此时所使用的寄存器号都是经过寄存器重命名后的物理寄存器号。上述的 3 个发射队列都采用乱序发射机制, 指令的所有源操作数只要准备好就可以发射。当存在多个发射候选时, 最早进入的指令具有最高的优先级。
在 GS464E 处理器核中, 指令被顺序译码和重命名,乱序发射和执行, 但是要有序提交。重定序队列负责指令的有序结束, 它从寄存器重命名模块获取程序指令序信息, 并有序地保存流水线中所有已经完成寄存器重命名但未提交的指令。指令在功能单元执行完毕并写回 (writeback) 后, 重定序队列按照程序指令序顺序提交这些指令。重定序队列最多可同时容纳 128 条指令。重定序队列每个时钟周期最多可以提交队列顶端的 4 条已经处于写回状态的指令。指令的提交信息会送往寄存器重命名模块, 用于修改重命名的状态, 同时还需要通知访存重定序队列, 因为存储指令需要提交后才能修改存储器的内容。GS464E 处理器核实现了精确异常, 当取指令,译码或执行时发生异常时, 异常信息被送至重定序队列保存下来, 只有异常指令成为重定序队列头时, 才进行异常报告与处理。硬件进行的异常处理工作包括: 将异常原因、异常指令的 PC 值等信息记录到有关的 CP0 寄存器中, 并根据异常类型把异常处理程序的入口地址送到程序计数器中。
分支指令在寄存器重命名后进入重定序队列和发射队列的同时还会顺序地进入分支指令队列。GS464E 处理器核中的分支指令队列最多可以容纳 24 条分支指令, 该队列会记录分支指令进行分支预测时的预测结果。分支指令和其他指令一样都需要在功能部件执行, 但是其结果总线额外包含分支结果, 分支结果会写回到分支指令队列。这些结果包括 JR 和 JALR 指令的目标地址, 以及条件转移指令的转移方向, 利用这些结果可以判断这条指令的分支预测是否准确. 不论预测成功与否, 分支指令的执行结果都会反馈到取指部件, 用于修正相关的分支预测器, 以帮助后续分支指令的预测。预测错误的分支指令和在它之后取进来的指令都需要取消。分支指令队列负责发送分支错误取消总线, 根据队列中记录的程序指令序, 准确地进行分支取消操作, 同时将正确的 PC 值送到程序计数 器中。
5.1.3 定点单元和浮点单元
GS464E 处理器核中的定点单元包含 1 个多端口定点寄存器堆以及 2 个完全相同的定点运算单元。定点寄存器堆共 128 项, 一共有 8 个读端口和 4 个写端口。每条定点运算流水线中均包含: 用于 执行定点加、减、比较、陷阱指令的算术逻辑单元 (arithmetic logic unit, ALU), 用于执行移位、循环 移位和比特提取与截断指令的循环桶形移位器, 位操作单元, 前导零计数器, 分支处理单元, 除法部件和乘法器, 每种运算单元的数量均为 1 个。所有频繁执行的指令均在 1 个时钟周期内执行完毕, 且通过激进的前馈机制设计, 使得存在寄存器相关的多条指令可以背靠背连续发射。乘法器采用全流水设计, 可进行 64x64有符号或无符号乘法运算, 运算延迟为 3 个时钟周期, 全流水设计使得每个乘法器在每个时钟周期都可接受 1 条新的指令, 并产生 128比特的乘积结果。
GS464E 处理器核中的浮点部件包含 1 个多端口浮点寄存器堆以及 2 个完全相同的浮点运算单元。浮点多端口寄存器堆共 128 项, 一共有 8 个读端口和 4 个写端口。每条浮点运算流水线中均包含: 格式转换单元 (用于执行 “定点转为浮点”,“单精度浮点转为双精度浮点” 这类格式转换指令), 浮点比较单元, 浮点除法单元, 浮点开方与求倒数单元, 以及浮点乘加 (fused multiply–add) 单元 (用于执行浮点加、减、乘、乘加、乘减指令), 每种运算单元的数量均为 1 个。其中格式转换单元采用 3 级全流水设计, 浮点乘加单元采用 4 级全流水设计。
5.1.4 访存单元
访存部件包含以下的子部件: 访存指令发射队列 mmqueue,访存专用定点寄存器堆 mr,两个访存地址生成部件 memaddr, 一级数据缓存,一级数据 TLB ,两 个访存标签比较部件 dtagcmp、访存重定序队列 cp0queue, 以及二级 TLB 部件 sec tlb。只有一份的子部件由两条访存流水线共享使用。下图展示了访存单元流水线:


访存指令发射队列 mmqueue 接收寄存器重命名部件送来的指令信息, 并将当前已经就绪且 程序指令序上最老的访存指令发射到访存流水线上。大部分访存指令都可以在两个访存部件中的任意一个执行, 存储操作和加载操作一样, 会等待地址和数据同时就绪后, 才发射到流水线中。两条访存流水线在拥有 4 个读端口的寄存器堆 mr 中读取所需的操作数; 一些特殊指令需要发送额外请求去定点部件或浮点部件, 以获取所需的源数据, 例如, 浮点存储指令 SDC1 所需要存储的数据只存放在浮点寄存器堆中。所有类型的访存指令的地址肯定会存放在 mr 中, 不需要从定点部件或浮点部件取。两条访存流水线分别拥有一个地址计算模块 memaddr,地址计算模块根据访存指令的类型, 利用 mr 读出的寄存器内容计算访存指令的虚拟地址 (effective address, EA 或虚地址)。虚地址低位送到数据缓存模块进行索引查找, 整个虚地址送到 DTLB 模块进行虚实地址翻译。 一级数据缓存是由 4 路组相联、每一路 16 KB 大小的双端口随机存储器 (random access memory, RAM) 构成的, 两个端口分别对应一条访存流水线。每个端口根据地址的低位读取 RAM 中存放的标签和数据, 并将读出的结果送至 dtagcmp 部件准备进行标签比较。同时, 存储指令需要存储的数据在此单元计算, 同样也送到 dtagcmp 部件。一级数据 TLB 与一级数据缓存同时被查询。一级数据 TLB 部件使用 2 个 64比特虚地址作为输入, 查询双端口的全相联组织的 DTLB, 得到 2 条访存指令的虚地址所对应的 48比特物理地址 (physical address, PA 或实地址), 并送至 dtagcmp 模块准备进行标签比较。此外, 大部分 CP0 相关的特权指令, 如 MTC0 及 MFC0 都是在 DTLB 模块执行的。两个实地址比较模块 dtagcmp 模块分别对应一条访存流水线。这个模块将数据缓存模块读出的 4 路标签与 DTLB 模块得到的实地址进行比较, 确定一级数据缓存是否命中, 以及命中在哪一路。命中路的数据会被取出, 和数据送来的 存储指令所要存储的数据一起计算, 得到访存指令的执行结果, 并送到访存重定序队列 cp0queue。访存重定序队列 cp0queue 接收程序指令序信息, 接收 dtagcmp 模块送来的指令地址与数据信 息, 并通过回滚机制来维护乱序发射的访存指令之间的正确执行序。Cp0queue 除了访存指令重定序工作之外, 在每个时钟周期还需要写回最多 2 条可写回的 加载指令和 最多 2 条可写回的存储指令,将最多 1 条访存失效的指令送往缓存失效队列,将最多 2 条已经提交 且被允许写一级数据缓存的存储指令发送到一级数据缓存的写端口。Cp0queue 可以被视作访存指令的归宿, 所有访存指令都在这里进行缓存失效处理和写回。目标寄存器为定点寄存器的加载类型访存指令在从数据缓存流水级到 dtagcmp 流水级传递时, 会进行猜测提前反馈操作, 称为 specfwd。在从 dtagcmp 流水级到 cp0queue 传递时, 会重新发送上一 个时钟周期的 specfwd 信息, 形成 fwdbus 总线。两条访存总线的最多 4 条用于提前反馈的信息会被 送至定点发射队列和访存发射队列, 并置猜测就绪标记, 使得指令可以猜测地发射。如果猜测前馈猜测错误, 则会发送对应该访存流水线的猜测取消信号 spec cancel, 猜测错误的条件包括: 一级数据缓存未命中,或者一级 DTLB 未命中,或者该指令在 cp0queue 被回滚。猜测取消信号将会取消对应的 specfwd 以及 fwdbus 总线带来的所有后果, 已经猜测发射的相应指令也会被取消, 并回到发射队列重新等待发射机会。在上述 前馈机制的作用下, 可以得知访存指令在理想情况下的延迟: 访存指令到定点指令以及访存指令到访存指令的 load-to-use 延迟为 4 个时钟周期, 访存指令到浮点指令的 load-to-use 延迟 为 6 个时钟周期。
访存重定序机制是用于维护乱序发射的访存指令之间执行顺序的机制。在之前的 GS464 处理器核设计中, 访存重定序采取的是数据传递机制, 使用数据传递机制进行访存指令重定序的方法为: 当一条指令经过发射路径到达重定序队列时, 这条指令需要从所有执行序在它之前的,与其相关的存储指令处获取对应数据; 同时, 如果这条指令是存储指令, 那么这条指令还要将它自己的数据传递给所有的已经在重定序队列中与其相关的且执行序在它后面的指令。简单说来, 该机制可以描述成 “取前给后”。在物理设计上, 实现这样的数据传递机制代价很大: 该指令可能从多条指令处取得数据, 可能从任意指令处拿取任意字节的数据; 存储指令可能把自己的数据传递给多条指令, 可能将数据传递给任意指令的任意字节位置。这个机制的物理设计过于复杂, 严重限制了队列的规模, 致使 GS464 处理器核中的访存重定序队列只有 24 项大小。 在 GS464E 处理器核中实现了 2 个访存功能单元, 同一时刻可能有 2 条指令进入访存重定序队列, 数据传递机制的实现代价更是难以接受。为了提高指令并行度,将访存重定序队列项数增大, 在 GS464E 处理器核中, 只保留了指令是否相关的判断, 取消了数据传递的功能, 通过指令回滚到发射队列重新发射的机制来保证执行的正确性。其具体操作方式如下所述: 当一条指令经过发射路径到达重定序队列时, 发现队列中有执行序在它之前的与其相关的存储指令, 那么该指令回滚到访存发射队列 mmqueue, 并等待该存储指令写入一级数据 缓存后再次发射; 如果一条存储指令经过发射路径到达重定序队列时, 发现队列中已有执行序在它之后的与其相关的指令, 那么将这些指令回滚到 mmqueue, 让这些指令重新发射。其中, 指令相关的判断会根据指令的操作类型,访存地址等信息进行精确的判断, 例如, 对 A 地址的半字存储 SH 操作并不会使得对 A+2 地址的半字取 LH 操作回滚。简单说来, 该机制可以描述为 “等前打后”。通过采取 “等前打后” 的访存重定序策略来代替 “取前给后” 的策略, 略增加了发射队列和访存重定序队列的设计复杂度, 在一些情况下会带来少许性能降低, 但是却大大降低了物理设计的难度, 可以在同样的设计主频下使用更大的访存重定序队列, 增加访存指令并行度, 可以更好的容忍访存延迟。同时, 也为支持更大的访存宽度, 如 256比特向量访存指令, 提供了可能性。
GS464E 处理器核中的一级数据缓存采取 4 路组相联结构, 总大小为 64 KB。其中, 每一路大小为 16 KB, 分为 256 个缓存行, 每一行为 64 字节。一级数据缓存使用虚地址索引, 实地址标识, 每一个缓存行需要 48比特的标签来存储实地址信息, 以及 512比特的数据来存储数据, 标签和数据部分都使用 ECC 校验码来进行冗余保护。一级数据缓存采用 LRU 替换策略, 当一个缓存行被查询命中时, 或因缓存失效而被新填入时, 会被调整到最难被替换的优先级; 如果一个缓存行因多核一致性导致的外部请求被无效, 该缓存行会被调整至最容易被替换的优先级。一级数据缓存是一个双端口的缓存结构, 每一个时刻最多可以实现 2 条访存指令的查询操作;同时, 存储指令从访存重定序队列发出写缓存操作时, 也通过这 2 个端口进行写操作, 其优先级低于访存指令的查询操作。除此之外, ECC 校验出错时的自纠正操作和缓存失效重填请求都需要从第一个写端口进行写入, 写入操作将按照特定优先级进行, 并对低优先级的操作产生阻塞。
虚实地址翻译工作在硬件实现上是由两级 TLB 来完成的。一级数据 TLB 对软件透明, 每次访存操作执行时被查询; 软件可见的是二级 TLB, 软件修改 TLB 的指令 (如 TLBWR) 会直接修改二级 TLB。 二级 TLB 对一级数据 TLB 是包含关系, 一级数据 TLB 的缺失会自动从二级 TLB 中查找并取 回, 硬件会自动维护包含关系。 此外, 指令 TLB 也是根据二级 TLB 中的内容填入的。 一级数据 TLB 的规模为 32 项, 二级 TLB 则是由 2 个部分组成, 包括 64 项全相联的可变页大小的地址可寻址存储器 (content addressable memory, CAM) 部分, 以及 8 路组相联,每一路 128 项, 共计 1024 项的固定页大小的 RAM 部分, 这两级 TLB 中的每一项都可以装载 1 个标准 MIPS 双页。一 级数据 TLB 是双端口的, 分别对应于 2 个访存功能部件, 一级 TLB 查询发生不命中时, 会选择在程序指令序上较老的那条指令来查询只有 1 个端口的二级 TLB。二级 TLB 查询需要花费 2 个时钟周期, 如果命中, 那么命中的结果会写入一级数据 TLB, 其替换策略为随机替换; 如果未命中, 其结果也会通知访存重定序队列。需要查询二级 TLB 的指令经过访存重定序队列中的回滚机制, 重新回到发射队列, 再次发射时, 二级 TLB 的查询结果已经返回, 因此可以判断是否真正的发生了 TLB 失效异常。 二级 TLB 中可变页部分 (CAM 部分) 和固定页部分 (RAM 部分) 会被同时查询, 但是软件进行 TLB 写入时, 只有其中一个会被修改: 如果写入项的页大小与提前配置好的固定页相同, 则 TLB 指令 会将 TLB 表项写入固定页部分, 否则, 将写入可变页部分。 64 项的 CAM 部分和 8 路组相联的 RAM 部分都采用随机替换策略。
GS464E 处理器核的一级数据缓存是一个写回 (writeback) 式的缓存, 所有的存储操作都需要对一级数据缓存进行写入。 当存储指令发生缓存失效时, 需要将存储指令所需的缓存行从内存搬运至一级数据缓存, 再进行写入。然而在很多情况下, 存储指令都倾向于填满整个缓存行, 因此这个搬运过程就显得多余, 还带来了不少的时间与功耗开销。 为了降低这个开销, GS464E 处理器核中引入了存储填充 (store fill) 机制。该机制的工作原理为: 当存储指令在一级数据缓存中发生缓存失效时, 其访存失效请求会将待存储的数据一并送至位于缓存失效队列中的存储填充缓冲区, 同时, 该访存失效请求暂缓访问 SCache。如果接下来的多条存储请求在该缓冲区中成功地拼满了缓存行, 那么只需向 SCache 请求空白的缓存行即可。收到空白行请求的 SCache 不会访问内存, 在进行多核一致性处理后直接返回, 缓存失效队列负责将缓冲区中拼满的数据重填回一级数据缓存。在存储填充进行期间, 相应的存储指令可以退出流水线, 释放队列空间。如果较长时间没有拼满一个缓存行, 或遇到了属于同一个缓存行的加载操作, 或遇到内存屏障类操作 (如 SYNC 或 CACHE 指令), 存储填充机制就会进行退出处理, 向 SCache 请求一个正常的缓存行, 待结果返回后, 在缓冲区进行数据拼凑操作, 将拼凑后的结果填回一级数据缓存。 硬件会记录存储填充成功与否的近期历史, 并对存储填充机制进行自动调整。 GS464E 处理器核中实现的存储填充机制可以适用于多核处理器的情况, 减少了存储指令导致的内存读取, 并允许存储指令提前退出流水线, 提升了处理器的整体执行性能。
5.1.5 缓存失效队列
缓存失效队列位于一级缓存与 SCache 之间, 负责对 Victim Cache 进行访问和管理, 实现缓存失效请求的处理和重填工作, 并负责硬件预取请求的生成和处理。 在 GS464E 处理器设计中, 对缓存失效的处理过程进行了多项创新性的改动, 包括基于缓存失效队列的无污染硬件预取引擎设计以及可以支持多核情况的存储填充机制。
缓存失效队列共有 16 项, 进入该队列的请求包括访存重定序队列发来的访存失效请求、取指部件发来的指令失效请求以及 SCache 发来的多核一致性请求, 此外, 硬件预取引擎会将生成的数据和指令预取请求也送给缓存失效队列, 由该队列进行处理。所有进队请求的地址均为实地址。缓存失效队列中的缓存失效请求会先查询 Victim Cache, 如果命中, 则会将结果重填回一级缓存, 并将一级缓存替换出的缓存行填入 Victim Cache 中之前被取出的位置; 如果 Victim Cache 查询未命中, 则会访问 SCache, 待 SCache 的结果返回后, 填入一级缓存, 将一级缓存替换出的有效数据根据 LRU 算法写入 Victim Cache, 并将 Victim Cache 替换出的有效脏数据写回到 SCache。 缓存失效请求总是会先查询 Victim Cache, 查询未命中时再查询 SCache, 这种串行访问的设计降低了缓存一致性维护的复杂度。缓存失效队列中由 SCache 发来的多核一致性请求会对一级缓存和 Victim Cache 进行查询, 根据查询结果和一致性请求的类型, 对缓存行进行无效、写回等操作, 并将结果返回 SCache。缓存失效队列中的硬件预取请求会对 SCache 进行查询, 根据查询结果, 将预取来的数据暂存在队列中。如果有缓存失效请求和硬件预取请求操作同一个缓存行, 那么预取到的数据会发送给这个缓存失效请求。缓存失效队列会定期清除掉那些一直没有被使用到的预取数据。这样的预取处理方式不会带来任何一级缓存污染。请求同一个缓存行的缓存失效操作会在缓存失效队列中进行合并, 但只限于同属于数据缓存失效或指令缓存失效。缓存失效队列还有专门的缓冲区用于存储访存失效存储指令的数据, 以支持存储填充机制。
GS464E 处理器核中使用了最多同时支持 4 个数据访问流和 1 个指令访问流的流式硬件预取引擎, 数据和指令的预取相对独立。 其中, 数据流式预取引擎可以支持升序和降序模式, 使用访存失效请求来建立和维护访问流信息; 而指令预取只能支持升序的预取, 使用指令失效请求来建立和维护流信 息。 当失效请求为连续的 2 个缓存行时, 将会建立访问流, 每个访问流都配有 3比特的倒数计数器, 用于计算这个访问流是否已过期。缓存失效请求如果在某个访问流上延续, 那么配属于这个访问流的计数器会刷新到最大值。访问流建立后, 就可以触发预取, 预取请求的触发包括下列两种情况. 如果缓存失效请求在缓存失效队列中和预取请求合并, 证明预取是有益的, 将会根据此次失效的地址查询预取引擎中已经建立的访问流信息。指令失效请求会查询指令预取引擎, 而访存失效请求会查询数据预取引擎。如果访问流查询命中, 则根据访问流的升序或降序信息, 产生 1 个预取请求, 预取请求的地址是失效地址加上特定增量; 如果访问流查询不命中, 则寻找计数器为零或计数器最小的访问流, 将其顶替。如果未能和预取请求合并的缓存失效请求在 Victim Cache 中查询未命中, 则证明需要进行预取, 此时会根据此次失效的地址查询预取引擎中的访问流信息, 如果访问流信息查询命中, 则根据访问流的升序或降序信息, 产生预取请求, 预取请求地址是失效地址加上特定增量; 访问流查询未命中则不进行操作。每次触发预取时, 预取地址相对于失效地址的增量会随着这个访问流的历史触发次数而变化, 被触发过的次数越多, 其预取增量越大。这个增量值的上限则由已建立的访问流的个数决定: 当只有 1 个访问流存在时, 增量上限被设定为 4 个缓存行大小; 当超过 1 个访问流时, 该增量被设定为 2 个缓存行大小,指令预取的增量上限一直设定为 4 个缓存行。GS464E 处理器核使用增量预取策略, 相对于每次触发就预取多条的策略, 在访问流预测正确的情况下效果是相同的, 但是访问流预测错误时, 增量预取策略会少一些无效的预取请求。
缓存
GS464E 处理器核使用了三级片上缓存结构, 其中位于每个处理器核内部的私有缓存包括一级数据缓存和一级指令缓存, 以及数据和指令共用的 Victim Cache, 第三级缓存为 SCache, 由所有处理器核共享。一级指令缓存为 4 路组相联设计, 64 KB 容量, 缓存行大小64 字节, 随机替换。一级数据缓存采用 LRU 替换策略,4 路组相联设计, 64 KB 容量, 缓存行大小64 字节。 Victim Cache 与两个一级缓存是exclusive关系, 处于一级缓存中的缓存行必定不存在于 Victim Cache 中; Victim Cache 与 SCache 维护包含 (inclusive) 关系, 也即处于 Victim Cache 中的缓存行必定在 SCache 中有其对应的备份。一级缓存和 SCache 是Inclusive关系。
Victim Cache 为 16 路组相联, 每一路 16 KB, 共计 256 KB, 缓存行大小为 64 字节, 使用 LRU 替换策略。Victim Cache 位于一级缓存之下, 由缓存失效队列进行管理, 当一级缓存发生缓存失效时被查询。 查询 Victim Cache 时, 先读取标签再读取命中路的数据的方式, 使用少量延迟来换取功耗的降低。 在缓存失效请求查询 Victim Cache 未命中情况下, 由缓存失效队列负责向 SCache 发出失效请求. 当一个缓存行从一级缓存中替换出来时, 会被填入 Victim Cache, 而 Victim Cache 替换出的数据将会写回到 SCache。 指令缓存行与数据缓存行都可以存放在 Victim Cache 中, 以缓存行标签域中的一个额外比特来做区分。
SCache 为片上末级缓存, 由所有处理器核共享, 一个四核处理器就会拥有 4 个 SCache 以 供 4 个处理器核使用。每个 SCache 为 16 路组相联, 容量为 1 MB, 缓存行大小为 64 字节, 使用 LRU 替换算法。 每个 SCache 使用大小为 16 项的管理队列来查询和维护. 相比于一级缓存和 Victim Cache, 每个 SCache 的缓存行还额外包含 64比特的目录域, 用于记录该 缓存行被哪个处理器核持有, 以及被处理器核持有的是指令行还是数据行。在这个目录的设计规模下, 最多支持一个芯片集成 32 个处理器核. 在区分数据行和指令行之外, SCache 并不区分一级缓存和 Victim Cache, 因此一级数据缓存持有的缓存行或 Victim Cache 持有的数据缓存行都会被视作该处理器核持有数据缓存行。在 GS464E 处理器核配属的 SCache 中, 加入了基于缓存一致性的硬件抗别名设计。当程序使用的页的大小比一级缓存中每个缓存路的容量更小的情况下, 就会出现别名的情况, 同一个物理地址会被放置在一级缓存中的多个索引上。为了保证映射到同一个物理地址的多个虚地址之间的数据是一致的, SCache 在标签域中加入了额外的 2比特的页染色域, 利用 SCache 对片内两级缓存的包含关系, 保证这个缓存行只能存在于满足当前页染色域的特定索引位置上。当一个访存请求要求页染色域的另一个值时, 会发生缓存失效, SCache 发现该请求页染色不命中之后, 会通过一致性请求, 写回并无效处于一级缓存或 Victim Cache 之中的缓存行备份, 修改页染色域的值为新值后, 再行返回, 以此保证每个物理地址只对应一个实例。基于缓存一致性的硬件抗别名设计是 GS464E 处理器核的创新性功能, 在保持一级缓存大容量的前提下, 实现了对较小页的高效硬件支持。SCache 中还为使用原子操作指令 (例如, LL/SC 指令) 进行多核的同步加入了特殊设计: 当一个 处理器核使用原子操作指令获得一个缓存行时, SCache 在短时间内将禁止把这个缓存行转让给其他处理器核。该时间间隔为随机数, 随机的范围可以通过软件进行配置。通过上述设计, 多个处理器核同时争抢同一个内存地址时, 可以在时间上串行开来, 减少了竞争。这个特殊设计可以提高多核同步的性能, 并可以防止因每个处理器核都占有时间过短,无法修改共享数据而导致的活锁现象。在 SCache 中查询失效的请求会向下一级存储设备发出访存请求。下一级存储设备包括内存, PCI, SPI 或其他外部设备。
在一级数据缓存命中的加载指令延迟为 4 个时钟周期;在 Victim Cache 命中, 则会给这条访存指令带来额外 18 个时钟周期的延迟;如果是 Victim Cache 也失效但是在 SCache 中命中的访存指令, 相比一级缓存命中的情况要多 50 个时钟周期的延迟, 其中访问 SCache 需要的时间为 11 个时钟周期, 其他延迟包括请求在片内传递的延迟, 以及为支持处理器核降频设计所需要的异步队列所带来的延迟。
6 Loongson 3A3000
龙芯 3A3000/3B3000主频 1.2Hz–1.5GHz,为4核处理器,采用4个四发射乱序执行的64 位超标量处理器核GS464E,支持 MIPS64 指令集,支持龙芯扩展指令集,采用12 级超标量流水线; 每核有2 个定点单元、2 个浮点单元和 2 个访存单元。每个处理器核包含 64KB 私有一级指令缓存和 64KB 私有一级数据缓存;每个处理器包含 256KB 私有二级缓存;所有处理器核共享 8MB 三级缓存。
和龙芯3A2000相比,除了流片工艺从中芯国际的40纳米提升到意法半导体的28纳米CMOS 工艺,处理器的三级缓存也从4MB提高到8MB。峰值浮点性能24GFlops,典型功耗 <40W@1.5GHz。集成的接口有两个HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,两个72位DDR2/3-1600,支持ECC。
7 Loongson 3A4000
龙芯3A4000采用龙芯最新研发的GS464V,尽管龙芯3A4000仍然采用28nm工艺, 但主频提高到2.0GHz, 综合性能是上一代龙芯3A3000的两倍。用于片间互连及连接桥片的HT控制器带宽提高一倍以上,内存控制器从DDR3升级到DDR4,对虚拟机支持更加完善,效率达到95%以上。龙芯3A4000/3B4000也是首次在片内集成漏洞防范设计、硬件国密算法、安全可信模块与安全访问控制机制的处理器。龙芯3B4000在龙芯3A4000的基础上支持多路互连。


8 Loongson 3A5000
龙芯3A5000采用和龙芯3A4000的处理器同样的GS464EV, 采用12nm工艺流片, 主频提升到2.5GHz。龙芯3A5000依然是4核处理器,而龙芯3C5000将是一款16核处理器。龙芯3A5000/3B5000是面向个人计算机、服务器等信息化领域的通用处理器,基于龙芯自主指令系统LoongArch的LA464微结构的四核处理器,在与龙芯3A4000处理器保持引脚兼容的基础上,频率提升至2.5GHz,功耗降低30%以上,性能提升50%以上。龙芯3B5000在龙芯3A5000的基础上在HT0接口上支持一致性互联以便支持多路互连。下图展示了其芯片架构:


第一级互联采用5x5的交叉开关,用于4个处理器核,4个共享缓存模块和一个IO端口的连接。第二级互联采用5x3的交叉开关,连接4个共享的缓存模块,两个内存控制器和一个IO端口。IO环总线一共8个端口,分别连接4个HT控制器,慢速输入输出模块,安全模块以及两级交叉开关。两个HT控制器共用16条HT总线,可以作为两个8位HT或一个16位HT使用。
上述互联结构都采用读写分离的数据通道,位宽128比特,与处理器同频;处理器核和第一级交叉开关读通道是256比特。
下图展示了龙芯3A5000的物理规划版图:


8.1 LA464处理器核
LA464是一个4发射的超标量处理器,有4个定点单元,2个256位的向量单元和2个访存单元。每个向量单元支持8个单精度或4个双精度乘加运算;访存单元支持256位存储访问.下图展示了LA464处理器核的微架构:


8.1.1 共享缓存
Scache模块是龙芯3A5000内部所有处理器核共享的L3缓存,采用16路组相联,由缓存管理模块和缓存访问模块组成: 缓存管理模块 负责处理来自处理器和DMA的访问请求 缓存访问模块 负责存放缓存标签,目录和数据
8.1.2 SMP互联
通过HT进行互联可以组成2路,4路,8路或16路SMP系统,整个系统物理地址宽度为48位,地址高4位用来识别单个节点,每个节点实际可用地址空间是44位。当系统节点数目不足16时,需要配置路由设置寄存器,保证没有对应节点的地址能够返回响应。
9 Loongson 3A6000
龙芯3A6000处理器是龙芯第四代微架构的首款产品,集成4个最新研发的高性能6发射64位LA664处理器核。主频达到2.5GHz,支持128位向量处理扩展指令(LSX)和256位高级向量处理扩展指令(LASX),支持同时多线程技术(SMT2),全芯片共8个逻辑核。龙芯3A6000片内集成双通道DDR4-3200控制器,集成安全可信模块,可提供安全启动方案和国密(SM2、SM3、SM4等)应用支持。和3A5000相比,主要是更新了处理器内核,芯片整体架构如下图所示:


第一级互连采用 5x5 的交叉开关,用于连接四个处理器核、四个共享 Cache 模块、以及一个 IO 端口连接 IO-RING。 第二级互连采用 5x3 的交叉开关,连接 4 个共享 Cache 模块,两个 DDR4 内存控制器、 以及一个 IO 端口连接 IO-RING。 IO-RING 包含多个端口,连接包括 HT 控制器,MISC 模块,SE 模块与两级交叉开关。HT 控制器内集成一个 DMA 控制器,DMA 控制器负责 IO 的 DMA 控制并负责片间一致性的维护。 上述互连结构都采用读写分离的数据通道,数据通道宽度为 128 位,工作在与处理器 核相同的频率,用以提供高速的片上数据传输。此外,一级交叉开关连接 4 个处理器核与 scache 的读数据通道为 256 位,以提高片内处理器核访问 scache 的读带宽。
SCache 模块是龙芯 3A6000 处理器内部所有处理器核所共享的三级缓存。SCache 模块支持16 项缓存访问队列,采用 16 路组相联结构,支持 ECC 校验。 共 享缓存模 块包括共享 缓存管理模块scachemanage 及共享缓存访问模块scacheaccess。Scachemanage 模块负责处理器来自处理器和 DMA 的访问请求,而共享缓存的标签、目录和数据等信息存放在 scacheaccess 模块中。为降低功耗,共享缓存的标签、 目录和数据可以分开访问,共享 缓存状态位、w 位与标签一起存储,标签存放在 TAG RAM 中,目录存放在 DIR RAM 中,数据存放在 DATA RAM 中。失效请求访问共享缓存,同时读出所有路的标签、目录,并根据 标签来选出目录,并根据命中情况读取数据。替换请求、重 填请求和写回请求只操作一路的 标签、目录和数据。
LA664 是六发射 64 位的处理器核。在龙芯 3A6000 中的多个 LA664 核以及共享缓存模块通过 AXI 互连网络形成一个分布式共享片上末级缓存的多核结构。LA664 支持同时多线程技术(SMT2);有四个定点、四个向量、四个访存单元;每个向量单元宽度为 256 位,最多支持 8 个单精度或 4 个双精度乘加运算; 访存单元支持 256 位存储访问,虚地址为 64 位,物理地址为 48 位;一级指令缓存和数据缓存大小各为 64KB,4 路组相联; Victim Cache 作为私有二级缓存,大小为 256KB,16 路组相连; 一级缓存实现奇偶校验,二级、片上末级缓存实现 ECC 校验,均支持一位纠正。
参考文献LoongArch-Vol1-v1.02Loongson 3A5000/3B5000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.Wang H., Wang W., Wu R., Hu W., 2015. 龙芯GS464E处理器核架构设计. Sci. Sin.-Inf. 45, 480–500. https://doi.org/10.1360/N112014-00292Hu, 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.30W. 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.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.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-3Hu W W, Tang Z M. Microarchitecture design of the Godson1 Processor. Chinese Journal of Computers, April 2003, 26(4): 385-396.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.Loongson 3A6000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.
看报道没用,正好今年6月还参加一个相关比赛,就是基于龙芯开发,再多信息不便透露。
我们拿到的机器是号称最新技术的龙芯3a3000
4核心,搭配8g内存,500g固态…


bios里面看到是这样的…
说说我们使用默认系统的体验。默认系统是中标麒麟桌面版,后面由于docker需要内核一个关于内存的调度支持换成服务器版本。对于系统ui交互等不多做评价。
仅仅对于性能,具体压测我们没测极限,在jvm跑我们项目,当然还未经专门优化时,gui就会产生肉眼可见的卡顿。同时cpu占用几乎飙满。
当然我也做了专门的性能测试,自带的性能测试结果显示,跑fpu与斐波那契基本与赛扬m一致…




所以就这个性能根本没办法满足目前多数的需求,可能能满足的也就是基础的文字处理事务提交等…
但稍微重一点的需求就无能为力,这就会面临消费者不买单的情况…毕竟你不会希望自己在9012年买的电脑干10年前电脑干的活…
更何况还有系统差距在。
国产化,任重而道远。但作为一个合格的开发者永远不希望用户为“爱国”买单。
[收藏本文] 【下载本文】
   数码 最新文章
什么样的朋友圈很有吸引力?
自刻的光盘最多可以保存多少年?
hdmi 接口标准是不是要被抛弃了?
一台当下最顶尖的电脑能用几年?
如果手机不慎丢失,微信支付宝绑定的银行卡
哪些特征一看是老小米用户?
小米被嘲笑没有核心技术,你怎么看?
深圳推出全国首个共享充电宝行业自律公约,
如何看待华为研发投入超越三星大众,跃居全
海信新品 E5N Pro,有哪些配置上的亮点?是
上一篇文章      下一篇文章      查看所有文章
加:2024-01-18 14:33:19  更:2024-01-18 14:59:16 
 
娱乐生活: 电影票房 娱乐圈 娱乐 弱智 火研 中华城市 印度 仙家 六爻 佛门 风水 古钱币交流专用 钓鱼 双色球 航空母舰 网球 乒乓球 中国女排 足球 nba 中超 跑步 象棋 体操 戒色 上海男科 80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联
  网站联系: qq:121756557 email:121756557@qq.com  知识库