GPU 计算到底有什么了不起的?
M‑Star 首席算法开发工程师 Brian DeVincentis 做客节目,与 John 一同探讨:「GPU 计算到底厉害在哪?」
「这是一个非常令人兴奋的发展方向。很期待看到硬件最终会如何反过来影响算法设计 —— 反之亦然。」
在本期节目中,John 和 Brian 讨论了:
- CPU 与 GPU 计算的区别
- 哪些算法适合在 GPU 上运行(哪些不适合)
- 硬件与软件层面的限制
你对 GPU 计算有什么看法?欢迎收听下方播客,并联系我们加入讨论!
访谈正文
John Thomas:今天我们来聊聊 GPU 计算,以及它在计算物理和计算物理建模中的优势。我们今天真正要讨论的核心问题是:GPU 计算到底能带来哪些实实在在的收益?
为了解答这些问题,我们请到了 Brian DeVincentis——M-Star CFD 的首席算法开发工程师,来和我们聊 GPU 计算。过去几年里,Brian 一直负责把我们的代码迁移到 GPU 上,也亲眼见证了因此带来的非常可观的速度提升。
Brian,感谢你的到来。要不要简单介绍一下自己?
Brian DeVincentis:你好 John,谢谢邀请。我叫 Brian DeVincentis,在 M‑Star 工作,主要负责物理仿真软件的开发与 GPU 计算相关工作。
John Thomas:Brian,和我们说说你是怎么成为 GPU 计算领域专家的吧。讲讲你的起点、教育经历,以及你是如何掌握现在这些技能的。
Brian DeVincentis:我从高中就开始接触计算机编程和物理,那时候就产生了兴趣。上大学后,我在卡内基梅隆大学主修机械工程。本科期间,我一边学习物理、工程和输运物理,一边持续学习、提升编程能力。临近毕业时,我把这两个兴趣结合起来,走向了物理、工程与编程结合的方向,也就是数值方法和物理过程数值仿真领域。
那段时间我开始积累 CPU 编程经验,也很幸运 —— 正好赶上 GPU 开始崛起,性能逐渐超越传统 CPU 计算。
John Thomas:嗯,大概是 2010 年代初?
Brian DeVincentis:对,差不多 2010 年代中期。
John Thomas:了解。我记得你后来在德州的一个高性能计算(HPC)中心工作过,对吧?
Brian DeVincentis:是的。那算是我第一份正式工作和研究经历,做的是分子动力学数值模拟。当时还不是 GPU 计算,但我在学习分子动力学背后的数值方法、运行仿真等内容。
John Thomas:我还记得你跟我说过,你做过一个毕业设计项目,用格子玻尔兹曼(lattice‑Boltzmann)算法模拟游动的生物或者鱼之类的?
Brian DeVincentis:没错。那是我第一个格子玻尔兹曼项目。我们用格子玻尔兹曼方法做了不同游动方式的二维仿真,也是我第一次自己编写流体仿真程序。
John Thomas:那时候还是用 CPU 做的,对吧?
Brian DeVincentis:对。
John Thomas:你刚才提到,GPU 大概是八到十年前开始兴起的。先给大家科普一下:** 到底什么是 GPU?** 我知道 CPU 是什么,电脑里都有,英特尔买得到。那 GPU 是什么,又有什么不同?
Brian DeVincentis:GPU 和 CPU 是结构完全不同的硬件。你可以把 CPU 看作串行处理器:它一条指令一条指令地执行,一次只做一件事。
而 GPU 是把同一条指令,同时用在一整批大数据上。也就是说,GPU 是并行计算。这是 CPU 和 GPU 在结构上的核心区别。
John Thomas:所以 CPU 一次做一件事,GPU 是并行做很多事—— 几十、几百、几千件事同时做?
Brian DeVincentis:对,就是这样。CPU 可能有一些向量计算能力,大概十几个、几十个并行通道;而 GPU 可以同时在几千个计算核心上执行运算。
John Thomas:明白了。这和多 CPU 环境类似吗?还是说 GPU 更有优势?
Brian DeVincentis:思路有点像,但芯片设计目标不一样。GPU 芯片专门为大量、简单、重复的计算做了极致优化;而 CPU 设计目标是一次少算点,但更擅长高效处理复杂计算。
John Thomas:所以 GPU 特别擅长对一整批数据,重复做同样的简单计算。
Brian DeVincentis:完全正确。
John Thomas:咱们说点实在的。GPU 比 CPU 到底快多少?假如我桌面上有一块顶尖的科学计算 GPU,相比同价位 CPU,能获得多大的性能提升?
Brian DeVincentis:这个对比不太好一概而论,最好从成本角度看。当然也像我们前面说的,取决于具体算法和是否适配 GPU。但如果你的问题很适合 GPU,在差不多成本下,性能提升可以达到:1~2 个数量级甚至更高。
John Thomas:你是说10~100 倍这种量级?
Brian DeVincentis:对,是数量级。抱歉刚才没说清。
John Thomas:那提升非常大了。就我们软件的实际体验,一块大概 5000~8000 美元的专业科学计算 GPU,速度能比得上256 核甚至 512 核的 CPU 高性能集群。一块好 GPU 只要几千美元,而那样规模的 HPC 要几十万美元。
我觉得这种成本与性能的不对称性非常值得关注,这也是 GPU 在科学计算圈备受关注的原因。
Brian DeVincentis:对。我再补充一点,这种性能提升可以拆成两部分:
第一,每一块钱能买到的算力更高。不管是内存带宽,还是每美元能提供的浮点运算次数,GPU 都远高于 CPU。
第二,所有计算都在同一块芯片上完成。核心之间的通信、数据同步、内存搬运都快得多,因为都在同一块硅片上,不需要在复杂的服务器、交换机系统之间来回传输。
John Thomas:对,通信延迟几乎可以忽略不计,跟 512 核 CPU 集群那种延迟完全不是一个级别。
Brian DeVincentis:没错。
John Thomas:那顺着这个思路,哪些算法适合跑在 GPU 上?因为 GPU 更擅长相对简单的操作,这会不会限制它能高效支持的应用范围?
Brian DeVincentis:是的,算法必须匹配硬件。
如果是高度串行的算法,每一步都依赖上一步结果,那更适合 CPU。如果有大量可以同时完成的计算任务,同一套算法要套用到每一份数据上 ——这就是 GPU 的主场。
John Thomas:明白。我们用的格子玻尔兹曼方法求解非定常纳维‑斯托克斯方程,就很典型。GPU 擅长一次性处理海量信息。除了科学计算,我知道它还被用在机器学习、人工智能等领域。
你觉得这种走向大规模并行、简单计算核心的硬件路线,是一个大趋势,还是只是一时的技术?未来十年我们会更多用这类计算吗?还是说 CPU 会改进,取代这种特殊的 GPU 架构?
Brian DeVincentis:我的判断是:不同硬件会找到各自的擅长场景。到目前为止,CPU 几乎是唯一的通用计算方案,要么用 CPU,要么基本没得选。
现在 GPU 切走了一大块市场,在特定应用领域会成为主流。随着时间推移,还会出现其他计算架构,找到自己的生态位,再从 CPU 或 GPU 那里分走一部分场景。
John Thomas:这个视角很合理。话说回来,你刚才说串行计算更适合 CPU。GPU 计算还有没有其他硬限制?哪些事情我们知道就是不适合在 GPU 上跑?
Brian DeVincentis:我想说一点:有些算法虽然能移植到 GPU,但开发难度会高很多。
CPU 算法通常更好写;而在 GPU 环境下,你要考虑的东西多得多:
- 并行性
- 大量计算同时进行时的同步问题
- 远比 CPU 更精细的内存管理
所以,不只是硬件限制,软件层面也有门槛。这些问题未来可以通过更好的库、更好的开发规范逐步解决。
John Thomas:所以在我听来,GPU 很强、功能很多,但不是所有软件都能跑得好。把 CPU 代码直接搬到 GPU,不会自动带来 100 倍提速。必须让算法和框架本身就适配这种架构,才能发挥出 GPU 承诺的性能。
Brian DeVincentis:完全正确。而且改造工作量可能非常大,有时候要花数年时间重写软件的大部分模块,才能在 GPU 上跑得好。
过去几年,GPU 硬件进步巨大,但软件生态其实没完全跟上。软件要想充分发挥当前芯片的性能,可能还需要很多年。
举个很现实的例子:磁盘读写。比如在 M‑Star 中,仿真会产生大量输出并写入磁盘。后处理时的瓶颈,往往是磁盘读写以及后续操作。
NVIDIA 现在正在做的一件事,就是让数据直接在磁盘和 GPU 之间搬运,不再需要经过内存和 CPU 中转。
John Thomas:有意思。这对我们的数据管理和数据流转会是很重要的转变。
假设我是一个 GPU 计算新手,该从哪里入门?你有没有推荐的书籍或资料,用来熟悉原理和适合 GPU 的算法?
Brian DeVincentis:现在有好几种编程平台可以入门。GPU 对 Python 的支持已经很完善,可能是最简单的起点,很多人都熟悉 Python。
有不少库可以用,比如:
- Numba
- CuPy
这些库能让你很容易上手基础的 GPU 编程。
John Thomas:非常值得去了解一下。
Brian,今天聊得非常好,感谢你花时间和我们探讨这些内容。就像我刚才说的,这些新架构、新硬件是非常令人兴奋的发展方向。很期待看到硬件如何反过来塑造算法,算法又如何驱动硬件进化。再次感谢你过来和我们把这些要点讲清楚。
Brian DeVincentis:不客气,谢谢大家。
