3. GPU架构与编程模型
在自动驾驶异构计算部署中,GPU承担着感知模型推理、点云处理、BEV特征提取与部分后处理等高并行负载。理解GPU的架构与编程模型,是判断“算子能否高效映射、显存是否够用、并发能否重叠”的前提。本节从SIMT执行模型出发,逐层展开CUDA核心与Tensor Core、显存层次、流与并发,并落到典型自动驾驶GPU平台的工程选型。
一、SIMT执行模型:以线程束为调度单位
GPU采用SIMT(Single Instruction, Multiple Threads)执行模型。程序员以线程(Thread)为粒度编写代码,硬件则以32个线程组成的线程束(Warp)为基本调度单位。同一Warp内的线程执行同一条指令,但可持有不同的寄存器数据,因此天然适合处理“同一算子作用于大量元素”的场景,例如卷积、矩阵乘、逐元素激活。
SIMT的关键约束是分支发散:当同一Warp内线程走不同分支时,硬件会串行执行各分支路径,未命中的线程被屏蔽,导致有效吞吐下降。因此在高性能算子中,通常让相邻线程处理连续且行为一致的数据,避免在Warp内出现条件分支。另一个重要概念是占用率(Occupancy),即每个SM上活跃Warp数与硬件上限的比值。占用率过低无法掩盖访存延迟,过高则可能因寄存器压力导致溢出,需要结合具体算子调优。
二、CUDA核心与Tensor Core:两种算力的分工
CUDA核心是通用标量/向量浮点与整数运算单元,适合逐元素运算、归约、索引计算、控制逻辑以及非规则计算。Tensor Core是专用于矩阵乘加(MMA)的加速单元,在单条指令内完成小矩阵块的乘累加,显著提升FP16、BF16、INT8等低精度矩阵运算吞吐,是Transformer、卷积等深度学习算子的核心算力来源。
两者并非替代关系,而是分工协作:卷积或全连接层的主体矩阵乘交给Tensor Core,偏置、激活、归一化、坐标变换等由CUDA核心完成。自动驾驶模型常包含大量小算子与动态形状,若全部依赖Tensor Core,反而会因频繁的kernel启动与数据搬运而降低整体效率。因此,算子融合与图优化是部署中的常见手段。
// 典型MMA片段(示意)
// A: 16x16 FP16, B: 16x16 FP16, C/D: 16x16 FP32
mma.sync.aligned.m16n8k16.row.col.f32.f16.f16.f32
{d0,d1,d2,d3}, {a0,a1,a2,a3}, {b0,b1}, {c0,c1,c2,c3};
三、显存层次:带宽与容量的双重约束
GPU显存层次从寄存器、共享内存/L1、L2到全局显存(HBM/GDDR),容量递增、带宽递减、延迟递增。寄存器访问最快但数量有限;共享内存由线程块内线程共享,适合做数据复用与块内通信;L2为全芯片共享缓存;全局显存容量最大,是模型权重、激活与中间张量的主要存放位置。
自动驾驶部署中,显存压力主要来自三方面:模型权重、激活张量以及多路摄像头/激光雷达的输入缓存。若显存不足,会触发换页或直接OOM;若带宽不足,则表现为算子利用率低、kernel等待数据。优化方向包括:使用低精度权重、减少中间张量驻留、提高共享内存复用率、合并小规模访存。
| 层次 | 典型容量 | 访问速度 | 主要用途 |
|---|---|---|---|
| 寄存器 | 每线程数十~255个 | 最快 | 线程私有变量、累加器 |
| 共享内存/L1 | 每SM数十~上百KB | 很快 | 块内数据复用、Tile缓存 |
| L2缓存 | 数MB~数十MB | 较快 | 跨SM数据共享、访存合并 |
| 全局显存 | 8GB~80GB+ | 相对慢 | 权重、激活、输入输出张量 |
四、流与并发:让计算与搬运重叠
CUDA流(Stream)是一组按顺序执行的异步操作队列。不同流之间可并发执行,从而实现kernel与拷贝、kernel与kernel的重叠。在自动驾驶流水线中,典型做法是:将图像预处理、推理、后处理分配到不同流,并用事件(Event)做依赖同步,使前一帧的后处理与下一帧的推理并行,提升端到端吞吐。
并发能否真正发生,取决于硬件资源是否充足。若单个kernel已占满SM与显存带宽,多流并发收益有限;若kernel规模较小、资源占用低,多流可显著提升利用率。此外,使用CUDA Graph可将多次kernel启动与依赖固化为一张图,减少启动开销,适合推理服务中固定拓扑的重复执行。
五、典型自动驾驶GPU平台与选型
自动驾驶GPU平台通常分为车载嵌入式与数据中心/训练两类。车载平台强调功耗、散热与功能安全,常见如NVIDIA Orin系列,集成GPU与AI加速器,支持多路摄像头与激光雷达接入;数据中心平台如A100/H100,强调大显存与高带宽,用于模型训练与大规模仿真。选型时需综合算力(FP16/INT8 TOPS)、显存容量与带宽、功耗、接口与软件栈成熟度。
# 查看GPU与显存信息
nvidia-smi --query-gpu=name,memory.total,memory.used,utilization.gpu --format=csv
# 查看CUDA版本与驱动
nvcc --version
六、常见误区与复盘
- 误区一:认为Tensor Core越多越好。实际受限于数据搬运与算子形状,小矩阵或动态形状下Tensor Core利用率可能很低。
- 误区二:忽略显存带宽。很多推理瓶颈不在算力,而在权重与激活的反复读写。
- 误区三:盲目多流并发。资源已饱和时,多流只会增加调度开销与上下文切换。
- 复盘要点:先定位瓶颈属于计算、访存还是调度,再选择优化手段;用Nsight工具验证,而非凭经验猜测。
综上,GPU部署的核心在于把算法特征映射到合适的执行单元与存储层次,并用流与图调度隐藏延迟。只有同时理解SIMT、Tensor Core、显存层次与并发机制,才能在自动驾驶场景中做出稳定、可复现的性能决策。