1. CUDA 合并访存的核心概念
1.1 为什么内存访问是 GPU 性能瓶颈
在 GPU 并行计算中,我们经常陷入一个误区:认为增加更多的线程就能线性提升性能。但实际上,现代 GPU 的算力已经足够强大,真正的瓶颈往往在于内存访问效率。一个典型的 NVIDIA GPU 可能有数千个 CUDA 核心,但全局内存的访问延迟高达 400-800 个时钟周期,是寄存器访问的 100-200 倍。
关键数据:在 Turing 架构的 RTX 2080 Ti 上,L1 缓存延迟约 140 周期,而全局内存延迟可达 700 周期。这意味着一个错误的内存访问模式可能让 GPU 核心 90% 的时间都在等待数据。
1.2 Warp:GPU 的调度单位
理解合并访存必须从 Warp 开始。NVIDIA GPU 以 32 个线程为一组(称为 Warp)进行调度:
- SIMT 执行模式:Warp 内所有线程执行相同指令(可能有分支分歧)
- 内存访问同步性:Warp 内所有线程的内存请求会同时发出
- 合并条件:当 Warp 内线程访问连续且对齐的内存区域时,硬件会自动合并访问
在 Volta 架构及之后的 GPU 中,独立线程调度(Independent Thread Scheduling)允许更灵活的 Warp 行为,但内存访问合并的基本规则仍然适用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 合并访存的实现原理
2.1 合并访存的硬件基础
现代 GPU 的内存子系统采用分层设计:
- 全局内存:高延迟(400-800周期),高带宽(500-1000GB/s)
- L2 缓存:所有 SM 共享,缓存行通常为 128 字节
- L1 缓存/共享内存:每个 SM 独享,缓存行通常为 128 字节
当 Warp 发起内存请求时,内存控制器会检查访问模式:
- 理想情况:32 个线程访问连续的 128 字节区域(对应 32×4 字节)
- 最差情况:32 个线程访问分散的 32 个字节(需要 32 次内存事务)
2.2 合并访存的数学表达
设 Warp 中线程 i 访问的地址为:
code复制addr_i = base_addr + stride × i
合并访存的条件是:
