去年8月,在“2020年CCF全国计算机体系结构学术年会”在线会议报告中,龙芯中科的胡伟武老师讲解了龙芯自主设计的CPU指令集——LoongArch,许多业内人士和国产CPU爱好者都非常关注。
2021年4月15日,经过大半年的等待,在山西太原举办的“2021年信息技术应用创新论坛”主论坛上,这款备受期待的CPU指令集终于正式发布。
从2020年二季度开始,龙芯与国内第三方知名知识产权评估机构投入上百人月,将LoongArch与ALPHA、ARM、MIPS、POWER、RISC-V、X86等国际上主要指令系统有关资料和几万件专利进行了深入的对比分析。针对被评估的基础架构版本,评估机构确认了三个结论:
CPU指令集也叫“架构”,它介于软件与CPU逻辑电路之间,是对CPU功能及调用方法的精确描述,设计基于某种指令集的CPU 就是设计逻辑电路去实现指令集规范中描述的功能,CPU的逻辑电路名叫“微架构”。编写汇编程序以及编译高级语言源代码,产生的是面向某种指令集规范的二进制操作码,每条操作码对应指令集中的一条指令。因此系统及应用软件针对不同指令集的版本,就只能在相同指令集的CPU上才能运行。Java/.net和脚本程序虽然不限定指令集,但它们依赖的Java/.net虚拟机和脚本解释器,也仍然是以二进制程序的方式存在,不同指令集的CPU就需要不同版本的二进制程序。操作系统和应用软件以及各种硬件的驱动程序都与指令集深度捆绑,围绕各种指令集构成相互依存的生态关系。虽然软件可能会有多个版本去兼容不同指令集,但每种指令集的生态都各自独立。X86和Windows、ARM和Android借助生态链中所有企业的合力,分别成就了桌面计算机和移动设备领域的霸主地位,掌控这两种指令集的Intel和ARM也因此在生态中具有无上的权力,对依赖其生态的任何企业,都能够一言决兴衰、二言定存亡。
国内大多数CPU企业,为了追逐短暂的市场优势,而去依附现成的主流生态,无论是购买流行指令集的授权还是购买成熟的IP(硅知识产权,例如设计完成的CPU核心),都是主动地给自己脖子上套上绳索,把自己的命运交托到对手的手里。自主与兼容是对立的关系,依附于美国主导的生态,也就丧失了自主的权利,无论为了维持美国的霸权还是企业自己的利益,Intel和微软、ARM和Google随时都会收紧这些企业脖子上的绳套,而这些企业对其生态的贡献却只会让绳索更加结实,更加沉重,更加身不由己。无论何种商业合同,都可以因为触犯某种“法律”而瞬间失效,当前的国际环境下美国玩出任何花样都不稀奇。为了保障我国核心领域信息安全,也为了给整个信息技术行业兜底,龙芯中科与合作伙伴们一直在为建设不受美国干扰的自主生态而努力,取得了斐然的成绩。龙芯基于MIPS指令集扩展的LoongISA指令集完成了独立的基础生态,在政企办公和行业应用中显现了优势,但陈旧的MIPS基础指令难以适应CPU理论和技术的进步,已经难以承载越来越丰富的应用。再加上中美关系的变化,永久授权也存在危机,于是龙芯在两年前立项,开始设计全新的自主CPU指令集——LoongArch。LoongArch既更加适合现代CPU和操作系统技术,又更能保障自主生态的安全,是龙芯二十年来最重大的成果之一。
从电子计算机诞生以来,出现过许许多多的指令集,随着CPU理论和技术的进步,以及用户需求和应用领域的扩展,指令集也需要与时俱进。指令集落后会影响CPU对新技术和新理论的应用,使CPU在性能、功耗等方面也逐渐落后,也难以在新的应用领域中有较好的表现,会被用户放弃,也被软件开发者放弃。指令集的软件数量与用户数量相辅相成,不适应时代的指令集也终会被时代抛弃。例如POWER、SPARC、ALPHA、MIPS等等曾经风光一时的CPU指令集纷纷落幕,也许有无数种失败的理由,但终归结底还是因为使用这些指令集的CPU丧失了市场竞争力。
保持CPU指令集先进性的一般方式,是向指令集中添加各种新指令,这样可以保证新设计的CPU仍然能兼容现有的各种程序,Intel/AMD对x86的扩展、龙芯对LoongISA的扩展都是基于这样的考虑。但是随着时间推移,虽然许多旧指令已经有了更加精巧的新指令代替,但为了兼容仍然不能从指令集中剔除,补丁摞得越来越多,整个指令系统也就越来越臃肿,对编译器和CPU设计都是巨大的负担。由于在设计指令集基础架构时的历史局限性,许多在当时很合理的设计在现在已经成了提高CPU性能的阻碍。龙芯十多年来累计增加了一千多条新指令,用光了MIPS预留的扩展槽,还要背负起MIPS的历史包袱,许多问题已经积重难返,到了必须推陈出新的时候。Intel也曾一度打算抛弃x86指令集,设计了更加先进的“Itanium(安腾)”,但Itanium不兼容x86的程序,x86庞大的软件生态反而阻碍了新指令集的推广和应用。MIPS也曾推出重新设计的MIPS R6版,不兼容旧版的指令集,也遭到了一片冷遇。而ARM的ARM64也不兼容ARM32,却仍然获得了成功,并且在低功耗设备中打得臃肿的x86没有还手之力,RISC-V作为后来者又从ARM手中抢夺了许多市份额,新指令集存活并壮大的也有许多实例。那么龙芯LoongArch如何才能保证推广的顺利?
一种指令集想要得到成功的推广和应用,先进性是必需的前提。设计能用的指令集并不困难,困难的是如何让指令集尽量完美,这需要深厚的理论知识和丰富的工程实践经验,正好这两种龙芯都不缺。
LoongArch是典型的RISC(精简指令集),使用32位定长指令格式,包含32个通用寄存器、32个浮点/向量寄存器。LoongArch是64位指集,也有32位的嵌入式版本,还有仅50条指令的精简版用于教学和超低功耗嵌入式CPU。龙芯以前的LoongISA是从MIPS扩展而来,MIPS R5本身只有279条基础指令,只有三种指令格式。龙芯之前扩展的新指令有一千多条,已经用光了MIPS R5指令格式所支持的扩展位置。于是重新设计的LoongArch通过精打细算支持多达10种指令格式,在不影响译码效率的条件下拥有更多的指令槽,目前已有约2000条指令,但仍预留下了大量的指令槽便于以后继续扩展。
LoongArch在设计之初128位和256位向量指令各有一千多条,在各种测试和优化之后已经缩减到了各700余条。
在理论上,只需要几个逻辑门就可以完成任何类型的计算。早期的CPU甚至用若干个加法运算来代替乘法,现代的嵌入式CPU也有许多没有设计浮点运算部件,需要计算有小数点的数据时都用整数运算来模拟。学生实验设计的CPU有的只有十几条指令也能完成一些任务,但商业化的通用CPU指令集通常都不下千条。因为CPU指令少时,仍然可以用软件组合有限的指令来完成复杂的任务,比如只用整数加法也能完成带小数点的矩阵乘法运算,但是如果CPU设计了矩阵乘法的电路,那么几百条几千条指令的软件算法只需要一条指令就能完成,性能可能会成百上千倍地提升。另有一些功能却不需要用硬件实现,比如统计字符串长度,用硬件实现也仍然需要循环。龙芯已有二十年的CPU设计实践,对于哪些功能适合用硬件完成,哪些功能更适合软件实现,都有细致的权衡。因此对LoongArch指令集的取舍展现了龙芯的工程师们二十年经验的总结,对LoongArch的设计是对CPU和指令集深入理解后的具现。
RISC(精简指令集)和CISC(复杂指令集)现在已经没有了本质的区别,为了保证在越来越丰富的应用类型中都有卓越的性能表现,RISC也会为各种计算增加大量指令。x86指令集作为CISC的代表,在CPU在设计上,也会把指令译码为内部的微码,微码也是RISC的一种表现形式。 只是它们仍然存在一些外在的差异,比如RISC都是定长指令格式,而以x86为代表的CISC是变长格式。指令定长的优点是可以简化CPU译码器的设计,指令格式更加规整,但因指令长度限制,而无法使用较大的立即数,也不能在单条指令中支持长跳转。MIPS最大只支持16位立即数,龙芯设计的指令格式把立即数范围扩展到了25位,分支跳转也从MIPS的±32K(16位)扩展到了±512K(20位),很大程度上避免了数据超出范围时需要拆解为多条指令的情况。变长指令则没有这样的限制,而且可以把最常用的指令设计得很短,这样相同的源代码编译之后的二进制文件往往比定长指令的小,程序中的指令数量一般也更少。假如每条指令的执行时间相同,实现程序功能的指令数量越少,程序的性能也就会越高。
不过LoongArch由于指令设计上更加优化,摒弃了传统指令系统中部分不适应当前软硬件设计技术发展趋势的陈旧内容,吸纳了近年来指令系统设计领域诸多先进的技术发展成果,在把源码编译为目标程序后的指令数量上甚至比x86略有优势。在Coremark的测试中,程序运行过程中执行的指令总数LoongArch为MIPS的83%,相当于运行效率提高了20%。在类型更加多样的测试中,综合测试结果,LoongArch平均比MIPS快12%,说明全新设计的LoongArch是成功的,可以为CPU带来大幅的性能提升。
龙芯的LoongArch指令集不仅在硬件方面更易于高性能低功耗设计,而且在软件方面更易于编译优化和操作系统、虚拟机的开发。
CPU指令集除了先进性,要是还具有良好的兼容性,就一定能使推广难度降低。比如Intel对Itanium寄予厚望时,AMD自主设计了完全兼容X86的AMD64指令集,从而使Itanium一败涂地。龙芯的LoongArch指令集也有同样的考虑,二进制翻译扩展就是用来解决兼容性的问题。二进制翻译是把一种指令集的程序翻译到另一种指令集的CPU上去运行,已有多种成功的案例。比如 Transmeta CPU在内部实现的是一种超长字指令集,但对外的指令集界面则是x86,可以兼容任何的x86程序。开源软件qemu则是使用了纯软件模拟的方案,翻译运行的效率远远不如Transmeta,但具有更高的灵活性,可以实现任何指令集互译。苹果曾两次更换指令集,从Power到x86,再从x86到ARM,都是通过二进制翻译继承以往的软件生态,实现软件生态的平滑过渡。龙芯在十年就前开始了对二进制翻译的研究和尝试,从3A1000开始就在进行指令集翻译的实验,在3A1000上流畅地运行了Windows2000,但是由于种种原因而一直没有推广。现在经过全面的准备,龙芯把之前在LoongISA上对二进制翻译的成果转移到了全新的LoongArch上,除了继承自己以往生态之外,也有收割x86/ARM软件生态的打算。
LoongArch的二进制翻译在设计思路上与现有的同类产品都不一样,它是软硬件结合的技术方案,通过提取主流指令集的主要特征,实现了高效的指令集“并集”,既有接近硬件翻译的效率,又有软件翻译的灵活性,并以此达到以我为主,兼容并蓄的目的。Transmeta的二进制翻译完全丧失了自我,如果通过它只能看到x86指令集,那么它就是x86指令集的CPU,其本质与国内一些兼容主流指令集的CPU没有什么不同,当Intel认为它会与自己的产品发生竞争时,就可以用掌控了x86指令集的双手举起大棒,把对手从自己的生态中踢出去。苹果及微软实现的软件翻译,也仅仅针对自家的软件生态,并不能对外扩张。龙芯的二进制翻译以自主的LoongArch指令集为基础,既不影响自主生态的建设和发展,又能吸收利用其它指令集的生态,实现全面兼容。
随着跨平台软件开发的兴盛,特别是为国产CPU开发软件时,由于国内CPU企业收集了各种指令集,软件开发者往往需要为每个目标平台准备一套测试设备,开发调试都极度繁琐。如果使用LoongArch指令集的CPU,就可以在一台电脑上虚拟出各种常见指令集的硬件环境,可以提高开发效率,降低开发成本。不同指令集的程序甚至可以在同一个系统环境中运行,对开发工具的搭配也可以更加灵活多样,各种生产力软件也不再有指令集版本的区别,都可以自由运行。对开发者更加友好的工作环境,有助于丰富LonngArch指令集原生软件的种类和数量,实现自主软件生态的良性发展。
在行业应用方面,不但龙芯以往积累的软件生态能够通过二进制翻译完美兼容,而且能以较高的效率运行其它指令集的软件,x86和ARM的设备不再是不可替换。随着国产操作系统和应用软件的持续发展和推广,大部分与国计民生相关的行业和单位都会陆续更换成国产的硬件和软件,然而许多基础软件和外设的驱动程序尚未完成对国内各种指令集的全面覆盖,造成电脑和软件匹配上存在困难。龙芯的全兼容方案就可以解决这个痛点,常用的指令集都能兼容,不再需要等待软件开商的移植进度,可以先用起来,解决迫在眉睫的问题。等软件开发商推出了运行效率更高的LoongArch指令集原生版本的软件之后,只需要对软件进行更换就可平稳过渡。
对于普通用户来说,LoongArch的软件生态已经能够满足普通办公和影音娱乐,只是专业应用和游戏软件还有欠缺。但在二进制翻译技术的支撑下,其它指令集的应用软件虽然达不到原生的运行效率,但也可以正常使用。比如只是偶尔使用一下PhotoShop而不以此为主业,或者偶尔玩一下游戏而不追求3A大作,那么完全可以开始尝试使用龙芯CPU的国产电脑。只有用户基数增长到一定程度,软件开发商才会正视用户的需求,自主的生态建设才能够越来越完善。
龙芯向来重视自主生态建设,与自主的信息技术产业链共同发展。
为了夯实国产生态的用户基础,龙芯一直积极地推动中小学使用国产操作系统和应用软件教学。不但邀请各中小学校长参观龙芯中科,了解龙芯在各方面的应用,还参与中小学信息技术课程的教材编写,种下自主国产软硬件的种子,为改变中小学是Windows和Office培训班这一现状而努力。
为了培养信息技术产业的人才,提升整个行业的技术水平,龙芯不但编写了大量教学书籍,还与各个高校联动以教会学生造计算机为己任。设计了大量教学用的CPU实验工具,各种开发板,编写了专业的计算机体系结构(本科/研究生)教材,融合教学与实践。为培养和选拔CPU设计人才而举办“龙芯杯” ,让学生自己设计CPU。现在还在设计只有几十条指令的LoongArch子集,与RISC-V相当,供学生学习和实验。
为了推广LoongArch指令集,也为了提高合作企业在市场中生存和竞争的能力,龙芯将联合产业链伙伴在适当的时间建立开放指令系统联盟,在联盟成员内免费共享LoongArch及有关龙芯IP核。像RISC-V这样的开源指令集组织并不提供开源的CPU核心设计,而龙芯会向联盟成员免费提供用于嵌入式CPU的高性能IP。
为了软件生态的完善,龙芯积极投身国际主流开源社区工作,成为多款开源软件MIPS分支的实际维护者,现在也是LoongArch分支的实际维护者。自己负责了龙芯版Linux系统核心的移植和维护,也开发和优化了大量的基础模块。比如实现了龙芯CPU上的Java虚拟机支持,对OpenJDK的贡献度连续两年名列前茅。对.net Core、浏览器的移植和优化也解决了大量应用依赖运行环境的问题。对UE4和ffmpeg等等的移植也为游戏及影音娱乐做好了准备。对各种开发工具和编译工具的移植也实现了在龙芯平台上软件开发无障碍。2020年,龙芯完成了2万个以上的软件包向LoongArch移植的工作,后续还需要进行各种性能优化。目前正在游说各种开源软件的上游,从上游推送支持LoongArch架构的软件,接受所有开发者参与龙芯软件生态的建设,结束以前某些项目只能自己挖坑自己填的局面。
除了各种开源软件,龙芯也积极联合国内各大软件企业参与自主生态建设。比如WPS、永中Office等办公软件,比如亿图图示、中望CAD等设计类软件都有支持龙芯的版本。在发布LoongArch的展会上,还展示了在基于LoongArch的首款CPU(3A5000测试版)上运行UOS系统的情况,并演示了运行基于其它主流指令系统的复杂应用程序。
龙芯中科已经在一定范围内发布了LoongArch的基础架构指令系统手册。待完成包括境外专利分析在内的进一步知识产权评估后,龙芯中科将在更大范围内发布更完整的LoongArch指令系统手册。在完整的LoongArch指令系统手册正式公开后,必将吸引更多的对此有兴趣的开发者,参与各种开源软件的汇编优化和移植、进行原创软件的开发和优化,投身于自主软件生态的建设。
我国有很多CPU企业,设计了自主CPU指令集的也不只一家,但能设计出LoongArch的只有龙芯中科一个。这不止与企业自身的技术水平有关,也与企业的目标和理念有关。早期的“方舟”是从日立的一个嵌入式CPU外包项目发展而来,设计指令集时不会考虑先进性、兼容性、扩展性,仅仅是为了免除指令集授权的成本。其它的各种嵌入式CPU指令集也不是以通用CPU为发展目标,没有向着顶峰奔跑的勇气。申威也是一家值得尊重的企业,但它的自主指令集是为了发展超算,权衡指令集通用性时不如龙芯全面,也不会考量与桌面计算机软件生态的兼容性。龙芯中科以全面的信息技术产业自主为目标,把x86和Windows作为主要的对手,就必须时刻考虑如何建设一个完整的软硬件生态,实现自主产业链对进口产品的全面代替。龙芯为了这个遥远的目标奋斗了二十年,当年龙芯项目组的年轻人也都已经满头斑白。没人理解时,他们坚持,被人辱骂时,他们沉默,发展完全自主的CPU技术已经成为了他们生命中的执念。直到近两年,由于国际形势的变化,“造不如买、买不如租”、“技术无国界”等论调遭人唾弃,才证明龙芯存在的意义。
相对来说,国内依附于主流生态的通用CPU企业,却往往只把自主的国产通用CPU视为敌人,大有为虎作伥之意。但奴颜卑膝换不来尊重,牺牲自由换来的风光不能长久永续,人家施舍的残羹剩饭反手就能打翻,所谓的融入国际主流只是自欺欺人而已。
龙芯二十年的苦熬没有白费,坚持自主创新磨砺出了超群绝伦的CPU设计能力。在发布LoongArch指令集的展会上,龙芯3A5000(测试版)初露峥嵘,在操作系统和软件环境尚未足够优化的情况下,通过一些性能测试证实它已经达到了设计目标,与同样4核4线程的主流CPU相比性能差距已经不大。待6月正式发布时,随着软件优化逐步完善应更接近主流水平,二十年累计的研发费用不及Intel一个月的研发成本,取得这样的成绩殊为不易。今年龙芯还会发布16核及64核的服务器CPU产品,已经具有了与Intel/AMD在服务器领域竞争的能力。下一代3A6000将会使用新的内核设计,预计单核性能会有50%的提升,届时龙芯CPU的性能水平将真正能与主流CPU匹敌。
有了性能足够的自主CPU,有了生态无忧的自主指令集,国内还欠缺的只有先进工艺CPU的生产能力。因为生产工艺无法一蹴而就,也超越了一家CPU设计企业的能力,龙芯只能把CPU的设计指标限定为境内基本可控的工艺。因为工艺选型必须保守,也促使龙芯只能尽力提高对CPU核心的设计水平。国内部分CPU只能依靠更新工艺降功耗提频率,龙芯即使面对它们的竞争,也坚持使用相对落后的生产工艺,近期美国制裁引发的一些风波,也证明龙芯的选择是正确的,生产环节至少保证了相对的安全。
晦暗的日子已经过去,只要龙芯继续坚持自主发展的理念,龙芯未来的道路一定铺满阳光。
有志者事竟成,破釜沉舟,百二秦关终属楚;
苦心人天不负,卧薪尝胆,三千越甲可吞吴。