
美国
左图为CPU架构,右图为GPU架构。CPU 用大量芯片面积实现减少指令延迟的功能,比如加大缓存、减少算术逻辑单元并增加控制单元。GPU 以大量算术逻辑单元提升计算能力和吞吐量,仅用极少芯片面积做缓存与控制单元,因此延迟较高。若想充分发挥GPU性能或实现加速,就必须深入理解其架构,尤其是针对不断更新的GPU产品,需进行软硬件协同开发。这不像许多基于CPU的软件开发,即便我不熟悉各类CPU特性,也能高效运行。GPU硬件真的很复杂吗?其实不然。建议所有工程师都应深入了解其架构原理,从而更好地进行适配与应用。GPU追求高吞吐量,何种架构能够达成这一目标?这是大家共同关注的问题。所示,GPU 由多个流式多处理器(SM)构成。
SM是什么?简单说,就是对GPU核心分组管理,一组GPU核心(线程组)就叫SM。例如,NVIDIA H100 GPU 包含 132 个流式多处理器,每个拥有 64 个核心,总计 8448 个核心。每个分组的SM都会分配到一定存储器,中的Memory,一般叫共享存储器或暂存器,供所有内核共享。此外,SM上的控制单元资源也会由所有内核共同使用。此外,每个SM都配备基于硬件的线程调度器用于执行线程。此外,每个 SM 还包含多个功能单元或专用加速单元,比如张量核心和光线追踪单元,用以满足 GPU 处理不同类型工作负载的特定计算需求。此外,每个流式多处理器(SM)进一步划分为多个处理块(Block)。每个Block内含一个独立的Warp调度器、一个派发单元(Dispatch Unit)、一定容量的寄存器文件(Register File)、一个独立的L0指令缓存、多个整数运算单元(INT32)、多个单精度浮点运算单元(FP32)以及多个张量核心(TENSOR CORES)。这些组件协同工作,提升了计算效率与性能表现。这就像SM是一个班级,而Block只是其中的一个小组。图形处理器存储结构GPU包含多层不同类型存储器,按访问速度从高到低排序如下:寄存器存储速度最快,其次是共享存储、常量存储、类常量存储、本地存储和全局存储,访问延迟依次增加,存储层次结构影响性能表现。

英伟达
单机内有多种通信和拓扑关系,如CPU与CPU、CPU与GPU、GPU与GPU之间的连接。所示,CPU0和CPU1通过QPI相连。QPI(快速通道互联)是用于高性能处理器间通信的接口技术,它提供高速、点对点的数据传输路径,能够实现处理器之间的低延迟与高带宽通信,有效提升数据交换效率。CPU和GPU借助PCIe Switch进行互联,所示。每个CPU与四个GPU之间均通过PCIe Switch通信,其工作原理类似于交换机。每个PCIe Switch可配备多个PCIe插槽,以实现设备间的高效连接与数据传输。GPU 0至3两两间既可通过NVLink通信,也能经 PCIe Switch连接,GPU 4到7同样如此。NVLink专为GPU间通信设计,提供高效数据传输通道。图中显示,GPU 0 与 GPU 4 无直连通道,需通过其他方式实现间接通信。除了上述内容,NVIDIA 还提供了多 GPU 通信库 NCCL(NVIDIA Collective Communications Library)。该库实现了 AllReduce、Reduce、Broadcast、ReduceScatter 和 AlLGather 等常用的通信原语,并针对 PCIe 和 NVLink 进行了专门优化。这些优化使得通信库具备更高的带宽和更快的传输速度,从而显著提升了多 GPU 环境下的性能表现,为深度学习训练等高性能计算任务提供了强有力的支持。多机GPU之间如何进行通信?多台设备通常经由交换机连接,CPU间通信需通过网络交换完成,基于socket原理实现。此过程涉及用户态与内核态的多次数据拷贝,以确保多机之间信息传递的正常进行。
NVIDIA开发了一套IB网络技术,该技术支持远程直接内存访问(RDMA),可实现高效的数据传输。通过内存直接传输数据至另一台计算机,无需操作系统与CPU介入。IB单网口速度从10Gb/s(SDR)到56Gbps(FDR)可选,高效完成数据交换。其不足之处在于,IB需要专用网卡支持,同时需配备价格昂贵的交换机设备。在以太网环境中实现支持RDMA的标准,可选用RoCE(RDMA over Converged Ethernet)技术。该技术无需依赖复杂低效的TCP传输,能够达成多机通信中的零拷贝,从而显著减少通信延迟,提升效率。NVIDIA用十年构建了CUDA编程生态,历经投资人诸多不解,如今已成为其核心竞争力。在 CUDA 中,以类似 C 函数的形式定义 GPU 计算函数,称为内核。以向量加法为例,讲解CUDA编程范式如何执行?此例中,内核接收两个数组向量为输入,按元素相加后,将结果写入另一个数组向量。原来在CPU上的实现方式,通常需要通过for循环遍历数组,逐一将数据相加后存储到结果数组中。在GPU中,简单做法是为数组每个加法分配一个线程,线程总数等于数组长度,从而并行计算,一次完成所有运算。这要求GPU具备调度管理能力,并合理分配线程。在NVIDIA GPU中,为管理所有线程,首先将线程划分为多个网格(Grid),每个网格再细分为多个线程块(Block),而每个线程块由一个或多个线程构成,从而实现高效组织与管理。申请线程数时,按网格和线程块分配,若可用线程不足,则需让每个线程处理更多数据。在实现时,GPU编程包含两部分:运行在CPU上的主机代码,以及执行于GPU上的设备代码。
上图展示了CPU执行的代码,包含读取CPU数组数据、申请GPU数组空间、拷贝CPU数组到GPU,以及配置线程网格启动GPU内核等功能。申请线程总数时,填入,其中n为数组长度(总线程数),256表示每个block的线程数。
这段代码在GPU上运行,下面的代码用于获取每个线程的ID。当线程ID小于数组长度n时,执行对应位置的加法操作,从而将O(n)计算优化为O(1)复杂度。接下来,我们对GPU的编程模式进行总结:有消息称,NVIDIA为中国市场开发了新款芯片系列,包括HGX H20、L20 PCle和L2 PCle。不过,这些芯片在算力方面进行了更多限制,已难以满足国内大模型长期训练的需求。英伟达首席科学家Bill Dally指出,训练需求每半年到一年就会翻倍,随着时间发展,这一差距将快速扩大。百度已下令将文心一言AI系统所用芯片更换为华为昇腾910B系列。该芯片算力达256TFLOPS,与英伟达A100相当,但在生态支持上仍不及CUDA完善。这一调整或将推动国内AI产业的自主化进程。GPU现已广泛使用,其架构和执行模型虽与CPU差异显著,但不影响其普及。深入研究英伟达GPU原理与CUDA生态,汲取其精华,应用于实践,进而深化对GPU硬件架构的理解。
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号