GPU架构基础:从计算模型到互联技术
要理解GPU Direct如何绕过CPU与内存中转,直接打通GPU、网卡和存储设备之间的数据通路,首先必须建立对GPU基本架构的认知。GPU并非“很多个CPU的简单堆叠”,它的设计哲学、内存组织方式以及对外互联接口,都与CPU体系有本质差异。本节将围绕GPU的计算模型、内存层次结构和主流互联技术三条主线展开,为后续理解GPU Direct通信原理打下基础。
2.1 GPU计算模型:SIMT与线程层次
GPU采用SIMT(单指令多线程)执行模型。与CPU依赖大缓存和分支预测来加速单线程不同,GPU通过数千个轻量级线程的并行执行来隐藏访存延迟。一个典型的GPU程序(Kernel)启动后,会创建大量线程,这些线程被组织为三层结构:Grid(网格)→ Block(线程块)→ Thread(线程)。
- Thread:最小的执行单元,每个线程执行相同的指令流但处理不同的数据。
- Block:一组线程,可共享共享内存(Shared Memory),并通过栅栏(Barrier)同步。
- Grid:由多个Block组成,对应一次Kernel启动的全部线程。
硬件层面,GPU由多个SM(流式多处理器)构成。每个SM包含若干CUDA核心、共享内存、寄存器文件和调度器。Block会被调度到SM上执行,一个SM可同时驻留多个Block。线程实际执行时以Warp(通常32线程)为单位——这是硬件调度的最小粒度,一个Warp内的线程必须执行同一条指令,若出现分支分歧,则需串行执行各分支路径。
核心要点:GPU的并行度来自“大量线程 + 硬件自动调度”,而非CPU的“多核多进程”。编程时需关注Block大小与Grid维度,以最大化SM利用率和访存带宽。
2.2 内存层次结构:从寄存器到全局内存
GPU的内存层次比CPU更强调带宽而非延迟。CUDA编程模型中,每个线程可访问不同作用域和速度的内存空间。理解这些内存的物理位置、生命周期和适用场景,是编写高效GPU程序的前提,也是理解GPU Direct为何需要“直接内存访问”的关键背景。
| 内存类型 | 物理位置 | 作用域 | 生命周期 | 速度/延迟 | 典型用途 |
|---|---|---|---|---|---|
| 寄存器 | SM内部 | 单个线程 | 线程执行期间 | 最快 | 局部变量、中间计算 |
| 共享内存 | SM内部 | Block内所有线程 | Block执行期间 | 极快(~20ns) | Block内数据复用、协作计算 |
| 全局内存 | 显存(DRAM) | 所有线程 + 主机 | 程序运行期间 | 慢(~400ns) | 主数据存储、跨Block通信 |
| 常量内存 | 显存(带缓存) | 所有线程(只读) | 程序运行期间 | 有缓存加速 | 只读参数、查找表 |
| 纹理内存 | 显存(带专用缓存) | 所有线程(只读) | 程序运行期间 | 有缓存加速 | 图像处理、空间局部性访问 |
在GPU Direct通信场景中,全局内存是最核心的参与者。当网卡或存储设备需要将数据直接写入GPU时,目标地址就是全局内存中的某段缓冲区。GPU Direct技术本质上就是让外部设备绕过CPU和主机内存,直接读写GPU的全局内存地址空间。
2.3 互联技术概述:PCIe与NVLink
GPU与外部世界(CPU、其他GPU、网卡、存储)的通信依赖互联总线。当前主流的互联技术分为两个层级:PCIe(外设互联)和NVLink(GPU专用高速互联)。两者在带宽、延迟、拓扑和协议上差异显著,直接决定了GPU Direct的实现路径。
2.3.1 PCIe:通用I/O总线
PCIe是当前计算机系统中连接CPU、GPU、网卡、NVMe SSD等设备的标准总线。它采用点对点串行架构,通过交换机和Root Complex(根复合体)组成树状拓扑。每一代PCIe的带宽翻倍,以PCIe 4.0 x16为例,单向带宽约16 GB/s,双向32 GB/s。
传统数据传输路径中,网卡收到数据后先写入主机内存(DMA),CPU再通过PCIe将数据拷贝到GPU显存。这条路径经历了两次PCIe传输 + 一次主机内存拷贝,延迟高且占用CPU资源。GPU Direct RDMA技术则允许网卡通过PCIe交换机直接访问GPU显存地址,省去主机内存中转。
2.3.2 NVLink:GPU专用高速互联
NVLink是NVIDIA推出的GPU间及GPU-CPU间高速互联协议,采用直连拓扑而非PCIe的树状共享总线。NVLink提供远高于PCIe的带宽:以A100为例,NVLink 3.0单链路双向带宽达600 GB/s(是PCIe 4.0 x16的约18倍),且延迟更低。
NVLink的关键特性包括:
- 高带宽低延迟:适合GPU间频繁的小数据量同步和大型张量传输。
- 内存一致性:支持GPU间统一寻址,一个GPU可直接读取另一个GPU的内存。
- 多链路聚合:多张GPU可通过NVSwitch组成全互联拓扑,形成GPU集群。
实践提示:在多GPU服务器中,nvidia-smi topo -m命令可查看GPU间互联拓扑。若GPU间为NVLink连接,则通信延迟和带宽远优于走PCIe交换机。GPU Direct P2P通信优先使用NVLink路径。
2.4 案例:多GPU服务器互联拓扑
以一台8卡DGX A100服务器为例,其内部互联拓扑如下:
GPU0 --NVLink-- GPU1 --NVLink-- GPU2 --NVLink-- GPU3
| | | |
NVSwitch NVSwitch NVSwitch NVSwitch
| | | |
GPU4 --NVLink-- GPU5 --NVLink-- GPU6 --NVLink-- GPU7
PCIe Switch(连接CPU、网卡、NVMe)
├── CPU0
├── CPU1
├── ConnectX-6 网卡(支持GPUDirect RDMA)
└── NVMe SSD(支持GPUDirect Storage)
在此拓扑中,GPU0到GPU3的通信可走NVLink直连(约600 GB/s),而GPU0到GPU4的通信需经过NVSwitch(同样接近NVLink带宽)。若GPU0需要与网卡交换数据,则必须通过PCIe链路——此时GPU Direct RDMA技术让网卡直接读写GPU0的显存,避免数据先到主机内存再拷贝的额外开销。
2.5 常见误区与复盘
误区一:认为所有GPU间通信都走NVLink。实际上,NVLink仅存在于同一服务器内的GPU之间(或特定CPU-GPU组合)。跨服务器通信仍需通过网卡和InfiniBand/以太网,此时GPU Direct RDMA是唯一能绕过主机内存的路径。
误区二:忽略PCIe交换机的带宽瓶颈。PCIe交换机内部带宽有限,多张GPU同时通过PCIe通信时可能争抢带宽。例如,两张GPU通过PCIe交换机P2P通信,实际带宽可能只有单条PCIe链路的50%-70%。
复盘要点:GPU Direct技术的本质是“让外部设备直接访问GPU显存地址”。理解这一目标后,再看PCIe和NVLink的差异就清晰了——PCIe是通用总线,支持GPU Direct RDMA和Storage;NVLink是GPU专用高速互联,主要用于GPU间P2P通信。实际编程中,CUDA的cudaMemcpyPeerAsync和cudaMemcpyAsync会根据物理拓扑自动选择最优路径,但开发者仍需了解底层互联类型以设计高效的数据流。