一、LoongArch

  为什么要设计全新的指令集

  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的特点

  一种指令集想要得到成功的推广和应用,先进性是必需的前提。设计能用的指令集并不困难,困难的是如何让指令集尽量完美,这需要深厚的理论知识和丰富的工程实践经验,正好这两种龙芯都不缺。

  LoongArch是典型的RISC(精简指令集),使用32位定长指令格式,包含32个通用寄存器、32个浮点/向量寄存器。LoongArch是64位指集,也有32位的嵌入式版本,还有仅50条指令的精简版用于教学和超低功耗嵌入式CPU。龙芯以前的LoongISA是从MIPS扩展而来,MIPS R5本身只有279条基础指令,只有三种指令格式。龙芯之前扩展的新指令有一千多条,已经用光了MIPS R5指令格式所支持的扩展位置。于是重新设计的LoongArch通过精打细算支持多达10种指令格式,在不影响译码效率的条件下拥有更多的指令槽,目前已有约2000条指令,但仍预留下了大量的指令槽便于以后继续扩展。

龙芯的指令集有多少条(龙芯LoongArch指令集)(1)

  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指令集)(2)

  龙芯的LoongArch指令集不仅在硬件方面更易于高性能低功耗设计,而且在软件方面更易于编译优化和操作系统、虚拟机的开发。

龙芯的指令集有多少条(龙芯LoongArch指令集)(3)

以自主为基础,以兼容纳百川

  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的国产电脑。只有用户基数增长到一定程度,软件开发商才会正视用户的需求,自主的生态建设才能够越来越完善。

打牢自主CPU持续发展的根基

  龙芯向来重视自主生态建设,与自主的信息技术产业链共同发展。

  为了夯实国产生态的用户基础,龙芯一直积极地推动中小学使用国产操作系统和应用软件教学。不但邀请各中小学校长参观龙芯中科,了解龙芯在各方面的应用,还参与中小学信息技术课程的教材编写,种下自主国产软硬件的种子,为改变中小学是Windows和Office培训班这一现状而努力。

  为了培养信息技术产业的人才,提升整个行业的技术水平,龙芯不但编写了大量教学书籍,还与各个高校联动以教会学生造计算机为己任。设计了大量教学用的CPU实验工具,各种开发板,编写了专业的计算机体系结构(本科/研究生)教材,融合教学与实践。为培养和选拔CPU设计人才而举办“龙芯杯” ,让学生自己设计CPU。现在还在设计只有几十条指令的LoongArch子集,与RISC-V相当,供学生学习和实验。

龙芯的指令集有多少条(龙芯LoongArch指令集)(4)

  为了推广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指令系统手册正式公开后,必将吸引更多的对此有兴趣的开发者,参与各种开源软件的汇编优化和移植、进行原创软件的开发和优化,投身于自主软件生态的建设。

龙芯的指令集有多少条(龙芯LoongArch指令集)(5)

龙芯的未来会更好

  我国有很多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只能依靠更新工艺降功耗提频率,龙芯即使面对它们的竞争,也坚持使用相对落后的生产工艺,近期美国制裁引发的一些风波,也证明龙芯的选择是正确的,生产环节至少保证了相对的安全。

  晦暗的日子已经过去,只要龙芯继续坚持自主发展的理念,龙芯未来的道路一定铺满阳光。

分享龙芯CPU的前世今生

CPU即“中央处理器”,并未限定它一定是集成电路,也未限定它不能是多块集成电路。但是高集成高性能低能耗的CPU,在现代的表现形式只能是超大规模集成电路。

  2001年4月,在国内放弃高集成高性能CPU技术二十多年后,一款国人团队设计的高性能嵌入式CPU“方舟”流片回来成功点亮,紧接着2001年5月,中科院计算所“龙芯(最开始名为GODSON)”课题组正式成立,开始全力投入对GODSON CPU的研发工作。早在1999年9月,“方舟”前身的负责人李德磊,就找倪光南院士帮忙挽救这个被日立抛弃的半成品外包项目;2000年初时,计算所李国杰所长则安排了胡伟武和唐志敏等人开始进行CPU技术的预研;李德磊的嵌入式CPU项目更名为“方舟”,并于2000年5月接收到首笔2000万元投资后继续研发;在2000年10月,计算所的“GODSON CPU设计与验证系统”被批准立项。时间衔接如此紧凑,要说“龙芯”项目的诞生与来自“方舟”的刺激和压力没有半点关系,我是不信的。

  “方舟”是第一款由国内团队设计的,用于网络数据处理的较高性能的也较复杂的嵌入式CPU,为了让这颗初生的幼苗能够茁壮成长,倪光南院士为这款应用面较窄的嵌入式CPU量身定制了使用场景——网络计算机的客户端。使用“方舟”CPU的客户机只需要连接到远程桌面,其它的所有工作都由使用英特尔CPU的高性能服务器完成,也就是“云桌面”的局域网版本。为了使“方舟”有足够的资金进行持续研发、提升性能、迭代产品,倪院士义无反顾地通过推动政府采购、争取863计划补贴、找寻合作者等方式使“方舟”项目能有持续研发的资金。然而,方舟项目的实际控制者李德磊对于倪院士一厢情愿的热忱并不领情,在解决了项目流产的危机后,他对“方舟”的态度便十分消极。作为技术型商人他更喜欢有一定技术含量且利润丰厚的短期项目,而不想把自己捆绑在“追赶世界先进水平”这种看不到希望的事情上。虽然当时许多事情还没有发生,但也有了一些苗头,即便单说李德磊是加大拿籍华人这样的身份,也会令许多人不敢把国内CPU发展的希望都押注在“方舟”身上。

龙芯的指令集有多少条(龙芯LoongArch指令集)(6)

从左至右:方舟1号、方舟2号、龙芯1号、龙芯2号

  那么,既然“方舟”的研发进展已经证明了国人自主研发CPU不是痴人说梦,如果此时有人提出由完全可控的中科院计算所也进行一款CPU的研制,作为分摊风险的备选,就是一个合情合理的保底方案,之前反对声音就会减少许多。我甚至觉得计算所李国杰所长在“GODSON”开始设计之初的会议上提出的“高性能、通用、一步到位”的口号,也是为了补充“方舟”的不足。“方舟”的计划是先发展对性能和软件生态要求较低,也不会与Intel等巨头产生冲突的的嵌入式CPU,积累足够的技术和资本后再逐步进入通用CPU的领域,而李所长则认为可以一步到位地完成对通用CPU的设计,因为嵌入式CPU几乎不存在被卡脖子的可能,远不如通用CPU那么危险和紧迫。我认为李所长定出这样一个稍高一些的目标,也有为“GODSON”项目的立项争取更多支持的考虑,他也为国产CPU筹谋已久,“方舟”创造的契机不能被白白浪费。

  项目一日不正式立项,预研就只能是预研,没有可支配的资源,也不能放下手头的其它工作,全身心投入CPU研究。幸好因为李国杰所长的大力推动,以及后来对“龙芯”项目的支持和保护,才使得在“方舟”项目停止后,国产高性能通用CPU的研发工作也没有止步,“龙芯”完美履行了备胎的责任。“方舟”真正的继任者,是由原方舟技术团队主要人员离职后组建的“君正”,“君正”仍然是以嵌入式CPU为切入点,市场生存能力比龙芯更强,只是无论以前还是现在,无论“方舟”还是“君正”,都没有研制通用CPU的欲望。

  为何无论是倪光南院士,还是李国杰所长,都不愿放过国产CPU诞生和发展的任何一点机会呢?像骤见光明的飞蛾一样!因为越是深入了解技术和行业,越能够体会到我们看似光鲜繁荣的信息技术产业,随时都有垮塌的风险。长期以来,由于生产设备受限,核心技术受限,我国几乎放弃了对通用计算机中难度最大的几种零部件的研究,许多基础软件也因此没有诞生的土壤。CPU和存储器是别人的,操作系统和各种基础软件也是别人的,欧美国家向我们提供这些产品,颇像商人们向农民们出售农具和肥料时绝不透露这些东西如何研制和生产那样,他们会说:“先进技术你们不懂,何必自寻烦恼,你们买农具和肥料种地,等我们收购就好”。农民要赚钱继续购买生产资料,只能视商人需要什么就种植什么,要想种点独特产品自己开拓市场,会发现农具会坏掉、肥料用不了!现实其实更加残酷,计算机的关键硬件和软件,关系到我们生产生活以及国防建设及社会管理等方方面面的安全,一旦出现任何问题,都会造成灾难!越是了解风险,越是不能安眠,因此倪院士和李所长必须要做他们认为正确的事情,尽管在有些人看来这是螳臂当车又或杞人忧天。

龙芯的鸿鹄之志——要做世界一流的备胎

  “龙芯一号”是我国第一款高性能通用CPU,不管“龙芯”项目是在什么情况下立项的,它的目标都不是作为方舟这类嵌入式CPU的备胎,只有如Intel、MIPS这样同类的通用CPU,才能是它想要代替的目标。由于现代的嵌入式CPU已经进化为使用低功耗通用CPU核集成其它模块来实现功能高度集成,龙芯的目标也就与时俱进地变成了代替进口的桌面和服务器CPU。

龙芯的指令集有多少条(龙芯LoongArch指令集)(7)

龙芯的三大系列CPU (仅重点型号,非完整版)

  高性能的CPU已不只一次地被美国禁止出口,CPU设计和生产方面的技术更是在禁运之列。特别在是海湾战争之后,一些敏感应用中使用的CPU,只能通过对制程较老的早期型号CPU产品进行逆向工程后,小规模自产才敢放心使用。因为指令集本身虽不能隐藏“后门”,但实现指令功能的CPU却可以。CPU“漏洞”是由于设计上的失误而造成,而“后门”则是专门设计的特殊功能。大多数“后门”本身只是用于CPU检测和调试的非恶意设计,但无法避免通过“后门”来达到恶意的目的。CPU的设计者可以设计出《指令集手册》中不存在的指令功能,只要保密做得好,正常情况下就没有人知道CPU是否存在一些功能特殊的隐藏指令。专业人士想要分析一款CPU中是否存在未公开的特殊指令,并了解指令的具体功能也是十分困难的事情。例如2001~2003年的威盛(VIA)C3系列CPU中存在的超级后门,在2018年的一个安全会议上才得以披露。可以说CPU都存在后门,问题的关键不于后门是否存在,而在于后门是由谁在掌握。有人会愿意买一套不能换锁的房子,却没几人能忍受还有一道暗门的钥匙在别人的手里!

龙芯的指令集有多少条(龙芯LoongArch指令集)(8)

进入威盛C3处理器“上帝模式”的动态演示

  我们自己设计的CPU,性能上可以与进口产品有差距,但在必要的时候必须能够完成代替,如果要把代替扩展到各种行业,那么出于成本考虑,能够使用已有的操作系统和各种应用程序就是最佳选择,也就是要做到对某种流行的CPU指令集兼容。指令集是一种描述CPU行为规范的标准,针对不同应用场景的CPU可以有不同的指令集,不同的指令集也不能相互兼容。例如一款可编程的玩具汽车,其嵌入式CPU的指令系统甚至只需要“前进、后退、左转、右转、停止”这样的简单指令,根据指令让CPU的特定引脚产生电平变化就可以了,只需极少的晶体管和成本就可以实现功能,但却不可能用它来完成写文档、做设计等复杂任务。即便同为通用CPU的功能相似的指令集如x86和MIPS,由于指令规范定义不同,其二进制程序也不能相互兼容,因为相互之间(机器)语言不通。使用编译型编程语言编写的跨平台的应用软件,都是把源代码针对不同的指令集分别进行了编译。Java开发的应用程序不需要编译,但运行Java程序的虚拟机也仍然需针对不同的指令集进行修改适配和编译。如果在不同指令集的CPU间迁移应用程序,当应用程序的数量难以计数时,需要的资源也会难以计数。

  “龙芯”项目的第一个问题就是使用什么指令集。自行设计一套新的指令集对于专业人员没有技术门槛,新手的设计也不过是可能在某些应用中性能低下,但并不是不能完成功能,但要想设计一套简洁高效的指令集,就需要长时间的大量实践,积累经验融会贯通。困难的地方不在于指令集设计,而在于兼容,在当时的技术条件下,要想完全兼容某种指令集而不侵权是不可能的,要想在全行业推广就不能忽视知识产权方面的问题。X86指令集的授权不可获取,当时MIPS虽略显颓势但仍在服务器领域与Intel战得如火如荼,且在通信设备中仍然被大量使用,而SPARC、Alpha、Power等指令集在国内的应用又太少,ARM当时还是幼儿,于是兼容MIPS就成为了最不坏的选择。由于MIPS在服务器、通信设备、工控设备等方面大量使用,至少可以保证当国外的CPU罢工时或被主动禁用时,这些基于MIPS的应用软件可以不需修改和重新编译,就能在龙芯CPU上直接运行,让“龙芯”承担起备胎的责任。至于让龙芯CPU进入普通用户的个人电脑,那需要大量的应用软件适配,这个周期可长可短,是远期目标,并不甚紧迫!

  为各个行业提供自主设计安全与可控的CPU,是“龙芯”项目的信念和目标。只是各行各业自有其运行的惯性,威胁尚未临身时,“龙芯”项目组的一些观点就如患了“被迫害妄想症”一般可笑。备胎在表现出自己独有的价值之前,必须沉下心来,做出看得到的成绩。想要代替谁,就先要模仿谁,别人能做的你也能做,别人不能做的你还能做,那样才能成为备胎的首选,逐渐完成渗透。“龙芯”首先要做到的就是用自己的设计实现MIPS指令集的全部功能,就像学生做题,解题思路可以学习,但只有自己把所有题目都正确地做过一遍,深入到所有细节,才能算是完全的理解和掌握。如果像六、七年后某单位直接使用Sun开源的UltraSparc T2 CPU源码“自主设计”CPU那样,真实的设计的水平就会远远低于产品表现出的水平,也许有人抄作业能抄成学霸,但绝不可能一个团体都抄成学霸。

  当时的“龙芯一号”是“GODSON”,而不是现在的根据设计用途重新规划的低功耗“龙芯一号”系列,但当时的“龙芯二号”仍然属于现在的“龙芯二号”系列。在当时由于MIPS集中有几个指令存在关联的专利,于是在设计“龙芯二号”的过程中就没有去实现那几个指令,当年国外某研究报告中是这样说的:“由于龙芯2号只是没有实现MIPS公司申请专利的部分指令,因此龙芯2号的指令系统是95%与MIPS兼容的”。由于报道中提到的指令相关专利已于2006年过期,“龙芯”后来新增的型号就都实现了这些指令的功能,算是100%兼容了。

  备胎要体现出价值,只是100%的能力模仿是不够的,还必须要做得更快更好,于是龙芯项目组不断提升CPU核心设计水平,凭此提高CPU的性能。2003年在“中X国际”完成流片的“龙芯二号”是“龙芯一号”性能的3~5倍,已经超过了Intel 奔腾(Pentium) II,但与同时期的主流CPU仍然有很大差距。龙芯在艰难进步,而Intel等公司也在用更雄厚的资金投入、更完备的技术储备在以更快的速度进步。为了缩小与Intel的性能差距,并能相对其它MIPS兼容CPU具有独特优势,龙芯还在MIPS指令集的框架下增加并实现了许多自己设计的新指令。最开始实现的新指令大概是与Intel MMX相似的64bit向量计算指令集,名叫Loongson-MMI,使龙芯CPU的浮点运算能力大幅度提升,而当时原生的MIPS指令集中还没有成体系的向量加速指令。

  龙芯项目组磨练设计能力和对各种新指令的实验一直在齐头并进,在“龙芯三号”的3A1000/3B1000中甚至加入了为二进制翻译加速的专用指令,以及256bit的向量加速指令。遗憾的是龙芯无法公开提供这些新增指令的说明手册。因为这些指令一直处于研究和实验状态,在每个新型号的CPU中都会有变化和修改,达不到定型的要求,也就无法提供给普通开发者使用。还因为龙芯在对待CPU的专利方面有“洁癖”,无论是实现各种向量计算的高性能电路和算法,还是二进制翻译的目标指令和翻译方法都早已有了许多相关的专利,如果某些专利无法绕过,龙芯宁可等待专利过期。对于可以绕过的专利,绕过专利的各种方式是否能保证性能也需要通过实验一一验证,如果专利调查不全面,甚至可能出现与已有专利意外重合的情况。然而仍然有一些对专利问题不敏感的客户,由于对自主CPU的高性能向量运算能力有强烈需求,而在某些定型后就几乎不改动的特殊项目使用这些新指令,普通行业用户却并不能享受到新增指令集带来的性能提升和便利。

龙芯的指令集有多少条(龙芯LoongArch指令集)(9)

某J用系统开发商的宣传图,疑似使用龙芯CPU

  尽管我觉得龙芯过于谨慎,宁肯被开发者骂也不公开扩展指令集的细节,实在有些过分。但龙芯体量太小,确实经不起任何的知识产权诉讼,也只有完全自主研发才会产生这样的烦恼。只有不公开,让新增指令保持在科研实验的状态,才能杜绝一却意外侵权(根据我国《专利法》的规定:“专为科学研究和实验而使用有关专利的”不视为侵犯专利权)。因此如果以后龙芯公开了自己的《指令集手册》,那就说明所有专利都已经完美绕开,指令系统定型完成,以后只会增加指令而不会删改指令了,这一天已经不会太远。

  由于2006年的龙芯2E性能达到了Intel 奔腾(Pentium) III@1.0GHz的水平,进入了性能可以实用的阶段,于是从龙芯2E/2F开始,使用了龙芯CPU的袖珍主机、一体机等开始公开销售(只能从龙芯的合作企业直接订购,电脑城中没有卖的)。也有一些公司使用龙芯的产品进行二次开发,再向客户销售。我就找到过几台二手的使用龙芯2F CPU的袖珍主机,查看里面的内容发现它们原本被用于某酒店大堂及各宴会厅的大屏幕,联网展示各种图片和资料,最晚淘汰的那台持续工作到了2015年。

龙芯的指令集有多少条(龙芯LoongArch指令集)(10)

清华同方定制系统的终端 (使用龙芯2F“福珑”袖珍主机)

  但是MIPS桌面生态的孱弱是不争的事实,且MIPS正在衰败,软件生态的发展趋于停滞,而龙芯的人力和资金又无法自己建立软件生态。因为桌面计算机上凡是有大量用户的软件几乎都是闭源的商业软件,国外的不提,即使国内的软件企业大多也不会在无利可图的情况下主动去做软件移植。CPU的用户数量决定了软件开发商的热情程度,而没有大量软件的电脑又不可能被普通用户所选择,龙芯的发展陷入了瓶颈!

  龙芯往指令集中加入二进制翻译指令,应该就是为了摆脱这一困境。它最初的设计目标是在龙芯CPU上流畅运行基于x86指令集的应用程序,如果有方法能直接运行x86的应用程序,就能补充软件种类和数量的不足,甚至为代替Intel CPU这一长远目标打开局面。可惜这一项目才刚有雏形时,由于“汉芯”造假事件的影响,以及“方舟”溃败的余波,有关部门对全国的半导体设计项目均收紧了资金支持,龙芯、申威、飞腾都遭了无妄之灾。当时龙芯项目组处于最困难的阶段,“龙芯”新款CPU的研发进度严重变慢。3A1000设计完成后没钱流片,863计划才临时安排了专项资金,龙芯项目组还预支了计算所七、八千万的经费,而且这笔钱属于暂借,龙芯项目组有钱了就要归还。在龙芯项目组转制为公司后,经济困难时计算所仍然会资助,龙芯有了钱就还上一些,很多年之后这笔帐才彻底结清。

龙芯是成熟的备胎了,要学会自力更生

  做芯片研究很费钱,越是高端的、复杂的、先进的芯片研究,就是越是费钱。CPU是最复杂的芯片,是最精细的人造物,集成晶体管的数量以亿为单位,当然就是最费钱的芯片。龙芯是在用很省钱的方式自主研究CPU,但每代CPU核心的研发成本仍然是以“亿元人民币”为单位,不过从一代核心衍生的同代其它型号成本会降低一些。Intel这样的巨头舍得花钱,每代核心的研发成本是以“十亿美元”为单位,比如6代酷睿的整体研发成本就达到了71亿美元。Intel 在2004年的研发费用是47.8亿美元,逐年上涨至2012年已达百亿美元,2017~2020每年的研发费用都超过130亿美元。如果说跟Intel不好比,那么小米用买来的CPU核心自己再做一些集成设计的“澎湃S2”,烧掉了20亿人民币后偃旗息鼓,也能证明CPU研究有多么艰难!

龙芯的指令集有多少条(龙芯LoongArch指令集)(11)

Intel 2004~2020各年度研发费用 (单位:十亿美元)

  龙芯项目组是有收入的,863计划对CPU研发项目的补贴算一部分,一些单位和行业对龙芯CPU的采购是另一部分,参与各部委和单位的科研项目竞标,完成后得到的报酬也是很重要的一部分。但在具体的应用中,由于龙芯CPU性能与主流存在较大差距,软件生态也极不完善,在那时龙芯CPU的应用范围极小。比如保密单位的保密计算机、J用和工业设备的控制系统、教学用一体机、以及本文前面提到的挂在酒店大屏幕上展示图片和资料的终端等,大多数都用在大家看不到的地方。使用得少收入就少,所获资金明显无法保证CPU研发的进度,当年的“方舟”设计要简单很多,李德磊在有政府采购输血和863项目补贴的情况下也仍然感叹没有钱赚,从而放弃了继续研发,更何况龙芯当时已经是性能达到了奔腾4水平的通用CPU。研制的CPU越来越复杂,研发成本越来越高,资金缺口也越来越大,龙芯项目必须另谋出路。

  在2010年的时候,龙芯课题组大多数骨干决定从计算所辞职,放弃体制内身份、放弃在学术界的地位和前景,把课题组转型成立“龙芯中科技术有限公司”,计算所占大部分股份。如果下海能捞到钱,龙芯CPU就能有足够的研发资金,如果失败了,那也不需要回去了!项目组十年来坚持研究,接来送走大量的年轻学子,培养了大量的CPU科研人员,人员的流动也算是传递了CPU技术的星星之火,薪火不灭,终会熊熊!

  龙芯中科公司成立后,为了筹措资金承接了许多小项目小系统的定制,以养活自己为第一要务,同时也继续进行更高性能的CPU研制。可是,这群刚下海的科研人员,下定决心破釜沉舟的首个重大项目就遭受了巨大的挫折,他们以为Pentium III水平的单核性能已经够用,脱离了市场的实际需求,研究方向走上了“邪路”。或者他们想暂时忘记备胎的身份,想要在主角的舞台上光亮一次,却选错了方式。

  在4核的龙芯3A1000成功后,研究方向调整为更多的核心、更强的浮点运算,以及研发片间多路互联技术,打破美国对多路CPU互联技术的封锁。为此龙芯规划了8核的3B1000和3B1500,并支持多路CPU互联。从课题组转向为企业之后,众多项目同时进行,以及科研人员的不适应造成了管理混乱,使CPU研制过程也频频出错,研发进度缓慢。直到2012年4月,3B1000才达到稳定状态,峰值浮点性能达到了128GFLOPS,处于世界领先的行列。这一成就的激励,也让龙芯在错误的路线上越行越远,2013年研制成功的龙芯3B1500在浮点性能上终于成功超越了同期的Intel CPU,峰值浮点运算速度达到160GFLOPS,高频版达到了192GFLOPS,这个成绩直到现在也不丢人。但是,普通的应用软件及操作系统需要的是单核通用计算性能,超强的浮点运算能力也无助于提高桌面软件的运行流畅性。由于数年来没有注重单核通用计算性能的研究,3B1500相对2006年的龙芯2E在单核通用计算性能方面仅有50%的提升。可是这6、7年来Intel的CPU单核通用计算性能提高了5倍以上,龙芯的对手从奔腾3和奔腾4变成了酷睿3代和4代之后,备胎与主角的差距突然变得令人绝望。

龙芯的指令集有多少条(龙芯LoongArch指令集)(12)

龙芯3号 3B1500

  耗费无数精力研制的浮点性能超强的CPU市场反应惨淡,发育不均衡的CPU在实际应用中处处展现短板。龙芯痛定思痛,停止了正在研发中的16核CPU,决定把提升单核性能作为未来的主要研究方向。尽管我认为浮点性能和多片互联不是“邪路”,但在CPU通用性能差距还远的时候,就去研究浮点性能和多片互联确实不合时宜,如果这些技术晚几年诞生就能有用武之地了。备胎不能提供需要的能力,那么备胎就会失去存在的意义。在“核高基”看来,龙芯数年的时光也是做了无用功,判定了自主研发之路走不通,龙芯保底的项目补贴也断掉了。在对自主研发的表现失望之后,引进吸收国外CPU技术的想法占了主流。龙芯10多年来仅接收了国家5亿补贴,核高基却为投资及引进的企业们提供了几十倍的资金。

养蛊计划开启,备胎们的混战

  对信息安全的保障是一项系统化的工程,各种软件硬件环环相扣,只要任何一个点出现纰漏,信息安全就是镜花水月。信息安全不只是信息本身的安全,还包括整个信息技术产业的安全,假如别人不卖内存颗粒给我们、不卖存储设备给我们、Windows不给我们用、工业和科研相关的软件硬件不给我们用,或者这些软硬件本身存在后门令我们不敢用、不能用,那么我国的信息技术产业就会立即崩溃。多少年来我们都是在沙上垒塔,看似壮阔,实则岌岌可危。国产CPU只能保障信息技术产业的一个环节,必须把信息技术产业中的各个环节都更换成国产软硬件,这样才能最大限度地保障整个信息产业的安全。

  中国经济和社会发展的速度令美国越来越紧张,对于近几年国际上的形势变化,上层也是早有预见的,中国不能卑躬屈膝,就必须做好应对的准备。早在十年前,在国家核高基重大专项支持下,广东就尝试在小范围内应用国产硬件设备和软件。现在为保障信息技术产业安全与可控,而正在进行的推广国产软硬件替换进口同类产品的活动,以及信息安全创新应用中对国产设备的使用,都是这一计划的沿续和扩展。不过当时的计划应该没有现在这么庞大,毕竟那时中美关系还没有现在这么恶劣,只是做一些未雨绸缪的应对准备。计划主要目的是保障信息产业安全,要想达成这个目的,就必须能有与进口产品性能和品质相当的国产软硬件,这实际上是一个培养众多备胎,让备胎们在竞争中成长壮大的“养蛊”计划。

  为何不能像两弹计划那样集中资源,而要让众多企业参与竞争?这是因为计算机与两弹的“用户”截然不同。所有人都会直接或间接的用到计算机设备,能不能用,好不好用,需要所有的用户共同检验。广大的用户选择计算机设备时,首要考虑的是性能和软硬件配套的生态,以及不超过预期的价格,还有良好的售后服务。这些方面的实力,与技术是自研还是引进无关,与企业自身的理念和目标无关,能否竞争中胜出,只能由市场自己选择。因为国外企业的先发优势,已经占领了信息技术产业的基础软硬件市场的绝对份额,国内企业大多只是硬件组装工厂,在基础软硬件方面技术不如别人,性能不如别人,也就无法从市场中得到足够的资金进行快速的技术升级、产品迭代,差距会与国外巨头越来越远。国家为了解决这个难题,划出一块特殊的市场,把进口产品挡在外面,让国内各家企业面对的都是实力可期的对手,在充分自由而又有限的竞争中快速发展。多年前龙芯的胡伟武提出的“政府应该……构建一个小森林,把国外芯片挡一挡……让国内各家CPU公司在小森林里适者生存的竞争——谁的产品好,谁的服务好,就选谁的产品,政府不要去干涉。”的想法,也是在这一计划全面启动之后,才终于成为了现实。

  尽管看似信创用户花了更多的钱买到了更差的产品,但只要这些钱是在国内流转,在国家看来就只是左手到右手的算术游戏,资金在流通过程中不但没有变少,反而有大量的企业在这个过程中创造出大量的技术和产品。特别是CPU和操作系统的技术发展和规模化应用,还能促使整个产业链的规模扩大,催化整体的水平提升。推广国产设备替换进口产品的活动创造了需求,在进行的过程中,不但能提升信息技术和关联行业的科技水平,还能培养出大量的科研人才和科技企业,经济总量与活力也得到提高。科技水平提高还能凝聚国人信心,整个社会都会受益。在竞争中脱颖而出的企业,将成为行业的领头羊,收获直面国外巨头的资格。

  龙芯是做CPU设计的,当然也会参于尝试替换进口设备的推广计划,从2013年第一期试验正式开始后,使用龙芯3A1000这款CPU的台式机就在党政办公中少量地替换了使用进口CPU的计算机。现在党政办公和部分敏感行业正在推广使用国产软硬件全面替换进口产品,就是这次试验计划的后续。

龙芯的指令集有多少条(龙芯LoongArch指令集)(13)

龙芯宣传PPT截图

  在推广国产替换进口的第一期试验开始的那一年,“核高基”也在否定了“龙芯”的自研路线后,把扶持重点放在了引进技术的CPU上。同一年,一家早些年被Intel逼到穷途末路的台湾半导体企业VIA与上海政府合作,把它的大陆分公司与上海市政府合资,摇身一变成为了国资控股的CPU设计企业。这家新成立的“兆芯”公司拿着由VIA的美国子公司“Centaur”几年前设计的基于x86指令集的CPU,顺利通过了“核高基”验收。然后“兆芯”获得到“核高基”和地方国资委总共70亿人民币的资金支持,财大气粗到处送机器,说凡是现在用龙芯的,他们都免费替换。很明显,国产替换进口必然在若干年后全面展开,当时的申威和飞腾在桌面计算机方面还没有任何表现,不足为虑,在国产替换进口这个巨大的市场上,龙芯就是它的唯一对手。龙芯由于前些年努力的方向错了,当时的龙芯CPU在通用计算性能方面确实远不如VIA数年前的产品,再怎么说VIA也曾经是Intel的对手之一,仅次于AMD。

  但是飞腾也不愿在将来的国产CPU市场上只有兆芯一家独大,在2012年ARM开始对外授权ARMv8之后,飞腾的高层之间吵了一架,决定抛弃之前使用的SPARC开源方案,转投ARM阵营,并于2014年10月发布了FT-1500A,与兆芯一时瑜亮,性能也超过了当时的龙芯CPU。

  申威和龙芯一样有从低功耗嵌入式到桌面和服务器全系列CPU,它最高性能的CPU是用于超算的260核的26010(4大核 256计算加速单元)。申威面对国产推广的蛋糕则是不温不火,那时申威的精力全放在了“神威·太湖之光”上。再说申威的桌面生态不说与x86和ARM相比,就算与基于MIPS的龙芯相比也远远不如,趋近于0,对于党政办公的市场暂时没有热情也在情理之中。在国产CPU的大家族中,申威与龙芯可谓英雄所见略同,它们的发展模式如出一辙,所以它们俩如果互称“友商”那绝对是纯粹的字面意思,不是反语。比如下面这张PPT图片,如果把“申威”两个字改成“龙芯”,绝对没有任何不妥!

龙芯的指令集有多少条(龙芯LoongArch指令集)(14)

申威宣传PPT截图

  大概是因为国内企业短短两三年都没有做好代替进口同类的准备,特别是信息技术产业中的一些关键产品需要很长的研发周期,之前没有准备,在一期对进口设备局部替换的活动结束后,许多关键产品仍然没有达到全面替换进口设备的技术条件。为了让竞争更加激烈,场面更加火爆,于是在2015年又启动了规模稍大一些的二期尝试,龙芯才有了继续提高性能,迭代产品的时间窗口,同时也给了更多的“CPU企业”筹备的时间。从2010年到2015年,龙芯在市场中拼命打熬,终于从挺过了奄奄一息面临解散的困难时期,于2015年正式收支平衡,开始盈利。此时龙芯CPU的最新型号3A2000通用计算性能也有了较大幅度的提高,而性能更高的3A3000也在研制之中。在2015年的3A2000发布会上,龙芯中科透露了发展自主指令集的想法,那时龙芯对指令集的研究已经融会贯通,但是要想实践就仍然面对一个关键的问题——没钱。

  准备参与到国产软硬推广计划这场盛宴的CPU企业,除了早已存在的龙芯、飞腾、申威、以及VIA支持下的兆芯之外,华为也加入了进来。另外还有许多国际巨头也纷纷或主动或受邀与国内地方政府及机构合作打出了“国产”招牌。比如IBM与江苏省合作的“中晟宏芯”、高通与贵州省合作的“华芯通”、AMD与中科曙光合作的“海光”、Intel与清华大学合作的“津逮”……只是由于国产设备推广的准备期有点长,一些合作项目还没有等到收获的时节就已经提前变黄。

  前面说过高性能的自主CPU研发成本都是以“亿元人民币”为单位,这个成本还是建立在团队都是专家的基础上。像小米“澎湃S2”的研发团队远不如龙芯,只是买来别人设计好的核心做集成,就烧掉了20亿人民币还没个结果。那么国内突然集中诞生的那么多CPU企业打算怎么设计CPU?在我看来他们不是真的想要研究CPU技术,至少已经早夭的那些CPU企业肯定是打的“只引进不吸收”的主意,只是想方设法地要往CPU里面加一点“国产”的东西,才有由头打出“国产”的旗号空手套白狼。

  因为CPU研发成本高,而自主CPU的市场容量有限。假设一款CPU的整体研发成本为2亿人民币,却预计只能售出一万颗,那么每颗CPU需要均摊的研发成本就高达2万,即使能够销售十万颗,每颗CPU均摊的研发成本也高达2000。在销量达到百万颗之前,成本均摊怎么都降不下来,价格就 会一直保持在高位。自主研发CPU的公司通过各项收入及社会投资补贴CPU研发,用赔本赚吆喝的方式扩大用户群体,已经坚持了很多年。如果是直接把进口CPU包装为国产呢?那么可能500元买来的进口CPU性能都比自主CPU高,只要包装成国产,不但自己几乎没有研发成本,甚至可以卖比自主CPU更高的价格。比如500的成本卖5000,2000的成本卖20000,只需要少量的真实投资把帐面做好,这要比真正的自主研发容易多了,也没有研发失败的风险,轻轻松松就能赚到大把的钞票。其实这还不是赚钱的主要方式,因为保留市场的容量是有限的,真正的销量不会太高,且随着销售规模扩大价格也会逐渐降到公开市场相当的水平。更大的利润是长期的“研发补贴”,在有国外“技术支援”的条件下,出“成果”的周期是可以计划的,每次提高性能都准确击中“项目验收标准”,能得到丰厚的回报。只可惜申请补贴的时间拖得太长了,厂房道具要钱,群演工资要钱,如果没有意志坚定的金主撑腰,不长时间就会原形毕现,最后破产清算,留下一地鸡毛。

国产CPU众生相,谁能迎来胜利?

  在向党政办公全面推广国产软硬件的时候,已经是2019~2020年了。龙芯终于把它的CPU推进到了3A4000。在相同的工作频率下,3A4000的单核性能接近于AMD的Zen1,但由于3A4000的频率最高仅2.0GHz,因此实际性能仅相当于AMD的“挖掘机”。我认为3A4000的主频低还是因为龙芯中科太穷了,要想提高CPU的频率,除了修改结构设计外,还有一个烧钱的手段。就像设计发动机,在结构原理不变的条件下还可以做许多细微调整,首先使用更好的材料和生产工艺肯定能提高发动机的最高性能,然后对各个零件的位置尺寸进行调整,每次调整之后重新试制一批样品,从实践中总结经验,反复多次之后,最终成品的性能绝对与最初的样品不可同日而语!但是太费钱,龙芯中科才解决了温饱问题,没钱!龙芯寄予厚望的3A4000与前代产品使用的还是相同的生产工艺——来自意化半导体的28nm制程。而同为国产的兆芯、飞腾早就用上了14/16nm制程的工艺,华为甚至用上了7nm制程的工艺。

  这段时间中,申威终于推出了性能不错的4核桌面版本和16核的服务器版本CPU,型号分别为“申威421”和“申威1621”。只是申威CPU性能相关的资料比较少,也找不到任何的用户体验报告,不温不火,神秘依然。申威和龙芯一样,也是完全自己设计的CPU,由于它的主要任务是超算,不用考虑桌面软件生态,因此比龙芯更早使用了自己设计的SW64指令集,早已与DEC的Alpha指令集无关。由于申威的路线与龙芯极其相似,相互可谓惺惺相惜,龙芯的胡伟武经常在公开场合夸赞申威,说申威是世界第一的CPU(260核的超算CPU浮点性能超群)。只是由于申威之前对桌面生态没有积累,对桌面环境中各种基础库的优化也不到位,它的桌面版本CPU用户比龙芯还少,几乎是没有人用的状态。除了软件生态之外,申威还有个重大的缺陷,那就是没有市场化运营的经验。产品要进入市场,对客户的服务很重要,而之前申威只需要服务于超算项目,当客户变成形形色色的单位、个人之后,申威还需要很长时间才能适应。我个人很希望看到申威与龙芯煮酒论英雄的场面,但是条件不成熟,申威对这次的国产推广的参与程度,大概是站在人群之外保持微笑。

龙芯的指令集有多少条(龙芯LoongArch指令集)(15)

申威宣传PPT截图 (全系列CPU)

  飞腾从2014到2020间发布了数款CPU,把核心代号从“FTC660”编到了“FTC663”,各代CPU的产品频率和核心数量有一些变化,但在相同频率下的单核性能却出奇的稳定,6、7年来,飞腾各代CPU的IPC正负不超过10%,几乎没有提升。它的ARM CPU性能起点颇高,但IPC至今仍在起点附近起伏,我对它研发CPU核心的能力没有信心。其最新的桌面CPU升级到了8核,但CPU的单核性能甚至不如它的前一款4核的FT-2000 /4,只是据说每核的平均功耗更低,更加省电!飞腾还有一款设计中的桌面CPU,PPT上说单核性能将会比当前产品提升一倍,希望到时候能够兑现承诺,实现质的飞越。

龙芯的指令集有多少条(龙芯LoongArch指令集)(16)

飞腾宣传PPT截图

  虽然飞腾是龙芯在国产CPU市场上的对手,但龙芯中科似乎并不把飞腾作为对手看待。龙芯胡伟武几年前的一篇文章中就写到:“我们必须认识到,飞腾是我们的同盟军,都是自主软硬件的重要力量。”看来龙芯认为只要是对自主软硬件发展有利的、有助于信息安全建设大局的、能够在对抗WinTel联盟垄断时形成合力的,那么就是天然的盟友,对自身的利益得失反倒不是特别计较。

  兆芯当前的最新CPU,虽然有比龙芯3A4000更高的主频,量产版本为2.7GHz,但其相同核心数量下的绝对性能也不过与龙芯的3A4000持平,不过它也有8核的版本。兆芯从2013年成立以来,共推出了ZX-C/C 、KX-5000、KX-6000三个系列的桌面CPU产品,其服务器版与桌面版没有本质区别。 从兆芯官方的宣讲来看,在使用ICC编译Spec2006进行性能测试时,以前(KX-5000)2.0GHz/单核20分、现在(KX-6000)3.0GHz/单核30分、未来(KX-7000)4.5GHz/单核45分,性能和频率直接成线性关系,说明对CPU核心的修改只是为了适应更高频率和更新的工艺,而与IPC无关。

龙芯的指令集有多少条(龙芯LoongArch指令集)(17)

兆芯工程师线上讲解 (直播画面截图)

  并且,兆芯在2020年10月,再次向VIA购买了“知识产权(不含专利权)”,花了2.574亿美元,约为16.75亿人民币。在相关报道中VIA提到它在美国的子公司“Centaur”仍然会继续设计基于x86指令集的CPU。我有些不太明白,兆芯一直在宣传它的CPU都已经是由国内团队设计,那么它花了2.574亿美元向VIA购买的不含专利权的“知识产权”是什么东西?VIA也已在多年前就放弃了x86 CPU业务,那么它的子公司“Centaur”设计的x86 CPU怎么处理?

  兆芯花的2.574亿美元这个价格,让我想起了海光购买AMD的Zen微架构花掉的2.93亿美元。但由于AMD的协议限制,海光的CPU只能用于服务器,不能用于桌面电脑,因此海光的直接对手不会是兆芯,要不然同为x86指令集的CPU,兆芯该如何竞争?

  除了使用VIA技术的兆芯和使用AMD技术的海光,还有使用Intel技术的“津逮”也对代替进口CPU很有兴趣。若干年前全世界有三大x86 CPU企业,如今这三家又以另一种方式重聚在另一个战场。如果说兆芯和海光是分别使用VIA和AMD提供的IP进行修改,那么来自“清华大学”、“澜起科技”、“Intel”合作的“津逮”CPU则是使用一种异常粗暴的方式披上了“国产”外衣——由Intel提供“至强”CPU的die(封装成芯片之前的祼片),加上一个“安全芯片”一起封装在CPU壳子里。“安全芯片”的具体作用是“实时采样处理器I/O和内存数据并进行指令重演,从而实现对内置的X86处理器的动态监控,发现并处理异常的处理器行为”。对于这一说法,技术方面我不作置评,Intel是不是“承认”自己的CPU确实存在“异常行为”我也不愿多想。只是有些问题不明白:为什么一定要封装在CPU里面和CPU一起卖?装在主板上做成“安全主板”不可以吗?使用Intel提供的die进行封装是否能提高我国的CPU设计和制造水平?对国内CPU技术发展的意义在哪里?

  华为也携着鲲鹏920加入了战场,这一系列32至64核的CPU使用的是与飞腾相同的ARMv8指令集,但在性能方面远超飞腾。早在2014年年初的时候,华为就找龙芯合作开发基于ARM64架构的CPU核心,打算做成服务器CPU。龙芯的胡伟武觉得华为很靠谱,但觉得ARM的ARM64架构不靠谱,于是就婉拒了合作要求。后来华为直接与中科院计算所合作,用优厚的待遇从龙芯中科“借”走了一些技术人员!不过大家殊途同归,都是在为国产软硬件发展而努力,星星之火散播出去本就是为了风火燎原。华为无论是研发还是经济实力都很强大,可以从全世界聘请CPU技术专家,用海量的资金进行各种实验。鲲鹏920使用了最新的7nm制程,在当时的国产CPU中无论单核性能还是多核性能都是最强(排除海光和津逮,那分别是AMD和Intel设计的核心)。当外界谣传鲲鹏920是买ARM的A72/A75核心来魔改的时候,龙芯胡伟武在中央电视台的屏幕上明确说明“华为的鲲鹏也是自研核”,为华为站台。只是由于CPU的生产环节不可控,鲲鹏920出师未捷,飞腾在被惊吓一番后,得到了华为许多未完成的订单补偿了心理阴影。

龙芯的指令集有多少条(龙芯LoongArch指令集)(18)

华为宣传PPT拍照

  说到CPU的生产环节,这是整个国产硬件生产环节中最难以完成的项目。CPU设计对产业基础的依赖比较小,更重要的是研究人员的能力,但龙芯、申威、飞腾等花了十几二十年也培养出许多本土专家了,这方面已经不再是问题。而CPU的生产对工业基础的依赖太大,精密机械、光学器件、乃至化学工业……任何环节有缺失都会被美国卡住脖子。华为就是低估了风险,才导致鲲鹏920夭折,这本不是华为的错,但相对龙芯和申威的稳扎稳打,又显得国内其它的CPU企业都太冒进。这大概也是因为龙芯和申威与其它CPU企业目标不同,而造成了对生产工艺的选择标准上存在差异。申威的任务主要是保障超算CPU自给自足,龙芯则想要保证各行各业的服务器和台式机信息安全。对它们来说,赚钱是保障持续研发的手段而不是目的,故而它们在CPU制程选择上都极为保守。因为对于设计完成的CPU,相同制程下改换工艺容易,把落后制程改成先进制程也容易,但即便以华为的实力也做不到把鲲鹏920的制程从7nm改成28nm。

  一个CPU核心的性能可以表示为IPC(Instruction Per Clock)×频率,IPC就是一个核心每个时钟周期执行的指令条数,但是因为这个单位太小,所以现在大家通常把Spec2006/2017测得的单核得分折算到1GHz后的结果称为IPC,即“分数/GHz”。频率不能单独表示性能,比如十几年前的奔腾4就有3.8GHz的频率,但与现在相同频率的CPU相比,单核性能根本不能同日而语。CPU的频率可以通过微调设计和更新工艺的手段得到提高,而IPC则只能通过设计得到。对CPU核心的设计能力是CPU性能不断提高的根本保证,CPU核心的设计水平决定了性能的下限,工艺和频率决定了性能的上限。如果一款CPU使用陈旧的工艺也能达到较高的性能水平,无疑说明设计了能力的优秀。在优秀的设计能力加持下,只要使用更先进的工艺就达到到更高的频率,得到更高的性能,当前的龙芯3A4000就是这样一款产品。3A4000和3A3000使用同样陈旧的28nm制程,但得益于设计水平的提高,3A4000的IPC大幅提升,频率也从1.5GHz提高到了2.0GHz。与AMD的28nm制程的“挖掘机”相比,3A4000核心更小,功耗更低,但却以一半左右的频率达到与了“挖掘机”相当的性能水平。而即将发布的3A5000,是对3A4000核心设计进行改进后使用14/12nm制程,IPC和频率继续提升,整体性能也能得到极大提高。

  十多年前的“龙芯二号”系列在“中X国际”、“台积电”、“意法半导体”都流过片,后来龙芯三号”系列主要在意法半导体流片。

  龙芯3A1000和3B1000都使用意法半导体的65nm工艺;

  龙芯3B1500使用意法半导体与三星合作的32nm工艺,期间换成了28nm工艺后发现由于厂家问题导致良率极低,又改回了32nm;

  龙芯3A2000是使用中X国际40nm工艺生产,相对于之前使用的32/28nm工艺倒退了不少,CPU主频甚至低于意法65nm工艺的3A1000。由于磨合时间过长影响了3A3000的进度,期间某引进的CPU大肆攻击自主CPU性能不行,要求在已有的自主信息化应用验证中换掉龙芯,而且确实换掉了一些;

  龙芯3A3000有两个版本,公开销售的版本使用意法半导体28nm工艺生产,主频1.5GHz,保密用途的版本在境内流片但主频仅1.2GHz;

  龙芯3A4000仍然使用与3A3000完全相同的制程和工艺,但凭借成熟的设计能力把IPC提高了50%,把主频也提高到了1.8~2.0GHz,整体性能是3A3000的两倍。尝试超频的爱好者在不附加额外散热的条件下,普遍能超到2.1~2.2GHz稳定运行;

  龙芯3A5000最初计划使用16nm工艺,但随着境内工艺制程水平提高,计划被变更为14/12nm工艺。目前由于尚未发布,还不确定它是在中X国际还是在南京台积电流片,只是据网友推测在南京台积电流片的可能性更大。目前发现了一些被无意中泄露的测试成绩,相对3A4000有很大的提升,部分测试项目目前来看提高了50%以上,但整体情况还是只能等到发布会之后才能知道。

龙芯的指令集有多少条(龙芯LoongArch指令集)(19)

龙芯 3A5000-LL(低功耗) ES(工程样品/测试版)流片归来

  在今年,国产推广的规模将会进一步扩大,各家CPU企业都会施展浑身解数,竞争更加白热化。由于华为提前离场,海光被AMD背刺一刀的影响还没消除,津逮直接使用Intel的Die换壳封装的国内技术比例存在疑问,兆芯当前状态比较消极,申威继续保持微笑,剩下的有能力争得头筹的选手恐怕只剩下了龙芯和飞腾。龙芯的3A5000即将问世,预计单核性能再提高50%,飞腾PPT上单核性能翻倍的D3000还未见踪影,我觉得当了二十年备胎的龙芯最有可能成为今年国产CPU的销量冠军。

龙芯要给自己加加担子,超脱备胎身份

  龙芯即将发布的3A5000有个最重要的特点,就是改用了自己设计的指令集——LoongArch。这是龙芯在备胎生涯中首次用明确的行动展露野心!

  近年美国为扼制中国发展而采取的手段越来越卑劣,MIPS对龙芯在商业上的牵制和干扰也会随之严重,尽管它远比x86和ARM弱小。龙芯是以设计完全自主与可控的CPU为目标,在二十年前选择MIPS是为了自主与可控,在十年前购买MIPS指令集的商业授权也是为了自主与可控,现在抛弃MIPS指令集也仍然是为了自主与可控。在不同的历史阶段,根据当时的情况做出不同的抉择,都是为了最重要的那一个目标。

  除了申威,国内其它CPU企业大多不会像龙芯这样偏执。通过购买知识产权的使用权或所有权来实现自主与可控才是流行的做法。就像小服装厂老板找大厂买些淘汰款式的授权,照着图纸生产出来卖往落后地区,只要比当地土著自己设计的更加新潮,就不愁没有收入。当土著设计的服装达到了相当的水准时,小服装厂老板再去求购几套淘汰款式,就能周而复始。龙芯为了追求狭义上的自主,而令在市场上销售的难度增加,不一定就是正确的方式。

  2015年龙芯的扩展指令也已经设计得比较全面了,也计划好了未来的发展路线。通过二进制翻译打通各种指令集壁垒的设想,在技术上已经验证通过,龙芯刚刚脱贫,就立下了收割x86和ARM的生态的壮志。不过要把这些设想一一施行,需要庞大的工程量和资金,可是龙芯没钱。有好的想法却没有资金去实现,急得龙芯总裁胡伟武在3A2000的发布会上直言:“建立一个大同的生态体系……现在缺钱,有钱招人就可以干”。收割x86和ARM的生态、挖Intel和ARM墙角的思路太过匪夷所思,与会观众大概都没有在意。龙芯屈从于现实,二进制翻译也没再提起,要想生存就必须继续依托MIPS兼容的特性满足客户需求,根本不敢再让客户知道抛开MIPS发展自主指令集的设想。要想让客户和投资者支持自主指令集发展,也许干掉MIPS也是个可以尝试的思路,龙芯已经是MIPS唯一的桌面处理器,MIPS能够在商业上对龙芯造成干扰,龙芯自然也能对MIPS施加影响。

  MIPS的活力一年不如一年,为了重获新生,2019年初,与旧版指令集不兼容的MIPS R6指令集宣布开源。但龙芯不加理会,明确表示会继续沿用MIPS R3/R5,最有份量的MIPS兼容CPU企业拒绝跟进,使MIPS R6的影响力降至冰点;2019年末,在龙芯3A4000发布前夕,MIPS又宣布闭源,也没能在业界激起波澜;龙芯LoongArch指令集的消息公开之后不过几个月,拥有MIPS版权的Wave Computing公司宣布破产清算,然后完成重组转向RISC-V指令集。虽然这些事件可能都是独立发生和发展,但时间顺序确实是这样的。特别是美国的“帮助”,让客户们对MIPS也产生了疑虑,龙芯要转换到自主指令集,并没有引起太多的反对,由于龙芯承诺以二进制翻译方式完美兼容原来的MIPS应用,连反对的理由都已经失去。

  通过二进制翻译打通指令集壁垒很可能只是理想,既然Wave Computing都转向了RISC-V,为何龙芯不转向RISC-V而一定要推出自己的指令集LoongArch呢?我认为有两方面原因,一是因为RISC-V指令集很小,可以用很少的晶体管实现指令集功能,CPU成本低,频率高。但也因此难以承载复杂的软件应用,无法在任何应用中都保持合理的性能。二是因为拥抱开源不等于完全自主,除非开源的是自己的东西,以自己为主。龙芯将会为LoongArch组建“自主指令系统联盟”,不但开放指令集,还会开源部分IP核源码,这才是完全自主与可控的开源项目。

龙芯的指令集有多少条(龙芯LoongArch指令集)(20)

龙芯胡伟武在计算机协会在线会议上讲解LoongArch (PPT直播画面截图)

  如果说在龙芯诞生之初就自行设计指令集,会像新手画画一样拙劣粗陋,那么在对CPU进行了二十年研究之后,特别是对指令系统持续十多年的研究实验之后,龙芯现在已经成为了最高明的画师,能够胸有成竹游刃有余地设计全新的指令集。除了二进制翻译之外 ,MIPS指令集自身的潜力也已被龙芯挖尽,多年来自行扩展的大量指令也占光了MIPS架构预留的指令槽,MIPS本身的设计也已经陈旧,成了龙芯继续提高性能的阻碍。LoongArch在设计上比MIPS更加合理更加先进,在仿真测试中,相同的应用程序编译为LoongArch比MIPS有平均16%以上的性能提升。

  也就是说即将发布的3A5000在相同的频率下也可能比3A4000提高16%以上的平均性能,这甚至超过了Intel每代CPU的花费数十亿美元研发费用带来的成就。Intel也曾经做过类似的尝试,为解决x86历史负担越来越重的问题,Intel研发了IA64指令集,但因不兼容x86而在市场上没能获得成功。那么龙芯的LoongArch是否也会面对同样的问题呢?同样的问题肯定是会有的,但龙芯与Intel有个最大的区别,那就是体量,龙芯的体量恐怕比Intel的一个研发部门都小。

  龙芯的桌面和服务器CPU在市场上的绝对数量本就不多,其中大多数还是用在长期不需更新软件的场合。龙芯的软件生态十分弱小,当前党政办公使用的大多数应用软件本来就是国内软件开发商的作品,参与国产推广的操作系统和应用软件项目本就需要支持x86/ARM/MIPS/SW64多个版本,再多一个LoongArch并不是多大的负担。现在天时地利人和,与几年前的情况有了很大的区别,即使不考虑二进制翻译的存在,龙芯也可以为了推广LoongArch而停止生产销售MIPS兼容的CPU,可以放缓对原有CPU的软件更新而全力开展对LoongArch的软件支持,这样的事情Intel不可能做得到。Intel不可能为了推广IA64而全面放弃x86,龙芯却没有相同的负担。由于保留市场的大量需求还能存在一两年,龙芯哪怕像申威那样从0开始重新积累软件生态,也不会缺少勇气。何况龙芯专门设计了二进制翻译指令集来应对新指令集生态真空的情况,不仅原本的MIPS软件可以高效运行,还能运行x86和ARM的应用程序。只是在初期可能对x86和ARM兼容性不好,因为龙芯的二进制翻译方案不是纯硬件也不是纯软件,而是软硬结合的方式,软件方面的调试可能需要花费较长的时间。

  推广自主的LoongArch指令集,信创推广国产设备就是最好的时机,只要LoongArch在国产计算机中得到大量的使用,就能够发展出基本的软件生态,能够满足普通办公和常规的服务器应用。有了这个基础,就算是取得了面向普通电脑用户推广的资格。等到了这个阶段,龙芯就不再是Intel/AMD的备胎,而是成为能够与Intel/AMD等同台竞技的角色。如果二进制翻译能够达到预计的效率,打破指令集的壁垒,那么龙芯能够建立的,就不只是第三生态,而是可以创造一个能够容纳各种系统环境、各种软件生态的无边世界。可能这个目标很难实现,但这是龙芯的理想,如果没有理想,那么“龙芯”早就会像“方舟”那样消失,不可能勇对磨难、踏平坎坷,成为国产CPU企业中的佼佼者,更不可能憧憬更加美好的未来,以雄心勃勃的姿态创造新的时代。

【转自guee】

,