qidao123.com技术社区-IT企服评测·应用市场

标题: 告别CPU思维,拥抱并行天下:AI工程师深入表明GPU架构与实行模子 [打印本页]

作者: 西河刘卡车医    时间: 3 天前
标题: 告别CPU思维,拥抱并行天下:AI工程师深入表明GPU架构与实行模子
引言:从熟悉到陌生——为什么工程师必要懂GPU?
如果你是一名软件工程师,特别是刚接触AI或高性能计算领域的,你大概率对CPU和次序编程模式洞若观火。究竟,从我们敲下第一行代码开始,就与CPU紧密相连。然而,对于那块在过去的十年里,因深度学习而变得举足轻重、被誉为“AI算力焦点”的GPU,它的内部究竟是如何工作的?它为何能在某些使命上比CPU快上百倍千倍?这些题目可能对许多工程师来说还蒙着一层神秘的面纱。

过去,GPU主要用于图形渲染,是游戏玩家的“专属”。但现在,从AI训练、科学计算到大数据分析,GPU的应用无处不在。明白GPU的基本工作原理,已经不再是少数图形学专家的专属技能,而是每一位志在并行计算领域的软件工程师,尤其是AI工程师的“必修课”。
今天,我们就来翻开GPU的神秘面纱,深入了解它的计划哲学、内部结构和独特的代码实行方式。
一、计划理念的本质差异:CPU vs. GPU
要明白GPU,最好的方式是先将它与我们熟悉的CPU进行对比。CPU和GPU最焦点的区别在于它们最初的计划目的不同:

用一个简单的例子来说明:将两个数字相加。 CPU可以非常快地完成一次加法。如果必要按次序进行十次加法,CPU的总耗时会很低。 但如果必要进行数百万甚至数十亿次独立的加法运算(比如向量或矩阵相加),只管单次加法时延较高,GPU凭借其海量的计算单元可以同时实行成千上万次加法,因此在总耗时上将远远高出CPU。
数据可以直观地说明这一点:衡量硬件数值计算性能的指标是每秒浮点运算次数(FLOPS)。NVIDIA Ampere A100 GPU 在 32 位浮点精度下能达到 19.5 TFLOPS 的吞吐量,而同期(2021年)一款典型的 Intel 24 核 CPU 在相同精度下仅约 0.66 TFLOPS。随着时间推移,GPU在吞吐量上的上风还在不断扩大。

如果我们观察CPU和GPU的芯片架构图,会发现CPU将大量芯片面积用于缓存和复杂的控制单元,以低沉指令时延和优化次序实行。而GPU则将绝大部分面积用于密集的算术逻辑单元(ALU,负责实行计算),辅以少量缓存和控制单元,以最大化计算本领和吞吐量。
二、GPU的并行基石:流式多处理器(SMs)
那么,GPU是如何通过其架构实现如此高的吞吐量的呢?这就必要了解GPU的焦点计算单元——流式多处理器(Streaming Multiprocessor,简称SM)

一个GPU由多个SM构成,每个SM内部又包含大量的计算焦点(Core),这些焦点也常被称为流式处理器(Streaming Processor)。比方,NVIDIA 最新的 H100 GPU 就拥有 132 个 SM,每个 SM 内部有 64 个计算焦点,整个芯片总计焦点数量高达 8448 个!
每个SM都是一个相对独立的计算单元,拥有:

明白SM是明白GPU并行架构的关键。每个SM都能同时实行多个线程束(我们稍后会具体先容),从而在SM层面实现并行。而整个GPU拥有多个SM,则在更高的层面实现了大规模并行。
三、层层加快:GPU的内存体系
GPU的高性能不仅依靠于海量计算焦点,也依靠于其经心计划的内存层次结构。与CPU类似,GPU拥有多层不同范例、不同速率和容量的内存,以满足不同计算阶段的数据访问需求。

从距离计算焦点最近、速率最快到最远、速率相对较慢的内存层次,主要包罗:
虽然全局内存时延高,但 GPU 的其他层级内存(特别是 Shared Memory 和 L1/L2 Cache)以及海量的计算单元和高效的调度机制,可以或许有用地“隐藏”这种时延,确保计算单元不会长时间空闲期待数据。
四、GPU如何实行代码:Kernel, Grid, Block, Thread 和 Warp
明白了GPU的硬件架构和内存,接下来我们看看编写的代码如何在这些硬件上跑起来。
大多数 GPU 通用计算编程都使用 NVIDIA 提供的 CUDA 编程接口(或者类似的开放尺度如 OpenCL/SYCL)。在 CUDA 中:


你可以根据数据规模和所需的并行度来配置 Grid 和 Block 的维度和巨细。比方,要对一个 256 维的向量进行加法,你可以配置一个包含 256 个线程的线程块,让每个线程处理一个元素。如果向量更大,你可能必要更多的线程块,或者让每个线程处理多个元素。
编写 GPU 代码通常分为两部分:


五、并行实行的秘密:Block分配、Warp与耽误隐藏
当你在主机代码中启动一个 Kernel 后,GPU 是如何分配和实行这些线程的呢?

值得留意的是,较新的 GPU 架构(如 Volta 及之后)引入了独立线程调度(Independent Thread Scheduling),在 Warp 内部允许线程之间有更多的独立性和并发性,不再强制所有线程严格同步实行同一条指令,这能更好地使用实行资源,但也增加了同步的复杂性。

相比之下,CPU 的上下文切换代价较高,由于它必要将一个历程(或线程)的寄存器状态生存到内存并恢复另一个历程的状态。GPU 的 Warp 切换发生在硬件层面,且每个线程的寄存器是独立的,因此服从极高。
六、性能的检验:资源分配与SM占用率(Occupancy)
虽然 GPU 拥有强大的并行本领,但要充实发挥其性能,必要开发者对资源管理有深入的明白。一个关键的指标就是 SM 占用率(Occupancy)
占用率衡量了 SM 被有用使用的水平,具体是指分配给一个 SM 的活跃 Warp 数量与该 SM 可以或许支持的最大 Warp 数量之间的比值。理想情况下,我们盼望达到 100% 的占用率,这意味着 SM 拥有充足的活跃 Warp 来隐藏指令耽误,确保计算单元始终满负荷运转,从而实现最大吞吐量。
然而,在实践中实现 100% 占用率并非易事,由于 SM 的资源是有限的,并且必要在多个线程块和线程之间进行动态分配。SM 拥有固定数量的资源池,主要包罗:

当一个线程块被分配到 SM 上时,它会申请并占用这些资源。资源的分配是动态的:

资源分配是动态的,意味着资源会根据每个线程块或线程的现实需求来划分。比方,NVIDIA H100 的一个 SM 最多可以支持 32 个线程块、64 个 Warp(2048 个线程)。
资源的限制直接影响占用率。举例来说明:


占用率不足意味着 SM 没有充足的活跃 Warp 来有用地隐藏指令耽误,或者无法满负荷地使用计算资源,从而无法达到硬件的最佳性能。
编写高效的 GPU Kernel 是一项充满挑衅的工作,开发者必要在最大化占用率(保证有充足的 Warp 来隐藏耽误)和优化单线程/单 Warp 性能(如通过使用更多寄存器减少访存,但这可能低沉占用率)之间找到均衡。合理地配置线程块巨细、管理共享内存的使用以及优化寄存器使用都至关紧张。
结论:跨越鸿沟,把握并行计算的钥匙
回顾一下我们今天探究的关键要点:
明白这些基本概念,是你从CPU的次序思维跨越到GPU并行天下的敲门砖。虽然编写高效的GPU Kernel 是一项复杂的使命,涉及对硬件细节的深刻明白和精妙的代码优化,但根本原理是相通的。
盼望这篇文章能帮助你开端构建起对GPU架构和实行模子的认知框架。未来,随着你深入学习CUDA等并行编程模子,这些概念会越来越清晰。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4