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