作者:蒋志强
本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强
0.前言
2007年作为GPGPU的工程界元年至今,已经发展了接近小二十年了。这个领域是如此的重要,几乎影响了工业界各个领域,从科学数值计算 到 金融领域,医疗领域,人工智能等,凡是日常生活中直接间接与计算机相关的领域,几乎都在其中。
我读研时是2006年,正好赶上这个变化的最开始,亲历了其从无到有,一直到现在蓬勃发展。这是对工程师而言,最好的时期,也是最糟的时期。时至今日2024年了,工程师面对GPGPU时,既很欣喜,也很痛苦。
为何会痛苦呢?你面临的选择,究竟是选CUDA绑定Nvidia的硬件,还是选择OpenCL“跨平台”?似乎选择很容易,但OpenCL真的在产品上能帮助企业跨硬件平台吗?还是OpenCL跨平台只是软件生态之争的一个伪命题?OpenCL3.0是重大的进步,还是巨大的倒退?IOS上还能跑CL吗?为了苹果,企业需要重新做一套Metal的应用吗?ARM平台上,我们该怎么做?
带着这些问题,我们就来梳理一下GPGPU下的各种纷争,帮助工程师剥掉迷雾和厂商的“善意谎言”,不要作出糊涂的选择。内容分为以下4个部分,帮助大家了解来龙去脉,知其然,且知其所以然。
目录
1.背景介绍
2.历史由来与公司选择
3.软件生态圈的明争暗斗
4.未来猜想与展望
1.背景介绍
GPGPU大家都很熟悉了,也就是General Purpose GPU(通用计算GPU)技术。其实GPU芯片的设计初衷完全是为了图形渲染而生的,Graphics Process Unit,本不是为了通用计算。但研究过渲染的工程师都知道,硬件渲染链路中的几何坐标计算,颜色计算等硬件单元,非常机缘巧合的满足并行通用计算的某些重要特征,特别是在XBOX的GPU芯片以后,在硬件层面上着色器的重新定义,导致了把GPU的硬件用来作高效的通用计算变成了现实可能。更具体的技术细节,感兴趣的小伙伴请查看我以前的文章 https://blog.csdn.net/gamer_gerald/article/details/102647300 中第一节,3D渲染软硬件历史。
简单而言,只要在GPU硬件层,做成了统一着色器,所有的显卡都可以用来做GPGPU。而现代GPU的发展,技术上本来就需要统一着色器,所以目前任何显卡都可以做GPGPU,无论你是X86的还是ARM的。
既然大家都可以的前提下,最重要的事情,就是打造对应的软件生态体系。这对各个厂商而言,不是做得到或做不到的区别,而是你选择做还是不做,你花多少资源去做,你有多少资源去做,你什么时候去做的问题。XBOX的发布是在2001年,那个时候技术前期障碍已经扫除,极客工程师背景的 黄仁勋 是看得很清楚的,但毕竟前期投入巨大,后期产出不明,这是一个依赖技术直觉的重大选择。
现在我们以上帝视角回看历史,似乎觉得这非常值得,但在当时对任何一个CEO来说,绝对是一个及其艰难的决定和豪赌。如果 NVIDIA的CEO不是 工程技术出身,绝对没有勇气做出选择,把公司几乎大部分资源投入到CUDA的开发中。
2.历史由来与公司选择
后来,如大家所了解的,2007年NVIDIA发布了CUDA 1.0。这是所有GPU厂商中,第一个发布GPGPU软件开发框架的,并且NVIDIA投入了大量的资源进行宣传,包括烧钱搭建开发社区,烧钱在全球各个高校组织CUDA编程赛事,并投入大量资源改进更新CUDA,这些至少在若干年内都是纯投入,没有利润产出的。大家都不确定,几年后的产出会是怎样。什么是ALL IN?当时的Nvidia的行为就是ALL IN。(当然后面的收获期,也是All Yours)
同期ATI见NVIDIA做得那么果敢,也害怕被拉下,按风投界的说法就是FOMO(Fear of Missing Out),害怕错过了。所以ATI晚了一些,但也跟进了,分了一些资源,这就是ATI 的Stream框架,但不是太多,完全不能跟Nvidia的投入相提并论。
我相信不少人,都没听过吧?因为ATI投入还不到Nvidia的零头,Nvidia正在全力以赴进行战略级的重大投资。后来ATI被AMD高价收购,AMD为此背上了巨额债务,为了度过财务危机,连晶圆厂都卖掉,公司总部大楼都卖了,那些年里根本没有资源投入Stream,Stream已经被放弃。而Intel的显卡业务当时还是边缘部门(即使现在也不是核心),基本上是看客。就这样几年过去,GPGPU的软件生态,变成了Nvidia一家的CUDA软件生态。(上帝视角回看,AMD收购ATI绝对是Nvidia CUDA发展的神助攻)
Nvidia在那几年的CUDA也是净亏损,但换来了GPGPU软件生态的垄断位置构建了又宽又深的护城河,幸好Nvidia游戏显卡业务财务良好。坚持了好几年后,人工智能的爆发,Nvidia终于来到收获期,赚的盆满钵满,alpha Go的火热,再到今年来GPT的巨大成功,大家才感受到GPGPU的巨大商业前景。
ATI这会儿才回过神,早已回天无力了。同一时期,苹果其实在自己的封闭生态里,也有做自己GPGPU,也就是后来为大家熟知的OpenCL,这也是为什么苹果手机在硬件差距不大的情况,明显比安卓流畅的原因之一。苹果当时决定把OpenCL的GPGPU开放出去,与Nvidia掰一掰手腕,但鉴于苹果向来是打造封闭体系的,自己肯定无法推动,于是把整体技术体系免费交给了第三方非盈利标准化组织KHRONOS group。该组织是非常有名的推动软件标准的机构,最成功的案例就是当年的OpenGL。于是它们接收了OpenCL的标准,负责推动各个厂商的GPGPU统一标准化。
从技术层面来说,一旦成功,这对CUDA来说是致命的,有可能会摧毁Nvidia重金打造的企业护城河,因为GPGPU的关键在软件生态体系。想想OpenGL对微软DirectX商业垄断的破坏,这让Nvidia后背发凉。
3.软件生态圈的明争暗斗
我们需要思考一下,为什么当年Nvidia非常忌惮OpenCL呢?因为有OpenGL的前车之鉴,当年OpenGL发布以后,由于对微软的DirectX生态体系构成直接冲击,微软公开怼OpenGL的发展不符合计算机图形学的趋势,然后愤然退群离开了OpenGL标准委员会。几年后,OpenGL发展一片欣欣向荣,拿下了微软想要又得不到的Linux平台垄断,在移动手机端拿下了微软渴望又拿不到的应用也就是OpenGL ES(Enbeded System),还在网络时代发展出了网页版的OpenGL版本也就是WebGL,事实证明没有微软的干扰,OpenGL发展得更好。于是微软厚着脸皮夸OpenGL是极其重要的代表了图形学的未来,要求重新加入OpenGL标准。于是在微软重新加入OpenGL委员会,扮演内奸搅屎棍的角色,通过不同的技术意见为伪装,明里暗里的阻碍OpenGL的进一步发展。但为时已晚,图形学的软件生态早已不是微软能一家独大了。
说回ATI,或者是应该被收购后应该叫AMD了,自己没资源和能力构建Stream生态体系,唯一的选择就只有跟进KHRONOS group的OpenCL了。但OpenCL内部标准的推进并不顺利,与OpenGL的推进相比,内部利益斗争非常复杂。
原因在于Intel,Intel本来在GPU领域存在感不强,不赚钱的部门给自家的CPU当绿叶的存在,但由于集成显卡HD/UHD都是搭配在CPU里,装机量巨大,话语权也很重。GPGPU在某种程度上,对它的核心业务有影响,也就是Intel的Xeon至强级服务器处理器。因为以前的高端服务器,靠的是高性能CPU,GPU的发展会让Intel的服务器业务受到冲击。而且Intel还要考虑自身的FPGA业务,也就是FPGA上OpenCL的支持。由于FPGA与GPU在硬件上的差异,不同于GPU之间的差异那么小,导致OpenCL的标准设计平添若干障碍。
因此,OpenCL内部标准制定推进非常不顺,当年OpenGL那种大家齐心协力不可同日而语。而且Nvidia有了OpenGL的历史经验教训,早早的就“宣称”大力支持,在OpenCL委员会里也是各种搅屎棍,不同于微软看大势已去了才来搅已经太晚了,Nvidia从最开始就积极介入OpenCL标准。
所以OpenCL的发展道路比OpenGL要坎坷不少,我们工程师千万不要从技术上来看问题,一定要关注背后的商业利益博弈。
我们来看一下OpenCL内部博弈导致的技术现状多么尴尬。
上面是OpenCL 3.0标准的官方说明。大家一定要read between lines,读懂字面后面的意思。它在说OpenCL3.0将只支持OpenCL1.2标准的内容,所有其它内容你们各个厂商自己随意,想支持就做,不支持也无所谓。也就是说OpenCL3.0标准倒退回了OpenCL1.2的内容,然后宣称这是3.0标准!
我再来帮你翻译翻译,什么他妈的叫做惊喜。OpenCL3.0不再官方支持C++语言,这是OpenCL2.2加入的最重要的核心变动。你要用C++写GPU内核程序?对不起,给你推荐个编译器自己去捣鼓吧,标准不支持,我不管了,爱咋咋地。
所以你的NVIDIA的显卡上宣称支持OpenCL3.0,但实际上只支持1.2的功能。你的一堆报错,不是你错了,而是你被坑了。
而且即使这古老的OpenCL1.2标准,在某些平台上也恐怕保不住。因为几年前,苹果出手了。
OpenCL本来是苹果交给KHRONOS group,希望其发展起来,在开放软件体系下与CUDA的软件生态对抗。很明显,经过十几年的发展,没有达到目的。那既然开放的软件系统下做不到,那苹果本身就是做封闭技术体系的,那我自己做。
2019年苹果就开始对外宣称,搭建和力推自己新的GPGPU软件框架Metal,只支持MacOS和IOS,并逐步放弃OpenCL在苹果上的支持,仅维护对老应用的支持。前两年,苹果应用商店提交OpenCL新应用已经出现被拒的情况。
而苹果的OpenCL开发者平台上也非常明确的建议,所有苹果应用的GPGPU开发逐步转为Metal.
也就是说OpenCL的亲生父亲,明确不支持OpenCL了,现在老的OpenCL应用还能跑。以后,在苹果生态下,工程师只能用metal,而且openGL也将逐步废弃,统一由metal替代。这不是技术问题,而是软件生态背后的巨大商业利益。
4.未来猜想与展望
基本上,我认为OpenCL1.2标准以后,已经属于接近瘫痪状态,基本看不到未来,OpenCL无论从短期现状,还是从长期来看都无法撼动CUDA在GPGPU领域的软件生态体系。当年在图形学软件生态体系下OpenGL干翻DirectX的场景,将不会在GPGPU软件生态体系再现。
那我们工程师该如何选择呢?接受所有自己不能改变的,关注自己能做的。
以彩超为例,如果我们需要使用Nvidia的硬件,最好开发使用CUDA软件体系的彩超链路,否则你想跨Intel/AMD/Nvidia的硬件,你需要使用OpenCL1.2标准这种非常不方便完善的体系和更加艰难的调试与更困难受限的软件架构设计。
如果需要使用Intel/AMD和高通的ARM应用开发彩超链路,OpenCL是唯一的选择。
如果需要在苹果的设备上提供彩超系统,Metal是唯一的选择。(2019年就有人在IOS上基于Metal完成含软波束的实时彩超系统软件链路)
换句话说,工程师几乎要付出三倍的精力来做一个事情并且维护三套系统,以使产品能覆盖的不同平台。这对工程师来说,肯定是不愿看到的,大家更愿意在自身业务上投入资源,不愿因为厂商的利益争斗而导致我们付出不必要的成本和资源。但我们需要理性,这不是我们能决定的,接受所有不可改变的,把精力放在我们可以控制的事情上。
前端时间,看到网上有游戏厂商怼苹果,说如果苹果不支持OpenGL了,它们就放弃苹果上产品投放。我能够理解其感受,但很显然这是不理性的。如果真的需要做三套,so be it,因为其它应用厂商面临的局面和你一样,对大家是公平的。
希望以上的分析,能帮助你更透彻的看清局势,做出恰当理性的工程选择。