GPGPU面临的工程困境闲聊

作者:蒋志强

  本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强

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,因为其它应用厂商面临的局面和你一样,对大家是公平的。

希望以上的分析,能帮助你更透彻的看清局势,做出恰当理性的工程选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/368159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacBook Pro (15 英寸,2018) 本地体验运行 6B 大模型

接上篇 在 Mac 上加速 PyTorch 训练,准备完 MPS 环境之后,开始在本地体验 ChatGLM3-6B 模型。 一、下载本仓库: (base) markvivvMBP dev % git clone https://github.com/THUDM/ChatGLM3Cloning into ChatGLM3... remote: Enumerating obje…

[SWPUCTF 2021 新生赛]include

他让我们传入一个flag值 我们传入即可看到代码部分 传入一个php的伪类即可 得到经过Base64加密的flag,解密即可

jupyter notebook更改工作目录的2个细节

详细步骤参考知乎原文: 如何更改Jupyter Notebook的默认工作路径? - 知乎 (zhihu.com​​​​​​) 步骤4中需要删除 #符号和后面的空格!一定要删除空格,否则会出现语法错误的报错 步骤5中,经过评论区提醒后&#xf…

酷开系统 | 酷开科技智慧AI带你领略神奇的世界

在这个科技日新月异的时代,AI已成为我们生活中不可或缺的一部分。它不仅改变了我们的生活方式,更让我们对未来充满期待。说起酷开系统中智慧AI的强大,着实让人叹为观止。无论是语音识别、数据整理还是语言处理,智慧AI都在不断地突…

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流(1)istream(2)ostream(3)iostream(4)cin 和 cout 2. C文件IO流(1)ifstream&#xff0…

如何在Windows部署GoLand并通过SSH远程连接Linux服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器,并结合cpolar内…

1 初识JVM

JVM(Java Virtual Machine),也就是 “Java虚拟机”。 对于第三点功能:即时编译 常见的JVM 默认安装在JDK中的虚拟机为HotSpot:可以用“java -version”进行查看

网络时间协议NTP工作模式

单播服务器/客户端模式 单播服务器/客户端模式运行在同步子网中层数较高层上。这种模式下,需要预先知道服务器的IP地址。 客户端:运行在客户端模式的主机(简称客户端)定期向服务器端发送报文,报文中的Mode字段设置为3(客户端模式)。当客户端接收到应答报文时,客户端会…

RHCE 综合项目-博客

目录 业务需求 一、准备工作 1、配置静态IP 2、修改主机名及hosts映射 3、开启防火墙 4、时间同步 5、配置免密ssh登录 二、环境搭建 1、Server-web端安装LAMP环境软件 2、Server-NFS-DNS端上传博客软件 3、Server-NFS-DNS端设置NFS共享 三、Server-web设置 1、挂…

新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)

本文记录于数学建模老哥视频的学习过程中。b站视频:http://【【零基础教程】老哥:数学建模算法、编程、写作和获奖指南全流程培训!】https://www.bilibili.com/video/BV1kC4y1a7Ee?p50&vd_sourceff53a726c62f94eda5f615bd4a62c458 目录…

四、Redis之配置文件

redis配置文件的名称 redis.conf 通过命令 find / -name redis.confvim redis.conf通过 : set nu 设置行号: set nonu 取消行号/关键字 搜索关键字: set noh 取消高亮选择4.1 Units 配置大小单位,开头定义了一些基本的度量单位,只支持 bytes&#…

多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征

有序性的原因,和保证措施(as-if-serial) JVM执行代码时,可能会优化编译器和优化CPU的性能发挥,所以会进行对 代码顺序调整。当然,此顺序会保证as-if-serial(也就是再怎么优化顺序,单…

Spring-mvc、Spring-boot中如何在调用同类方法时触发AOP

1. 问题描述 Spring-mvc和Spring-boot中aop可以实现代理的功能,我们可以借此实现事务和日志记录或者限流等多种操作。但是,如果你在一个方法中调用其同类下的其他方法的时候不会触发AOP。本文主要说明其原因及解决办法和实现原理。 2. 原因 AIOP的本质是…

网络编程套接字(3)

网络编程套接字 简单的TCP英译汉服务器地址转换函数字符串IP转整数IP整数IP转字符串IP关于inet_ntoa函数并发场景下的inet_ntoa函数绑定失败问题TCP协议通讯流程数据传输的过程数据交互四次挥手的过程端口连接 简单的TCP英译汉服务器 之前我们是以回调的方式处理任务的&#x…

下载、安装Jenkins

进入官网 下载Jenkins https://www.jenkins.io 直接点击Download 一般是下长期支持版 因为它是java写的,你要运行它(Jenkins.war)肯定要有java环境 有两种方式去运行它,一种是下载Tomcat(是很经典的java容器或者jav…

手写分布式存储系统v0.2版本

引言 上回说到 手写分布式存储系统v0.1版本 ,已经实现了通过监听TCP端口并将数据写到本地磁盘的功能,今天咱们就继续往上面添砖加瓦 v0.2版本大致做以下功能 实现滚动写文件 代码优化 一、滚动写文件实现 由于咱们写文件是用的mmap进行文件写入&am…

2024美赛B题Searching for Submersibles原创论文完整版

Searching for Submersibles搜索潜水器 2024美赛B题Searching for Submersibles原创论文(共38页)部分内容,其余见文末: 整体框架: 1.1 问题背景与问题重述 海上游轮迷你潜水艇公司(MCMS)&…

算法基础——位运算,双指针,排序,二分

目录 1.位运算 与:& 或:| 取反&#xff1a;~ 异或&#xff1a;^或者是一个圈里有个加号的图像 移位:<<或者>> 例题:二进制中1的个数 例题&#xff1a;我们需要0 ​编辑 2.排序sort 例题&#xff1a;【模板】排序&#xff08;1&#xff09; 例题&…

大坑!react+thress.js

2. UI交互界面与Canvas画布叠加 | Three.js中文网 (webgl3d.cn) // canvas画布绝对定位 renderer.domElement.style.position absolute; renderer.domElement.style.top 0px; renderer.domElement.style.left 0px; renderer.domElement.style.zIndex -1; 我按照教程设置了…

红日三打靶!!!

红日三&#xff0c;黑盒测试 环境搭建一.外网打点1.网段探测2.端口服务扫描3.目录扫描4.网站漏洞扫描5.汇总&#xff0c;找破绽6.登陆MySQL改密码 7.进入后台&#xff0c;找能写马的地方8.蚁剑连接9.disable_functions绕过1.蚁剑插件绕过2.bypass_disablefunc_via_LD_PRELOAD绕…