合并访存Memory coalescing
组织同组线程的访问地址,让硬件用较少的内存事务满足请求。
- 核心约束
- 改变线程与元素的对应布局时,必须保持每个元素的读写语义及有效访问范围。
- 适用问题
- GPU 张量访存、线程布局选择与带宽利用优化。
- 边界与取舍
- 事务减少不等于重复数据读取被消除,布局转换也可能有成本。
常见操作#
考察一组共同执行访存指令的线程:需要知道有效地址、元素宽度、对齐和目标硬件的内存事务粒度。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 计算访问覆盖的内存段 | 由地址分布与事务粒度决定 | 连续且对齐的访问通常覆盖较少的段;跨段、稀疏地址和有效线程掩码会改变结果。 |
| 调整线程与元素布局 | 编译分析与运行时布局转换分别核算 | 布局选择可以在编译时完成;需要的数据交换、转换指令及寄存器占用仍可能在运行时付出成本。 |
| 评估实际收益 | 结合访存事务、有效带宽与端到端耗时 | 事务数不能直接等同于显存物理读取量或执行时间,缓存命中、并发和其他指令也会影响结果。 |
时间与空间#
- 时间成本
- 不套用统一大 O;按实际地址与硬件内存事务分析
- 空间成本
- 由布局、寄存器及可能使用的交换缓冲区决定
合并访存不改变算法所需的逻辑元素;它与跨迭代的数据复用、共享内存分块分别分析。
概念与变体#
- 合并访存
- 关注同组线程访问的地址覆盖多少内存段,减少满足这批请求所需的事务。
- 分块计算
- 关注把数据留在较快存储层中复用。两者可以配合,但不能仅凭分块布局名称认定已经减少重复读取。
工程中的应用#
1 个案例 · 附源码Triton 的 Coalesce pass 根据指针连续性、对齐和线程数量选择分块布局,并按需插入布局转换以保持上下游接口。
附源码片段 · 图处理与编译
基础原理参考资料
NVIDIA CUDA · Coalesced access to global memory按设备能力、地址对齐和访问模式分析内存事务;不把某一硬件粒度推广到所有架构。