长篇干货 | 从Intel和ARM争霸战,看看做芯片有多难!!!
[导读]一碗牛肉面,真的要用牛肉,真的要用面,真的要炖很久,这么简单的道理,偌大一个国家,这么多精英,过去这么多年了,咋就不能懂呢?
新智元专栏
作者:torvaldsing
【新智元导读】为什么中国做了30年芯片都没有出现英特尔、ARM这样的巨头?关键在于国产CPU缺少强大的生态系统。有着十余年芯片行业经验的torvaldsing投书新智元,把x86生态系统和ARM生态系统的艰难发展历程和残酷的市场竞争大起底。最后呼吁马化腾:请借助腾讯的强大生态,把CPU和OS这两个老大难问题给OTT掉!
这几天中兴事件持续发酵以来,各种议论纷纷扰扰。
上周,新智元推送了《中国芯“逃兵”:缺芯是因为缺钱;中国芯“老炮”:芯片救国靠BAT不是开玩笑》一文,引起了无数从业者热议。
有十余年芯片从业经验的水木网友torvaldsing告诉新智元,这几天对他触动最大的,还是碧树西风写的这句话:
一碗牛肉面,真的要用牛肉,真的要用面,真的要炖很久,这么简单的道理,偌大一个国家,这么多精英,过去这么多年了,咋就不能懂呢?
做芯片很难,做核心芯片更难,做需要生态系统的CPU芯片,比大家想象得都要难。
因此,torvaldsing投书新智元,尝试谈一谈x86生态系统和ARM生态系统的艰难发展历程和残酷的市场竞争,向大家介绍一下做CPU的各种困难,以及眼下能看到的一线希望。
以下是torvaldsing的雄文:
我尽量写得轻松一些,因为其实这个话题很有趣,仔细探究起来,很多看似爆炸性的新闻,其实草蛇灰线伏脉千里,在很早之前就发端了,这其中的故事,真的像演义小说一样好玩。
本文会罗列很多的往事和参考资料,保证有诚意。一些地方没忍住加上了一些三脚猫的分析,欢迎拍砖打脸。
(本文约1.3万字,建议先收藏后阅读)
x86生态系统
如今Intel在服务器市场占有率近乎100%,在桌面市场也大于80%,再加上Intel一贯重视宣传,在普通大众的心目中,Intel就是芯片的代称,甚至是高科技的代称。但Intel并非生而如此,它的牛X千真万确是熬出来的,是在列强环伺的竞争环境中杀出来的。
称王
七十年代,在搭上IBM PC这趟快车之前,Intel的8位处理器已经很成功,但也有很多竞争者,Zilog是其中翘楚,它研发的Z80系列产品和Intel的8080兼容,性价比高。一直到90年代,中国很多大学的微机实验课,还在用Zilog的板子。当时还有一款处理器风头不逊于8080系列,即MOS公司的6502。后来MOS把6502的ISA(指令集架构)授权给了众多厂商,流传甚广。70年代苹果创立之初的Apple-I和Apple-II,80年代任天堂的红白机,90年代初的小霸王学习机,90年代末的文曲星,都使用了6502系列的CPU。
IBM PC给了Intel和微软大发展的机会。但它俩必须面对竞争。IBM PC是IBM主导下的一个开放标准,各个零部件都是可以替换的。所以才有了“兼容机”的概念,和延续至今的装机市场。当时IBM要求Intel必须把x86指令集授权给其它厂商,避免CPU供应商一家独大。(详细的x86兼容处理器生产厂家列表见https://en.wikipedia.org/wiki/List_of_x86_manufacturers)IBM自己也有生成x86兼容CPU的权力。同时,为了限制微软的MS-DOS,IBM自己也做DOS操作系统,名为PC-DOS。
在IBM PC阵营内部,Intel面对其它CPU供应商的竞争,在阵营外部,还要和苹果的Macintosh电脑竞争。当时苹果已经换用Motorola 68000系列CPU,性能强劲,图形界面诱人。当时用Mac的人,逼格要高于用IBM PC的人。
Intel顶着阵营内外的竞争压力,苦心孤诣地发展壮大。这时候潜在的威胁在慢慢酝酿。从1981年的RISC-I开始,精简指令集(RISC)逐步流行起来,诞生了一系列RISC风格的CPU:1985年MIPS公司推出第一款商用的RISC芯片,HP公司在1986年推出PA-RISC,SUN公司在1987年推出SPARC,Motorola在1988年推出MC88000。当时大家普遍认为RISC优于以x86为代表的CISC风格CPU,就连Intel和AMD也害怕在RISC潮流中落伍,AMD在1987年推出了AM29000,Intel在1988年推出了i860/i960。
开始时RISC似乎并没有威胁到桌面市场,MIPS、PA-RISC、SPARC全是用来做服务器和工作站的。被苹果流放的乔布斯用MC88000系列CPU做NeXT桌面电脑,铩羽而归。1986年,英国的Acorn公司推出了一款名为ARM的RISC处理器,次年,它还配了个操作系统叫RISC OS,强攻桌面市场,可惜最终只在英国掀起来了一些波澜。
1991年,RISC阵营实实在在地杀入桌面市场。这一年,IBM看到在PC阵营里,Intel和微软这两个小弟坐大,慢慢不受自己的控制,索性拉拢Apple和在RISC市场不得志的Motorola,推出了PowerPC架构,由IBM和Motorola生产芯片,Apple做操作系统和整机,推出全新的Power Macintosh电脑。这三家组成了AIM(Apple-IBM-Motorola)联盟,气势汹汹地向Wintel联盟发起攻击。
结果是Wintel赢了,个中原因众说纷纭。有人说Wintel保持对已有软件的向下兼容,而Apple频繁更换底层的CPU,导致的不兼容气走了用户,然后由此强调软件生态的重要。我则以为,历史的发展有一定的偶然性,如果当时Wintel不是比尔盖茨和格鲁夫在掌舵,而Apple是乔布斯在掌舵,可能结局完全不同。2005年,乔布斯掌舵下的苹果,把Mac里面的CPU由PowerPC换成Intel的芯片,就完成得干脆利落,没怎么受到软件生态的牵绊。
总之,在80年代,大家就已经深深懂得CPU的ISA是软件生态系统的根基,不愿让这个“生态之根”被别人控制。整机和系统的制造商,通过强制CPU厂商给其它厂商授权自己的ISA,来保证有第二家甚至更多的供应商。如果不慎“生态之根”被别人控制了,例如IBM被Wintel篡了权,甚至不惜另起炉灶来竞争。
同样是把自己的指令集授权给其它厂商,Intel把几乎所有的其它供应商都挤死了,只省下AMD苟延残喘;MOS则销声匿迹了,完全靠其它生产商把6502系列延续到了二十一世纪。造成这一差异的原因纵有千万条,我想“打铁还需自身硬”是最根本的。
霸业
在桌面市场上,Windows 95和Windows 98这两款操作系统,让Wintel联盟登上了霸业的顶端。从1995年到2003年,Intel看起来简直是不可战胜的。
与此同时,Intel还把几乎所有的RISC架构的CPU都干趴下了,占领了服务器市场。原因大概有这么几点。
第一,从技术角度讲,RISC是一种设计CPU的理念,而不是具体的某一种ISA。像x86这样的复杂指令集,其实在实现过程中,也能借重RISC的理念。1989年的80486,已经隐隐地可以看到RISC风格的流水线,1995年的Pentium Pro,其核心已经是一个乱序执行的RISC了,只不过多了一个复杂的译码逻辑,把x86指令拆分成RISC风格的微操作。因此从技术角度讲,RISC指令集未必比x86有优势。
第二,RISC成也UNIX,败也UNIX。UNIX和C语言树立了很好的软件开发传统,确保同一套代码可以很方便地在不同CPU之间移植。80年代,一大堆RISC架构的CPU,都可以很快配上自己的UNIX,很快把已有的C语言编写的应用跑在CPU上,然后就可以卖了。SUN公司的SPARC配有Solaris,HP公司的PA-RISC配有HP-UX,IBM公司的PowerPC配有AIX。
这些林林总总的UNIX变体,反过来又进一步促使UNIX生态系统中软件开发人员重视代码的可移植性,大家都很小心地围绕POSIX标准来编程,避免过分依赖于某个操作系统独有的功能。这样,一旦Intel芯片携Linux(一种开源的UNIX变体)来和RISC架构的工作站竞争,软件应用就纷纷以很小的移植难度,离开了昂贵的专有UNIX工作站。
第三,当时PC市场比服务器市场大得多,Intel在PC市场的盈利帮助它研发更好的服务器芯片,巨大的出货量降低了芯片的制造成本。研发优势和成本优势,奠定了Intel最终胜利的基础。
这段时间,Intel还几次面临挑战,每次都成功保卫了自己对于生态系统的掌控权。
第一个挑战,来自Internet浏览器。Netscape Navigator诞生后,对微软和Intel都是挑战。虽然当时的动态网页还非常初级,但是已经有人喊出“Web is the computer”的概念。等到Java Applet出现之后,大家更是觉得可以在网页上实现桌面应用的效果,未来只需一个浏览器,就能取代桌面。Netscape的Marc Andreessen在1995年,就着手把Netscape浏览器打造成一个Internet OS。以那个时代的软硬件水平,毫无疑问地,这些尝试失败了。
用一个高层次的软件API,兜住所有的上层应用,然后让底层的硬件,都来支持这个API——这个主意不单单在技术上看起来很炫,从商业上,这是上层应用厂商消解底层平台厂商生态霸权的终极武器。因此,在那之后的二十年里,商业上的尝试一直在持续,包括:
1. 腾讯开发的WebQQ和Q+,在网页里面提供一个类似Windows桌面的应用场景,后来失败了,回退到功能单一的SmartQQ。个中原因,我个人认为还是那个时代的PC性能不够。
HTML5和Java实现手机App的功能,可以横跨iOS和Android。
3. 谷歌推出ChromeOS和ChromeBook笔记本,里面跑的应用,全都是基于HTML5和Java的。
我个人认为,微信小程序几乎一定会成功,它一旦成功,腾讯必然会重燃在PC平台上做Q+的野心。Intel在桌面的霸权,最大的威胁不是AMD,也不是ARM,而很可能是HTML5+Java,熟悉“降维打击”的人,对此不会感到意外吧。
第二个挑战,来自虚拟机(Virtual Machine)和JIT(Just-in-time)编译器。先锋是Java的虚拟机JVM,后来微软也推出了DotNet虚拟机,支持C#等语言。虚拟机有一套虚拟的指令集,源代码先被编译到这个虚拟的指令集上,在程序运行时,JIT编译器再把这套虚拟指令集编译为CPU的原生指令集。面向虚拟机开发的程序,例如Java Applet,可以在不同的CPU和操作系统平台上运行。
如果有某个虚拟机,它的指令集可以无缝支持所有的编程语言,还能保证高效率,那么所有CPU的都将被OTT(over-the-top)了,就像短信被微信OTT一样。可惜还没有一个虚拟机可以实现此目标。现在大家熟知的虚拟机,都是和语言绑定的,例如JVM只支持Java、scala、kotlin等;DotNet虚拟机只支持C#、VB.net等;V8只支持Java、type等;HHVM只支持PHP。
同一个VM上跑的语言相互调用很容易,跨VM很难互操作。由于虚拟机实在太多了,它们反而成了新的CPU架构的拦路虎:80年代只需要搞定C语言编译器就能卖Unix工作站,如今ARM服务器要想挑战Intel,必须把所有这些基于VM的编程语言都支持得很好,JIT编译器的效率都要做得比较高才行。
第三个挑战,来自Transmeta公司对x86指令集的Emulation(Emulation这个词很难翻译,索性不翻了)。简单地说,Emulation就是把x86指令集看成一个虚拟机的指令集,然后用类似JIT编译器的技术,在非x86的CPU上跑x86的程序。未经许可用别人的ISA做CPU是违法的,但用Emulation的方式实现ISA则不违法(Intel和Transmeta只打过专利的官司没打过ISA的官司,Intel还输了)。
如今最广为人知的Emulator是Qemu,上文提到的x86、MIPS、PowerPC、Sparc、MC68000它都可以支持。一般而言,Emulation会导致性能下降一个甚至若干个数量级,根本不足为虑。
1995年,Transmeta公司成立,经过艰苦的秘密研发,于2000年推出了Crusoe处理器,用Emulation的方式,在一款VLIW(超长指令字)风格的CPU上执行x86的程序,这样就规避了没有x86指令集授权的问题。Transmeta的牛X在于,虽然是Emulation,但实现了接近Intel处理器的性能,同时功耗低很多。2000年年底Transmeta的IPO大获成功,其风光程度,直到后来谷歌IPO的时候才被超过。
Transmeta最后还是失败了,Intel在渠道上打压它是次要原因,性能不足是主要原因。虽然VLIW在90年代中后期被广为推崇,但事实证明,它的性能比起乱序执行的超标量架构,还是差一截。另外Transmeta的芯片是在台积电制造的,那个时候不比现在,台积电的工艺水平比起Intel还差很多。2000年的时候,PC还远没有性能过剩,性能还是比功耗重要。等到2010年,Intel的Atom处理器慢得一塌糊涂,依然靠着低功耗,点燃了上网本的大火。
Transmeta虽然失败了,Emulation技术仍然在发展。NVidia在2008年购买了Transmeta的低功耗技术的授权。2014年,NVidia推出了Tegra K1芯片,其中的Denver处理器,利用Emulation技术,在底层的7路超标量架构上,实现了ARM64指令集。值得注意的是,NVidia拥有ARM64的指令集的授权,它不是用Emulation技术来规避什么,而是用Emulation来提升性能,实现比硬件直接执行还要高的性能。根据评测结果,Denver超过了当时苹果最好的手机CPU。近期推出的Denver2处理器的,性能更是秒杀苹果的A9X和华为的麒麟950。
Emulation技术如果真的发展到了比直接执行还要快,Intel的麻烦才刚刚开始。微软联合高通,推出基于SnapDragon835处理器的笔记本,运行Windows 10操作系统,上面可以安装x86的软件。Intel虽然很不爽,但Emulation并不需要指令集授权,所以他只能警告说,在实现Emulator时,不许侵犯Intel的专利,而这一点,微软和高通肯定早已考虑到了。
挫折
x86生态系统曾经面对过一次最严重的、近乎灭顶之灾的挑战。这次挑战来自于谁?就来自于它的缔造者Intel。
Intel心不甘情不愿地把自己的x86指令级授权给了AMD等一众供应商,眼睁睁看着他们分享自己的利润,很不爽,于是想在x86之外另起炉灶,建设自己独享的生态系统。正巧在90年代初期,升级64位计算成为一个风潮,1991年有MIPS R4000,1992年有DEC Alpha,1995年有SUN SPARC64。1994年开始,Intel联合HP,准备趁32位升级64位的时机,抛弃原有的x86架构,新推出一个EPIC(Explicitly Parallel Instruction Computing)架构,名为IA64(Intel Architecture 64-bit)。
x86架构兼容老旧应用程序的能力是出了名的。8086把8位的8080升级为16位的时候,80386升级到32位的时候,都完全兼容旧有的程序。直到今天,Intel的处理器依然支持虚拟8086模式,在此模式下,可以运行30多年前的8086程序。升级到64bit的时候,Intel居然要放弃所有之前的8位、16位、32位应用了!可想而知当时在业界会引起怎样的轩然大波。Linux的缔造者Linus Torvalds公开对此表示反对。
IA64进展得并不顺利,EPIC本质上就是一种VLIW,如前所述,VLIW的性能比乱序超标量要差。而且EPIC的编译器非常难以开发。原定1997年就会推出产品,但直到1999年才发布IA64指令集,2001年才推出产品。另外Intel也不敢完全放弃之前的32位x86应用,它给出的解决方案是Emulation,但EPIC不像Transmeta为Emulation做了很多专门优化,跑32位x86应用的性能很差。
这个时候,千年老二AMD站了出来,为x86续命。2000年,它推出了AMD64指令集,延续了x86架构兼容老旧应用程序的优良传统,可以原生执行8位、16位、32位的老程序。2003年,AMD推出Opteron服务器CPU和Athlon64桌面CPU。
AMD64从技术上和生态上都压了IA64一头,Opteron在服务器市场上为AMD赢得了前所未有的成功。2004年,Intel推出了代号为Nocona的至强服务器CPU,它支持一种称为EM64T的技术,EM64T就是AMD64的马甲。江湖有传言说,Intel曾想提出另外一套不同于AMD64的x86升级64位的方案,但微软为了避免x86生态的分裂,极力阻止了。2012年,Intel推出了最后一代IA64的CPU,关闭了这个不赚钱的产品线。
回顾这段历史,有几点特别令人感慨。
首先,即使是看似无比强大不可战胜的Intel,不顾生态系统中其它伙伴的利益,一意孤行也是会撞南墙的。
其次,幸好由于历史的原因,x86生态中,AMD和Intel是交叉授权的关系,AMD有权加入3DNow这种多媒体扩展指令,也有权加入64位指令,如果是像如今ARM的架构级授权方式,被授权的企业不能自行加以扩展,那可能还真没有办法阻止Intel了。
最后,Intel的执行力还真是超强,掉头极快,EM64T的CPU只比AMD64的CPU晚出了一年(当然不能排除Intel早就有备份方案)。
虽然在IA64上栽了跟头,但Intel靠着自己的技术实力,持续不断地推出性能和功耗表现更好的产品,AMD在64位战役中所取得的优势,慢慢也被消磨掉了。
岁月如梭。进入移动互联网和云计算时代之后,服务器的需求量上升。这时RISC架构的服务器CPU几乎快被消灭干净了,只剩下IBM Power奄奄一息。于是Intel几乎独享了服务器市场扩大所带来的红利。但它却高兴不起来,因为移动市场形成了ARM一家独大的局面,移动终端CPU这个市场,Intel怎么也挤不进去。
正巧Intel在刚刚火过一把的上网本市场里设计了一种低功耗的x86核心,即Atom。Intel以Atom为武器,杀入了手机芯片市场。2012年,Intel的老伙计联想,推出了第一款Intel芯片的手机K800。紧接着还有Motorola的XT890。2013年,中兴、华硕也有产品问世。但三星、小米、华为、OPPO、VIVO等出货量大的厂商,都没有采用Intel的芯片。这些手机大厂,看看x86生态中做整机的联想如何艰难度日,估计心里也是一万个不乐意让Intel到移动领域来继续称王。
到2014年,Intel芯的手机还是没有打开局面,市场唱衰之声一片。但Intel并不想放弃。手机攻不下,那就攻平板!大厂攻不下,那就攻白牌!嫌我的芯片贵,我就给补贴!又过了两年,平板也没有攻下来。在移动市场赔了上百亿美金的Intel,黯然离场。
Intel失利的原因众说纷纭,我觉得根本原因还是竞争力不足:
首先,这个时候的台积电已经不是Transmeta家Crusoe芯片诞生时的吴下阿蒙,它生产的手机芯片的功耗和性能并不输给Intel;
其次,这次Intel并无生态系统的优势,要靠名为houdini的Emulator来执行ARM指令集的程序,性能打了折扣。试想,Intel芯的手机如果性能和待机时间都是iPhone的两倍,谁能抵挡得住这种诱惑?
几乎在进攻移动市场的同时,Intel也在推出产品试水物联网市场,只不过没有大举宣传。2013年10月,Intel推出一款叫做伽利略的Arduino开发板,上面的CPU叫做Quark(夸克)。Quark是比Atom(原子)还小的基本粒子,这个名字暗含着轻巧、低功耗的意思。接着,Intel在2014年的CES大会和2016年的IDF大会上,先后推出了升级的爱迪生和焦耳开发板。
Intel的大名和Arduino联系在一起多少有些奇怪。Arduino是一套可以跑在低端MCU上的C语言函数库,是电子创客们的最爱。淘宝上Arduino开发板才几十块钱。焦耳开发板上的处理器是4核心、1.5GHz,跑Arduino太浪费了。和它参数近似的Raspberry PI 3 Model B+开发板,四核64位ARM Cortex A53跑1.2GHz,淘宝价不到200块。焦耳开发板要369美元。谁会当这个冤大头?
物联网市场极度分散,有无数应用但规模都不大,Intel赚大钱习惯了,在这个微利又需要贴近客户做服务的市场里,百般不适。2017年,Intel悄悄停产了针对物联网市场的开发板。
Intel接下来所可能面对的挫折,是ARM侵入服务器和桌面领域。这个话题下文还会有简单分析。
ARM生态系统
近几年ARM风光无限,抢新闻头条的能力不逊于Intel。
在很多圈外人看来,这家高科技公司好像是在移动互联网时代新冒出来的,但其实它的历史和几乎和80286一样古老。而且它自诞生以来,就以移动(portable)设备为自己首要的目标市场。它等待一飞冲天的风口,等待了二十年。
发端
前文提到,ARM是Acorn电脑公司创造的。
Acorn电脑公司创立于1978年,在80年代初,它用6502系列CPU制造的BBC Micro电脑在英国大获成功。6502的性能慢慢跟不上时代了,Acorn想基于80286开发新的电脑,但是Intel连样片都不给——要是Intel大方些,ARM或许根本就不会诞生。
Acorn一气之下开发了ARM(Acorn RISC Machine),这是世界上第一款定位中低端(而非服务器)RISC处理器。1985年,ARM1诞生(但从未被商用),后来Acorn在1986年和1990年分别推出了ARM2和ARM3,1987年推出了RISC OS和桌面电脑Archimedes。它在英国的教育市场获得了一定的成功,但1990年之后,很快被Wintel的生态击败了。
1990年前后,研发掌上电脑成为一股风潮。当时有家叫做Active Book的公司,拿ARM2处理器开发一个叫做Personal Communicator的产品。可惜产品上市前,Active Book被AT&T收购了,AT&T把ARM2换成了自家的Hobbit处理器。
幸好东方不亮西方亮,当时的苹果公司看好ARM,把自己研发的Newton平台中的处理器,由AT&T的Hobbit,换成了ARM。这个“彼此互换”的故事听起来让人头大,大家只需要记住,ARM的第一颗商用处理器ARM2,就曾被尝试拿来做手持的电脑。
ARM的东家是Acorn,和苹果在电脑市场上有竞争。苹果公司花了6周时间说服Acorn把ARM独立出来运营。1990年11月27日,合资公司ARM正式成立,苹果、Acorn和VLSI分别出资150万、150万、25万英镑,Acorn把ARM处理器相关的知识产权和12名员工放在了新成立的公司里。此后,ARM的缩写被转而解释为Advanced RISC Machine。
为了节省成本,新公司在剑桥附近租了一间谷仓作为办公室,全力为苹果的Newton研发ARM6处理器(4和5这两个编号被跳过去了)。
Newton(牛顿)是苹果花大力气研发的触屏移动技术平台,Newton OS是不同于Mac OS的操作系统(如同后来的iOS)。如果你听过苹果、牛顿和万有引力的故事,应该能体会苹果公司对Newton平台有多么高的期望。
Newton平台的第一款产品MessagePad于1993年8月上市了,采用32位ARM610处理器,频率为20MHz,屏幕大小为336×240,重量410克,采用4节7号电池供电,售价699美元(相当于今天的1129美元)。可惜的是,它销量很差,上市头四个月的销量不过5万台。
1998年,中国的恒基伟业公司推出了一款叫做 “商务通”的产品,像极了Newton Messagepad。它采用Dragonball处理器,主频仅16MHz,屏幕大小10汉字x10汉字,重量105克,采用2节5号电池供电,售价人民币1988元。靠着“呼机手机商务通,一个也不能少”的广告,商务通在1999年大卖100万台。虽然2001年后商务通及类似产品很快就被越来越强大的手机挤出了市场,但让人好奇的是,背靠营销能力更加强大的苹果,Newton为何没能一炮而红?
其中一个重要的原因是,Newton重点宣传的手写识别功能表现很糟糕。而商务通对手写汉字的识别率——根据我个人的体验——还真是不错,考虑到它仅仅16MHz的CPU主频,能做到这么好简直是奇迹。当时商务通部分型号的卖点就是“连笔王”,对潦草的汉字识别得相当好。
软件对于一款产品的重要性,真的是生死攸关啊!
深耕
扯远了,让我们回到ARM的故事上来。
1990年ARM创立之初,给自己定下的使命是“设计有竞争力的、低功耗、高性能、低成本的处理器,并且使它们成为目标市场中广为接受的标准”,目标市场包括:手持设备(Portable),嵌入式(Embedded Control)和汽车电子(Automotive)。跨越近三十年,这个使命和市场定位始终未变,直到今天。
而且,根据我了解到的知识,ARM是处理器的源代码授权这一商业模式的开创者。如今,芯片设计从Verilog等源代码出发,经过一系列自动化或半自动化的优化步骤,最终形成工厂制造芯片所需要的版图文件;整个过程类似软件从源代码被编译为CPU的机器码。但在80年代,芯片的设计自动化非常原始。七八十年代的处理器授权,都是指令集的授权。Synopsys公司于1986年成立,1987年推出把Verilog编译为门级网表的DesignCompiler,之后基于源代码的芯片自动化设计流程才慢慢地被建立起来。于是源代码授权才成为技术上可行的模式。
ARM从未自己生产过商用的芯片。它只是将自己研发的处理器的源代码的知识产权(IP)授权给芯片厂商,由它们推出最终芯片。受益于这一商业模式,尽管在1993年,Apple的Newton失败了,但ARM并未因为设备卖不出去而亏钱,还幸运地拿到了TI的订单,于是成功盈利了。员工数量也由12人增长到了42人。次年ARM又拿到了三星的订单,员工增长到70多人,搬出了谷仓。
除了源代码授权的模式之外,ARM也做指令集授权,1995年,ARM把指令集授权给DEC,DEC很快设计出了性能更好的StrongARM处理器。1997年,StrongARM产品线被卖给Intel,更名为XScale。
1995年,Motorola在香港的研发团队基于MC68000指令集开发出了针对手持设备的DragonBall处理器,在这之后的十年,DragonBall处理器一直都是ARM强大的竞争对手。不但Moto自己的手机用它,Palm、三星、Sony的手机也用它。当然还有前文提到的商务通。ARM相对于Dragonball处理器有什么优势?我认为最大的优势是从客户需求出发的、持续的创新;其次是ARM的开放的商业模式。
RISC指令集一般都采用32位定长指令,代码密度比起x86之类的CISC来要差一些,但手机的存储空间有限,对代码密度的要求高。1994年,ARM为此专门研发了16位的指令集Thumb,以及支持这一指令集的ARM7TDMI。
开放授权的商业模式,使得整机厂在选择芯片时,可以找到支持同一指令集的多种芯片产品,不容易被绑架。Nokia作为和Motolora旗鼓相当的手机制造商,肯定不会选择竞争对手的Dragonball,而ARM的技术实力和商业模式,正好符合Nokia的需求。
1997年,Nokia推出了一代经典6110,它采用TI的芯片,处理器核心是ARM7TDMI。6110是Nokia第一款带红外接口的手机,第一次内置了经典的贪吃蛇游戏,它的界面成为了之后Nokia手机的标准。从此,Nokia和ARM成为了好基友,Nokia的Symbian操作系统,一直都建立在ARM架构的基础上。
1998年,趁着6110大红大紫的东风,ARM在Nasdaq上市了。同一年,SGI公司看到处理器IP授权生意有利可图,把MIPS部门拆分出来,次年MIPS推出了它第一款可授权的处理器设计M4K。此后的十年里,MIPS一直都是ARM有力的竞争对手。
商务通在中国流行的那几年,国际市场上流行性能更高的掌上电脑和智能手机,操作系统包括Palm OS、微软的WinCE、Nokia的Symbian、RIM的Blackberry OS,Motorola的Wisdom OS。在这个领域里,ARM阵营中负责高性能的XScale大放异彩,暴击Dragonball。当Dragonball的频率还停留在33MHz/66MHz时,Xscale已经飙到了200~400MHz。MC68000指令集在手持设备领域败走。Palm OS的1.0~4.0都是基于MC68000指令集的,5.0就换成了ARM。后来Motorola的半导体部门Freescale干脆推出了基于ARM核的iMX系列产品,替代Dragonball产品线。
苹果作为掌上电脑的先行者,却在这次浪潮里无所作为,在Wintel的挤压下,它的桌面业务都已经濒临绝境,无暇顾及其它市场了。1997年,不温不火的Newton从苹果公司独立了出来。当乔布斯回归苹果之后,又火速把Newton收编了回来,并且干净利落地停掉了Newton产品线——乔帮主只想要Newton手里的ARM股份。1998年到2003年,苹果通过出售ARM的股票获利11亿美元。这笔钱,是乔布斯复兴战略的重要燃料,可以说是苹果的救命钱。
绽放
经过多年的深耕,ARM在新世纪开始时,已经是手机领域里的王者,依然在为客户的需求做着持续的创新,Java加速技术就是一个典型的例子。
从2000年开始,功能手机的性能提升到了足够高的水平,人们希望在手机上玩比较复杂的游戏,而不仅仅是贪吃蛇。但是手机的处理器和操作系统实在是太分散了,为了方便游戏跑在不同手机上,J2ME平台应运而生。从原理上讲,J2ME和Applet并无不同,都是基于JVM的。Java在并不分散的桌面领域没有获得成功,但在分散的手机领域获得了成功。
J2ME的游戏越做越复杂,但手机的处理能力毕竟有限,桌面和服务器上的JIT编译器在手机上跑得太吃力了。于是ARM在2001年推出了ARM926EJ-S处理器,它支持Jazelle DBX技术,可以直接解码和执行Java的字节码,省掉了JIT编译器的负担。这一功能大受欢迎,帮助ARM9系列成为了迄今最受欢迎的ARM处理器,总共有250多个授权厂家,其中100多个授权的是ARM926EJ-S。
在MTK助推山寨功能机火遍神州的那几年,主控芯片所使用的核全部都是ARM9。在iOS和安卓的应用商店诞生之前,功能手机全靠J2ME开发的应用来实现各种炫酷的功能。从某种意义上讲,在低端市场上,Jazelle是助力山寨机火爆的最大幕后功臣。
然而高性能ARM芯片的扛把子XScale,却被Intel于2006年6月卖给了Marvell。这是Intel实施x86-everywhere战略的一个步骤。Intel希望x86的生态也能进入到低功耗的移动领域,而不是用自己先进的工艺制程和设计能力帮ARM建设高端应用的生态。22个月之后,2008年4月,低功耗的Atom芯片诞生了。
高性能ARM芯片的扛把子换成了苹果。2004年,在卖光ARM股票的一年之后,乔布斯决定研发iPhone。2007年1月,在Intel放弃ARM之后仅半年,iPhone诞生了。苹果可不会采用低端市场上死守ARM9那种玩法,iPhone一代就采用了400MHz的ARM11;2009年的iPhone 3GS,升级为600MHz的Cortex A8;2010年的iPhone4,苹果自研的A4芯片升级为1GHz的Cortex A8。接下来苹果自研芯片性能一路狂飙的历程,大家都很熟悉了。
从ARM6到ARM11,这些IP核都是按照兼顾移动设备、汽车电子和嵌入式这三个市场的思路来设计的。从2003年起,ARM把产品线有针对性地划分为A、R、M三个系列,分别对应上述三个市场,而且IP核的名字都统一加上了Cortex的前缀。Cortex A8就是A系列的第一个作品。iPhone 3GS和iPhone4令Cortex A8大火,但让ARM一飞冲天的推手,却是iPhone的竞争对手——安卓(Android)。
有很多文章介绍安卓如何诞生,如何在移动设备领域干掉了除iOS之外的全部对手,毋须赘述。这里只想强调一个被普遍忽略的事实:安卓从诞生之初,就要求应用程序采用Java编写,并且跑在Dalvik虚拟机上;但iPhone上的应用,都是原生的ARM程序。要知道Android手机的处理器性能相对iPhone并无优势。
山寨之王MTK于2009年2月推出的首款智能手机芯片MT6516,采用406MHz的ARM9;2008年~2010年间由HTC推出的那几款卖得很好的Android手机,也无非是ARM11和Cortex A8的核,几百兆的频率,这种级别的处理器跑虚拟机还是蛮吃力的。另外虚拟机占用内存大的缺点,也不利于用户体验和降低成本。
谷歌宁可冒着让安卓出师不利的风险,也要推广Dalvik虚拟机。这是为什么?谷歌内部的决策过程我们无从得知。一个合理的猜测是,谷歌不愿看到手机领域里ARM一家独大,它希望给MIPS、x86等其它CPU一个机会。J2ME的成功,让谷歌看到完全建立在虚拟机上的手机应用生态,是完全可能的。
Dalvik虚拟机可以跑Java,但并不采用JVM那种基于堆栈的字节码,而是改用一种基于寄存器的方案。这么做当然是为了规避SUN公司(后被Oracle收购)的专利,同时也让无法直接运行JVM字节码的MIPS、x86能够实现轻量级的JIT编译器,无须Jazelle这样的技术。从另外一个角度讲,MIPS在电视、机顶盒、游戏机市场上占优,x86在桌面市场近乎垄断,支持它们,也意味着安卓有可能进军电视和桌面。
安卓对所有CPU而言,都是巨大的机会,谁抓住了这个机会,就可以一举改变竞争格局,实现霸业。
只可惜MIPS公司太不给力,一直也没有搞定靠谱的MIPS版Android。等到2011年1月,Synopsys公司给自家的ARC处理器移植好Dalvik虚拟机和浏览器用的V8虚拟机、Android环境已完备的时候,MIPS都还没动静。顺便说一句,Intel曾经的南桥芯片里都有ARC处理器,它是Active Management Technology(AMT)的重要基石。
这个时候,北京的君正公司坐不住了。君正靠做低成本的MP4播放器起家,2011年5月在创业板上市。君正拥有MIPS的架构级授权,对自己研发的XBurst处理器非常自信,准备靠它进攻手机和平板市场。2011年7月,基于君正JZ4760的MIPS智能手机通过Android兼容性测试。2011年12月,基于君正JZ4770平台的平板电脑,被谷歌选为Android4.0的首发产品,一时风光无限。
ARM的强大软件生态此时起到了护城河的作用。基于君正的平板,软件兼容性出了问题。原因在于谷歌没有强求所有的应用都跑在Dalvik虚拟机上,对于部分对性能有苛刻要求的app,例如游戏,谷歌允许用CPU的原生指令集来开发,为此还提供了NDK(Native Development Kit)。对于那些包含了ARM原生指令的游戏,君正的平板要么不支持,要么用emulator支持,总之用户体验都不好。
ARM生态圈里,在2011年,正好有两家芯片厂商异军突起:全志和瑞芯微,它们分别推出了采用Cortex A8处理器的A10芯片和RK2918芯片,成本极低,主打平板和安卓电视盒子。君正的平板梦被它们粉碎了,之后只好转战安卓手表,消沉了很多年。对于MIPS而言,还有一个坏消息是,在它们的强力助推下,电视盒子市场也成了ARM的天下。经营不善的MIPS于2012年卖给了Imagination,Imagination不但没能依靠MIPS在CPU市场中有所作为,反而在GPU市场里也败给了ARM,在2017年被迫整体卖身,MIPS业务卖回给了硅谷公司。
2012~2016年,Intel在安卓市场上挑战ARM,也失败了。于是安卓给CPU带来的红利,全部被ARM吃掉了。随着手机越来越重要,ARM也越来越重要,它所推出的最新的Cortex A系列处理器,被手机芯片争相采用。ARM生态也越来越强大,它的触角,慢慢伸出了手机领域。
渗透
2011年1月,微软在CES宣布要为ARM架构开发Windows 8 RT操作系统。在2012年年底,几乎和Intel芯手机上市的同时,包括微软自家的Surface RT在内的一大批二合一平板设备上市了。Windows 8 RT不支持所有之前为x86平台开发的应用程序,这成为它最大的软肋,相关的产品慢慢销声匿迹了。ARM渗透桌面市场的第一次尝试失败了。
最近微软和高通所推出的ARM芯的Windows 10,吸取了教训,用Eumlation的机制来支持旧有的x86桌面程序。这次尝试能否成功,我们拭目以待。
2009年,ARM推出了Cortex A9处理器,并且用40nm的工艺制造了双核的样片,跑到了2GHz。这是ARM第一次推出乱序超标量的处理器核,而乱序超标量是Intel实现高性能的关键技术,这是非常振奋人心的消息。2010年,Marvell推出了1.6GHz的4核A9的服务器芯片Armada XP。2013年,这款芯片被部署在百度的存储服务器上,这是ARM服务器第一次大规模商用。但Marvell并未继续推出新的服务器芯片。2011年,一家创业公司Calxeda采用Cortex A9,推出了共有480个CPU核的ARM服务器。但它的成就还不如Armada XP,2013年公司就倒闭了。
2012年,AMD收购了一家做高密度服务器的厂商SeaMicro,准备把它所采用的CPU核由Intel的Atom换成ARM架构的CPU。但直到2014年AMD才推出8核Cortex A57的服务器芯片Opteron A1100,之后从来也没有认真卖过它。2015年AMD就放弃了SeaMicro这个子品牌,不再做高密度服务器了。
ARM进攻服务器市场的第一次尝试失败了。Marvell和Calxeda都采用的是32位的ARM核,先天不足;AMD则三心二意,毕竟自己还有x86 Server的生意。另外服务器市场对于单核单线程的运算能力也有很高的要求,仅仅有低功耗和高通量(high throughput)是不够的。
在ARMv8这一64位指令集发布之后,Cavium和AppliedMicro这两家老牌网络芯片厂商不约而同地将自己原先芯片中的架构换成了ARMv8。因为产品的需要,Cavium和AppliedMicro都有自行设计处理器微架构的能力,前者做MIPS处理器,后者做PowerPC处理器。它们两家做ARMv8处理器时,也都采用了只授权指令集,微架构自研的模式。Cavium共推出过两代基于ARM的产品(2014、2016年),AppliedMicro推出过三代(2013、2015、2017年)。随着产品性能逐渐接近Intel的Xeon E5,它们渐渐不再满足于原先的网络领域,开始觊觎服务器市场。
最让人期待的还是高通的Centriq芯片,2015年年底量产24核版本,2016年年底量产升级48核版本,还得到了微软的强力支持。考虑到高通还和贵州成立了合资公司华芯通,Centriq很可能成为在国内大规模商用的第一款ARM服务器芯片。
另外具有国防背景的天津飞腾公司,也有ARM服务器芯片的产品,只是不知道这些产品何时能在通用市场上铺货。
其他确定在研发ARM Server芯片的大厂还包括Broadcom和华为,进度上要略慢一些。
ARM阵营对服务器发起的第二波冲击,阵容要强大得多豪华得多。因此ARM才敢于宣称,在2021年拿下25%的服务器市场份额。
要做好Server CPU,ARM架构还有些功课要一点一点补。多Socket服务器所需要的一致性协议,业界刚刚取得共识准备采用CCIX,但还没有具体的产品出来。做云端虚拟机所必备的虚拟化支持,ARM还有些性能问题。x86处理器提升Throughput的利器超线程技术,ARM阵营尚不能支持。Intel芯片近年来陆续增加的安全特性,也够ARM追赶一阵子的。但目前看来,ARM已经没有致命的短板,蚕食掉Intel的服务器市场份额是板上钉钉的事情,唯一的悬念是究竟多少份额?
未来ISA将不那么重要
从长远看,半导体厂商对建立于ISA之上的生态系统的掌控力会变弱,而ISA本身,会变得越来越不重要。这是软件技术发展的趋势决定的,如前所述,这些技术在90年代末就已经初有小成了。
第一是Web技术。网页开发领域,有一个大家视若无睹的奇迹:最后居然只有Java一种开发语言屹立至今。要知道在服务器端和移动App领域,开发语言多如过江之卿。其中原因我也分析不出。反正js的挑战者(微软的VB和谷歌的Dart)都失败了。网页开发领域面临的主要问题是浏览器差异大,API不太兼容。这个问题慢慢在缓解中,一来浏览器战争大局已定,Android和PC上的Chrome,以及iPhone和Mac上的safari是胜者;二来很多网页应用是跑在App里面的,例如微信和支付宝里,这种场景下Java的API已经被特定厂商规范过了。
由于开发语言和API的高度统一,H5(HTML5+Java)已经成了兼容所有硬件的最通用的软件开发平台。曾经有人鼓吹H5会赶走移动端和PC端的原生程序,后来被打脸了。但是移动端和PC端的原生App中,越来越多的界面是用H5生成的了,微信、支付宝、京东、淘宝、爱奇艺、有道词典……统统都是这样。
Java吞噬一切的进程还在持续。2007年,Stack Overflow的联合创始人Jeff Atwood曾经提出过一条Atwood定律:任何能够用Java实现的应用系统,最终都必将用Java实现。十年过去了,此定律基本奏效。把Java的一个子集当作汇编语言的asm.js及其后续的WebAssembly,更加使得网页应用有媲美原生应用的潜力,在浏览器里跑Unity3D的游戏都不是问题。
独立的应用程序仍然会是移动和桌面端的主流,因为没有独立程序,不方便做弹窗广告,不方便启动后台进程收集用户信息,不方便引诱用户安装其它独立程序。但Web的能力的确在快速提升,Web Component技术实现了类似GUI库的Widget复用,如今在浏览器里实现Office和IDE的功能都毫无问题(office365.com、docs.google.com、editor.construct.net、腾讯文档);而WebGL已经能支持Unity3D这种大型游戏框架。
照此趋势发展下去,独立应用程序仅仅会作为一个包装而存在,开发者写一套H5,加上不同的包装,就成了PC、Mac、Android、iOS上的独立应用程序,不加包装,就是网站。微软去年开源的ReactXP,就是为了实现这一目标。
这意味着什么?不但底层的CPU被OTT了,操作系统也被OTT了。因为移植一个应用程序到各个平台上,几乎没有什么难度。谁将是生态系统的掌控者?若干个超级App,像微信、QQ、支付宝这样的。它们不但包装自家的应用,其它开发者也可以把自己的应用放在这个包装里面,借重超级App的广泛覆盖度,抵达最终用户。前文提到了,如果微信小程序获得成功,腾讯必然会重拾Q+的野心,把QQ变成桌面上各种H5应用的App Store。
如果真的会这样,微软岂不是会比Intel还着急?拜托,微软已经不是二十年前主要靠卖Windows和Office的光盘赚钱的那家公司了,未来它会专注于云计算。但Intel还和二十年前一样在卖芯片。
第二是编译技术尤其是虚拟机的发展。如今的编程语言太多了,80年代那种搞定C语言编译器就OK的好日子早已过去。任何一个新CPU架构要想在移动、桌面、服务器市场站稳脚跟,都得搞定无数的编译器(包括虚拟机用的JIT编译器),这是个坏消息。但好消息是,搞定这些编译器基本就差不多了,不用劝说开发者重写汇编代码。
老一代程序员对x86处理器架构和汇编都非常熟悉。求伯君当年开发WPS时,手写几十万行汇编;雷军读本科时,是系里20多年来拿过《汇编语言程序设计》满分成绩的两个学生之一;梁肇新开发超级解霸时,把MMX汇编玩得出神入化。感兴趣的读者可以看看梁的《编程高手箴言》,那里面,描绘了一个对现在的程序员而言,完全陌生的世界。在那个世界里,你开发的PC应用程序想要移植到Mac平台上,几乎要完全重写。
如今高层次的编程语言接管了一切,汇编语言从很多学校的本科课程里消失了,入门教材也从C改成了Java,甚至是Java或Python。程序员完全不熟悉底层的CPU。即使是真的需要拼性能的场合,编译器也在很大程度上代替了手写汇编。ARM的工程师告诉我说,ARM在开发开源的Compute Library过程中,主要依靠在C源码中加入标注来指导编译器生成SIMD指令,而不是像梁肇新那样手写。
在这种情况下,软件平台厂商就变得非常强势,因为他们知道,应用开发商只需付出重新编译一遍的代价。比如苹果,就要求所有的App都改为64位的。这样,未来苹果在手机CPU里放弃对32位应用的支持时,甚至都不会有人感觉得到。这对于x86生态系统而言,简直是天方夜谭,显然微软对此非常眼馋,并且尝试在Windows 10 S中复制这种掌控力。
至于谷歌,Android把所有应用都跑在虚拟机上的尝试虽然失败了,但如果未来它再针对AR/VR、AI或机器人发布一个什么软件平台的话,就很有可能完全禁止原生程序。
而Oracle,正在努力开发可以支持所有编程语言、能把所有CPU给OTT掉的全新VM:GraalVM。我们拭目以待。
第三是Emulation技术的发展。虽然眼下ARM阵营中靠Emulation进攻Intel的先锋是高通,但最可怕的选手其实是NVidia。NVidia拥有最厉害的Emulation技术,而且江湖传言Denver处理器的初衷就是针对x86的。当初NVidia的Tegra处理器曾被拿来做Windows 8 RT的二合一平板。如今Denver处理器跑Windows 10绝不会让人意外,那么它会怎么跑呢?肯定是直接在底层硬件上做x86的Emulation,而不是在Emulate出来的ARM指令集上再做一层Eumulation。
Denver处理器前些年没有跳出来抢Intel的饭碗,很大程度上是因为NVidia还在做Intel平台的主板芯片组,另外NVidia还没有那么强大。如今NVidia也不做芯片组生意了,还借AI的东风,股价扶摇直上。说不定哪天,NVidia就会放出Denver处理器的x86 Emulator,做到单线程性能不输Xeon,强攻服务器市场。想想看,在单芯片上集成GPU和x86版的Denver,云计算厂商能不动心?
如果未来Emulation技术进一步发展并且被越来越多的厂商掌握,很可能会出现这种情况:CPU本身是某种外界不了解的指令集,官方发布时,只能Emulate某种开放的指令集,例如RISCV;但是用户可以给它安装不同的Emulator,让它变成x86-64处理器,或者ARM64处理器。在软件定义一切的时代,这并不是多么疯狂的想象。
总之,CPU依然不可或缺,但CPU用谁家的,是什么指令集,会越来越不重要。软件的发展,会在用户和底层的CPU之间加入足够大的缓冲带,CPU的差异,越来越难以被用户察觉到。
展望:让CPU不再难
此文在最后修改之时,看到了梁宁的文章《一段关于国产芯片和操作系统的往事》,里面写到:
就像10多年前一样,只要搞定知识产权问题,选择技术路线,找会干的人,投入干,CPU/芯片就能够做出来。搞不定的依然是操作系统。差距大的依然是生态。
当年,绕得过Intel,跨不过微软。如今,绕得过Arm,做不出安卓。
我也曾在北大参与过国产CPU的研发,生态之难体会颇深,真的,只是烧钱做芯片,无论烧多少都无法挑战Intel和ARM,何况过去二十年真的没烧多少。
但我并没有梁宁那么悲观,毕竟技术的潮流无法抗拒,借用马化腾的一句名言“可能你什么错都没有,最后就是错在自己太老了”。
Intel和ARM如此强大而且极少犯错,我们如此弱小就算它们犯错也无法利用——但我们可以欺负它们的“老”。
在此借新智元的宝地,向小马哥呼吁一声:
请借助腾讯的强大生态,把CPU和OS这两个老大难问题给OTT掉吧!
做法非常简单,把Q+桌面再重新搞起来,做一款完全使用Java&Webassembly编程的操作系统,里面用腾讯文档来替代Office,各种微信小程序都支持起来,适当支持游戏(但要加入家长监控系统)。补贴芯片厂,让它们使用ARM或RISC-V外加国产Imagination gpu做SoC,生产类似Surface这样的二合一平板。底层CPU使用的ISA完全不可见,上层编程完全用H5。这样,就帮祖国把CPU和OS这两个陈年大洞都补上了。
芯片要下苦功,别凡事都指望模式创新。这不假。但偏偏CPU真的面临一个十倍速变革的机会,真的有靠模式创新而胜出的机会,为什么不试试呢?如果腾讯不去尝试一下,谁还有资格呢?促进祖国的微电子发展功德无量,相信这次不会有人说腾讯垄断之类的闲话。