本文来自微信公众号:芯流智库 (ID:xinliuzhiku),作者:周文君,原文标题:《老黄经历的惨痛失败,与英伟达的“反脆弱”式崛起》,题图来自:视觉中国
英伟达所经历的失败次数,比英特尔、AMD加起来都要多。
纵观过去近三十年,英伟达是激进的、喜欢尝试新鲜事物的,也容易因为失败显得脆弱。但是,英伟达最近三年的市值,绝大多数时候,比英特尔和AMD加起来还要多,这是为什么?
芯流智库的主编杨健楷,邀请了张江高科的投资经理——吕昕,一个游戏机爱好者,一个资深的芯片行业研究者,请他为我们讲下,英伟达是怎样炼成的?以及,反脆弱的法则,在芯片行业如何有效?
GPU发展早期的主宰者——游戏机市场
芯流智库:
关于GPU,我们着重去讲一个问题——英伟达为什么最终能够从GPU市场的惨烈竞争中胜出,并且占据了绝对的优势性地位?
吕昕:
这个问题,有两条暗线。
第一条是微软,微软在图形或者GPU行业,起到了一个非常关键的作用。
第二条,是大规模并行计算的趋势。
只有我们把这两条暗线通过看历史,把它弄明白了,才能够更好地回答,为什么GPU会走到今天的态势。
芯流智库:
我们还是回到牵引GPU发展的一个很重要的市场——游戏机。从游戏机市场的角度去讲它的脉络。
英伟达在市场上面的优势,主要是PC——个人电脑。但其实在很长一段时间里面,真正牵引GPU发展的,是游戏主机。说到游戏主机的话,就要说到90年代的索尼了。
吕昕:
是的。我们聊GPU开始发展的阶段的时候,都会谈S3这些比较老的图形处理器厂商。但那个年代,真正在民用图形技术占据高地的,并不是这些做GPU或者做PC显卡的厂商,反而是日本厂商,也就是以世嘉、索尼、任天堂为代表的游戏机厂商。
我们这里也简单回顾一下当时的游戏机的一个GPU生态。其实严格上来说,比如像PS1、PS2,两个非常成功的索尼游戏机,是没有GPU的。它们只有一个性能很强的CPU,加上一个类似于协处理器的图像处理的单元。
它们的设计思路是依靠浮点能力很强、同时引入专用加速单元的CPU去完成大部分的图形计算工作。然后依靠协处理器做一些像素着色、渲染,或者实现一些固定特效。这在很长一段时间是图形技术的主流实现方式。
而PC方面,那个时候也在争论,“到底是用CPU来去做所有or大部分的图形计算?还是弱化CPU的功能,把图形交给另一个处理单元?”
当时像英特尔为代表的CPU厂商,觉得说CPU承担工作越多越好。当时英特尔的想法,是类似日系厂商在游戏机硬件设计上的想法。所以当时有不少游戏是不需要GPU的。比如说,《三角洲特种部队》,它就是完全不需要GPU,用CPU完成了所有的图形运算。
因此,在早期,“GPU到底能干什么”,“它到底是被集成在CPU里面还是独立出来”,当时没有定论。
此时,微软敏锐地发现了行业的一个商机。因为越来越多人开始用PC,而PC除办公之外,还有游戏功能。但这些游戏的3D效果没有办法跟PS 2对比。
当时微软想到了一个办法,就是把大量的图形的功能,从CPU里移植出来放到GPU上。通过这种方法让GPU的性能强起来,然后负担更多的工作,也希望通过这种方式去推动行业的发展,反过来去巩固他自己在PC端的地位。
这样,我们就回到第一条暗线——微软的推动。
大家可能对微软的第一印象是电脑操作系统,部分喜欢玩游戏的人可能会对他的Xbox游戏机很有印象。但其实,微软对消费领域有个很大的贡献,就是direct x——一种图形的API接口。
direct x把市面上各种各样的硬件统一起来,提供了一个标准的API,让开发者们能够更好地调用这些GPU的硬件性能,而不必耗费大量精力在兼容性上。
在它刚刚诞生的时候,还是很原始的一个东西,没有什么人去用它。那时候整个民用行业的关于图形应用方面的话语权,都在日本游戏厂商的手里。而direct x,它的早期版本图标是一个核弹(内部代号叫曼哈顿计划),寓意也很明显,从日本人手里把图形方面的制高点拿下来。
芯流智库:
也就是说,原来游戏主机市场的强有力的参与者,主要是日本厂商。
吕昕:
早期的都是日本厂商统治。微软想把市场、标准,甚至以后的前沿技术,都攥在自己手里,所以微软推出了direct x。
后来direct x在DX7版本的时候,做了一件大事,这件事情决定了现代意义上的GPU的诞生。
DX7之前的GPU,专门做填充颜色,把一些CPU计算好模型,做一个简单的着色。实际上图形从顶点到多边形的生成,这种运算全部由CPU来做。但是,微软在API里面,把顶点计算,多边形生成的很大一部分工作卸载下来了,给了GPU,使得GPU有更大的作用。
当时大家觉得这只是一个简单的卸载,只要CPU变得很强,一样可以做。
但是后来,随着应用越来越复杂,实现的特效越来越多,往CPU里面塞入更多的浮点加速单元,跟上DX新版本的要求,已经越来越难了,这时候GPU的重要性就凸显出来了。
换句话而言,通过一个很复杂的、性能很强的CPU去渲染3D图像,在成本和技术上实现都有困难。这些工作必须由GPU承担。
GPU也是在这种背景下慢慢走向舞台的。
为什么微软是推手?第二个点在于微软当时做了一件事,就是推出了Xbox游戏机。Xbox本质上是一台PC,它是用Intel的奔腾3处理器加上英伟达的显卡组成了一台游戏机,所以它本质上是台PC。
它的架构,跟当时所有的日系主机是完全不同的。日系主机的CPU很强,GPU只是一个协处理器单元,大部分的开发工作都是放在CPU上。而Xbox的CPU、GPU各司其职,类似于我们现在的PC架构。
当时还看不出来有什么差异,很多人都觉得日系厂商代表的思路更先进,因为性能强。但是,随着两者在编程难易性,以及资源利用效率等方面拉开差距,情况发生了转变。
DX7时代开始,英伟达和微软深度绑定。英伟达做过很多错事,在跟微软深度绑定之前,英伟达喜欢支持一些自有或者说不够主流的标准,后来产品失败了。
英伟达发现这条路走不通之后,发现微软在搞direct x的通用标准。所以英伟达在Dx7的时候,义无反顾地支持了微软的协议,这件事是非常关键的。回顾老黄的策略,他跟微软是绑在一条战车上。微软每一次API的大改动,老黄都是第一时间去支持的。
英伟达通过硬件和API的高度绑定,跟随着PC的浪潮逐渐起来了。
英伟达的登顶之路
芯流智库:
微软把顶点处理的一些任务挪到了GPU上。那顶点处理是什么?为什么把这些任务放到GPU上,可编程性和资源利用效率会出现很大的提升?
吕昕:
把顶点计算从CPU移出来之前,CPU计算出顶点坐标之后,还要去生成很多三角形,然后再做一些左侧的指令发给GPU,GPU再去做这些东西。
而转移之后,相当于说CPU只要告诉GPU坐标点在哪里,剩下的交给GPU自己去做就好了。在刚刚开始分离的时候,效率没有太大的提升。
那个时候,英特尔坚持认为所有图形应该交给CPU来做。但是这背后有两个点。
第一个点,半导体行业,两个小芯片比一个大芯片便宜。尤其在摩尔定律还在高速前进的情况下,一个不断膨胀臃肿的CPU,在成本、功耗还有灵活性上,远不如一个小CPU加上一个GPU的组合搭配。
第二点,用黄仁勋自己的话来说,就是能够更focus,更专注。CPU和GPU很多东西是是不一样的。那么GPU可以专注的去做一些处理的时候,就可以使其性能、架构灵活性,随着行业生态以及编程API等不断去修改,去提升。
在dx 7引入光影坐标转换技术后,dx 8也发生了一个很关键的事情。微软在GPU API里面引入了法线贴图,以及可编程着色器。
可编程着色器,就是让开发者自己去定义着色器的一些工作。它的每一个渲染管线是可以有一定的编程能力的,那一旦走到这一步,CPU就没办法承受了。因为CPU本来就为了追求单核性能和灵活性,如果再去加入这种能够支持可编程管线或者支持法线贴图的专用单元,CPU会越来越臃肿,这是没有办法被下游接受的。
在dx 8之后,行业已经默认CPU没有办法再完全承担3D图形渲染的任务。如果你想玩游戏,或者说想从事一些3D工作的话,GPU是必须的。
芯流智库:
法线贴图,还有可渲染编程着色这两个功能,为什么会让CPU难以承受?
吕昕:
CPU也好,GPU也好,这两个功能都需要你在处理器的执行单元额外加入晶体管,因此芯片面积要变得更大。
除了要加额外硬件单元外,如果处理器本身想去负担这么多的3D图形的处理的话,有个能力很关键,就是浮点计算能力。今天我们说显卡,AI比较火,很多人就问浮点计算能力到多少?
在图形渲染中,最常见的是单精度浮点。游戏特效越来越酷炫的时候,对浮点的需求是成指数级增长的。我们可以去看GPU的浮点理论算力的一个增长,有时候甚至比摩尔定律翻倍还要快。
而浮点增长的背后都需要增加对应的ALU,比如说1000个流处理器,假如每个周期可以做两个操作,然后他跑在1Ghz频率下,它就能够跑出2tflops的浮点运算能力。但,就算直到今天7纳米的时代,把1000个流处理器集成到一个CPU里面,还是一个非常占面积、很费力的事情。
而且1000个流处理器放在CPU里面,表现出来的性能只是独立GPU入门级的水平。
当然,想通过大幅度增加CPU性能继续负担图形渲染的思路,也是有的。最典型的就是有人号称“模拟地球的Cell”,PS3上用的处理器。
这颗处理器非常奇葩,完全沿袭了日本人过去十几年对于图形行业的理解,就是一颗CPU加入足够多的浮点单元和加速单元,可以实现各种各样的计算功能。他们当时号称处理器能够“模拟地球”,能做任何事情。但是,这条思路至少在那个年代没有走通。
一个是因为芯片太复杂了,开发难度太大了,还有一个就是因为它塞了这么多东西,它的处理器很臃肿,它的成本也太高,最后的表现并不尽如人意。
芯流智库:
那像后面对比的话,GPU方案是怎么优化你刚才所说的那些工作的。比如可编程技术?
吕昕:
从dx 7到dx 8,只能说GPU初具成型。然后dx 9,尤其dx9.0c,这其实是一个非常好的一个标准,理论上来说,在DX9.0C下你可以实现任何一种特效。
但实际上,这个标准并没有大家想象的那么好。如果我们今天回头去看DX9,当时游戏主要是依靠美工,并没有支持很多特效。主要的原因,就是GPU灵活性不是很强,本质上还没有跳脱出暴力的“纹理填充”机器的范畴。
在direct 10,微软又一次推动了行业,引入了“统一渲染”。
比如说我们渲染一个画面,本质上是两个步骤,第一,绘制出顶点,顶点用来绘制三角形,然后绘制每个模型。第二,要给这些顶点绘制出来的部分上色,或者做一些渲染。印在GPU里面的单元,就是两个,一个是顶点单元,另一个是像素渲染。
这两个东西在direct 10之前,是分开来的。本来是一种很合理的方案,让专门的单元做专门的事情。但实际上,在游戏渲染过程中会碰到很多情况——有的时候他需要顶点计算量,有的时候需要渲染。
如果这两类都固定下来的话,比如说顶点单元十个,项目单元五个。但如果有的时候,我需要15个顶点单元的计算资源的话,这个硬件资源就没法满足我了。所以,微软对两者做了一个合并,这两个东西变成了一个东西,我就既可以计算顶点,也可以去填充像素,这就是我们说的统一渲染。
微软尝试统一渲染的时候,英伟达是被排除在体系之外。但是后来,英伟达非常迅速地倒向了统一渲染,完成了架构上的革新。
实际上,从英伟达的g80核心开始,他推翻了之前所有设计的思路、理念,完成了一个彻底的统一渲染的架构构建,甚至里面所有的流处理器互联的结构,都做了重新的一个设计,是非常彻底的一个颠覆。
微软在设计统一渲染架构的时候,选择的伙伴是ATI,和ATI合作做了Xbox 360上的GPU Xenos。
我们无从得知老黄看到Xenos的表现之后是怎么想的,但是那个时候,老黄一定在决策把英伟达以前的架构推倒重来,彻底拥抱统一渲染。而英伟达之后所有的光荣与梦想,都是从这一时刻开始的,他很彻底地革命,然后跟着微软一条路走到黑。
如果英伟达没有把自己的GPU变成统一渲染的标量化,CUDA就是一个空谈,跑不起来的。
芯流智库:
ATI或者之后的AMD,为什么尝试过统一渲染,却没有搞出来类似于CUDA的东西?
吕昕:
因为ATI它还是有一定的路径依赖。Xenos 这个GPU可以说是非常的成功,但是它是用超长指令集的结构,每四个矢量加一个标量做一个流处理器组。本质上,Xenos只是为了配合当时微软做的统一渲染架构的一种试水,没有彻底为统一渲染架构从头做一个设计,效率还是是有问题的。
简单解释一下,Xenos每个流处理器里的这5个单元,只有一个指令数据输入口,5个单元同进同退。如果每一个周期进来指令都是四个矢量指令+一个标量指令的情况下,Xenos的效率会是最好的。
但是,现实中这是不可能的。很多时候,每个周期可能只是过来一个标量或者两个矢量指令。相当于流处理器中很多单元是在闲置状态。
总结而言,ATI(后被AMD收购合并)当时没有及时对技术架构做一个彻底的变革,使得它在未来的十年内,很多东西他是真心想做但是弄不起来。本身给GPU编程已经是一个很困难的东西了,更何况是给超长指令集的GPU编程。
芯流智库:
也就是说,为了给GPU去编程,让他的资源尽可能最大程度利用,计算资源需要都标准化,不能是特殊配比。
吕昕:
英伟达那边的做法,是进行很细致的一个分组,分成了一个个小型的流处理器组,而每个流处理器都可以独立运行。而AMD的处理器是很长的一大组,一次读取大量的指令,缺点就是每5个或者4个流处理被绑定在一起,不能独立运行。
英伟达把它的流处理器拆成了很独立、很标准的单元,方便控制和调度。而CUDA编译器,把一个本来是串行处理的东西变成并行。就是因为CUDA降低了编程的难度,所以很多人来用它。如果英伟达没有做在硬件架构上做一个彻底性的变革,后来通用计算的功能也就不可能了。
CUDA真正能够起来,一方面是因为微软背后推动了GPU架构的重大变革,另一方面,在大家都还没看好时间节点的时候,英伟达投入大量的资源去开发相关的生态。
微软要搞光追,老黄第一个站出来说“好,我来当马前卒”,老黄很卖力去推微软想推进的东西。相比之下,AMD、英特尔对这一块没有那么感兴趣。
GPU本质上跟软件是高度耦合的,这也导致了它跟API的版本,跟API的厂商关系必须非常密切。大家觉得可能微软只是一个“卖越来越难用Windows”的厂商,但它在图形领域掌握了标准话语权。
芯流智库:
GPU作物要长得很好,它就必须听土地的话,而土地就是微软。
吕昕:
是的,英伟达能够成功,有很大的因素就是他当微软的跟屁虫。这样能保证其在生态上、在标准上不会被人拉到后面去。
其次,回到英伟达公司本身。为什么它能成功?它干过很多荒唐的事情,但还是一步步走到了今天。像90年代,英伟达在初创期赌API失败了。
但英伟达的文化,就是“快速试错,快速迭代”。如果一个东西对了,它就死命加注;如果错了,就当做没发生过。比如大概十年前,3D显示很火。英伟达不遗余力宣传3D 显示,推出配套软件,配套眼镜。但后来发现这个东西没推广开,英伟达很快翻篇了,遗忘了。
包括现在去看GTC发布会,感觉内容好奇怪呀,什么热点都蹭。量子计算、元宇宙、挖矿,等等。
我上大学管理学的课上,有一章讲到黄仁勋,他有一句话叫做,“if you suck,you suck”,就是说是宁可要低头认错,也不要执着跪地求生。他的企业文化,就是我要去不断尝试、不断试错,输了就很快认错。
举一个英伟达投入了很多年的一个产品线——图睿,老黄看到了大家都在做智能手机,他也想去做智能手机的soc,所以它有一个图睿的产品线,但一直很烂。图睿就一直在折腾,折腾手机,折腾什么机顶盒,后来去折腾车,终于给他蹭上一次风口。
他想尽办法去蹭各种各样的热点,总会给他蹭到一个的,像今天的图睿,已经是得到了大量的汽车厂的认可和使用。大家现在想开发机器人,做一个AGV,最好的方案就是图睿。
大规模并行计算的路线之争
芯流智库:
回到我们常说的深度学习和通用计算上来,我们谈下GPU发展的第二条暗线——为什么大规模并行计算是未来的一个趋势?
吕昕:
比如说智能车,云计算、元宇宙、超算,还有各种各样的一些支撑我们数字化的底层的东西,都需要算力。而这些算力大部分时候,都是需要一种并行的向量计算。他们可能不需要像CPU那样去处理不同的程序,但是需要做很多简单但是非常繁重的计算任务。
很多超算、数据中心、加速卡,他们做的事情就是这类计算。本质上,云端的加速卡、计算卡,都可以视其为一种大规模并行向量的计算卡。
为什么今天大家选择的是GPU,而不是DSP?本质上来说还是编程环境的易用性。其次,GPU能更好地适配各种各样的任务。
今天很多人提到AI,会说到ASIC或者DSA等,但由于AI的算法迭代太快了,ASIC和DSA都很难跟上变化。GPU可能不能每个算法都跑,但是每代的性能都特别出色。它能够跑一个很好的平均值,比如有100项测试,可能GPU每项测试都不能拿第一,但可以每项测试都在前10%,这对下游应用和厂商很有价值。
本质上来说,大规模的并行向量计算,是一种计算效率、编程性以及通用性的一个取舍,目前取舍最好的结果就是GPU。
英伟达有符合它的架构,有支持编程的编译器,还能够给你提供一套完整支持的生态,所以才能在今天的环境中走到这样一个地位。英伟达能够跟随时代的发展趋势,不断去调整策略,赌赢了趋势。
回顾通用计算,2006年到2008年期间,统一渲染刚刚出来,英伟达就不断投入资源,持续了很多年,当时被人骂的非常惨,一个是没有效果,另一个是这些支持会把GPU的核心变得非常冗余、臃肿,而且功耗会增大,面积会增大,然而图形性能却和AMD差不多,人家价格还便宜,功耗还低。
至于英伟达那时候扯什么显卡能做通用计算?消费者根本不关心,玩游戏为什么要考虑蛋白质折叠计算?
芯流智库:
也就是说,当时他还没有找到通用计算的潜在用户。
吕昕:
但英伟达那个时候已经认定了,这是一个可以挖掘的好方向,所以他在守住自己的基本盘——GPU传统图形业务的同时,不断地在未来看得到赔率的地方加速投入。从g80开始,g90、g200,整整四代的架构、对应五代的产品线。他折磨了无数的玩家,无数买他卡的人,陪他一起去分摊成本。
五年期间,英伟达一直没有找到很好的落地场景,但是那个时候CUDA环境已经在持续投入过程中成型了,一些生物实验室开始买显卡了。
那个时候,英伟达也推出了Tesla系列的专门的计算卡,但是除了超算之外的地方,相对卖得比较少。
10年后,深度学习或者AI的浪潮过来了,大家发现,我要去让一个GPU跑在游戏之外的程序,只有英伟达的GPU可以做。在五六年持续投入、被很多人吐槽GPU又臃肿又难用后,英伟达挺过来了,等到了那一刻,获得了未来十年的丰厚回报。
接下来的十年,英伟达也没有躺着不前进,而是不断自我革命。英伟达创新性引入了一个东西——tensor core。之前所有的AI计算,都是用GPU里面的CUDA或者说流处理来计算。
很多人都觉得流处理器,是给图形渲染局用的,效率比较低,就想用ASIC去做AI计算。那英伟达本来是最不应该去开发ASIC或者加速单元的,因为这是自己抢自己饭碗吃嘛。但英伟达就做了,他引入了Tensor Core,一种专用加速单元,效果非常好,进一步拉大了跟其他后来者的一个差距。
你说AI已经够他赚了,他又跑去蹭挖矿,蹭元宇宙、量子计算机。这就是很典型的反脆弱行为,不断去做额外的尝试,以便于在未来出现大的机遇或者大的混乱的时候,能够抓住机遇或者规避损失。
与英伟达作风相反的一个很典型的例子,就是英特尔。英特尔在十年前天下无敌,没有人能打过它。曾经英特尔有最好的架构、最好的工艺,谁都没有想到,仅仅是因为10纳米制程翻车了一次,整个都被打乱了,以至于到现在都没有喘过气来。
英特尔看起来很稳的,但实际上它的系统是很脆弱的,没有能抵抗黑天鹅的能力。它没有去适应时代的革新,他不愿意为很多趋势而去做一些改变,他对自己的工艺过度自信,线性外推推演了自己的工艺进展,并按着线性外推的结果制定发展策略,结果一次翻车让他遭遇了滑铁卢。
而英伟达就是不断尝试,不断改变。英伟达失败了无数次,比如2000年后,失败最惨的是费米架构,他在GPU的层面引入新的设计理念,结果那一代架构在消费领域一败涂地,功耗又大,性能又差,被ATI的hd 5000系列压着打。但是后来,他把这些设计上的失败经验吸收、消化了,然后在开普勒架构的时代又完全赢回来了,他让自己的错误能够为下一次成功服务。
芯流智库:
所以说,他每次犯的一些错误,比方说在功耗上,在市场份额上,在一些订单上,都是比较小的,不是致命的错误。然后,每次小错误,都为他做一些真正的、面向未来市场的产品定义,发挥了很大的作用。
吕昕:
对,有点像是投资领域的概率和赔率。真正让你赚到钱的一定是赔率大的东西。有一个杠铃策略,90%的我拿去买固定理财,10%的我去买一些高赔率的。我每次损失可能只损失一小部分,但一旦让我赢一次,我可以得到非常多的回报。
对于英伟达,他就是一直在这样做,唯二的两次豪赌,就是 API上的跟随微软的两次。我们得承认这两次确实是豪赌,这两次黄仁勋赌上了自己所有的身家,但他也都赌对了。
芯流智库:
为什么微软始终能够发挥很大的作用?每次API接口的标准定制上,他的角色都很对,他为什么能够一直维持很好的表现?
吕昕:
半导体行业,尤其数字芯片这块,有一句话叫“硬件软件不分家”。摩尔定律之外有个定律叫安迪比尔定律,安迪是英特尔原来的CEO,比尔就比尔盖茨。这个定律是,无论安迪造出多快的处理器,比尔都会用程序榨干它的性能。
微软是PC生态的主导,它的API承担了桥梁的作用,自然而然,它能够去收集很多游戏开发以及软件生态行业那些人的需求。
微软这边还有一些研究院,有很多前沿的探索。在研究的过程中,微软觉得下一代可能要做某些改进,于是反馈给GPU厂商。也正是因为如此,微软在GPU行业发生变革的时候,它走在前面,或者说它引领了变革。
本文来自微信公众号:芯流智库 (ID:xinliuzhiku),作者:周文君