真实面经题目 · 原创解析
LLM 推理算子优化中,Memory Coalescing 和 Bank Conflict 分别是什么,如何影响显存访问效率?
这题考 CUDA 访存优化在 LLM 推理算子里的基本功。回答要把 GMEM 的连续合并访问、SMEM 的 bank 并行访问、warp 级访问模式和 profiling 现象连起来,而不是只背两个定义。
真实面经题目 · 原创解析
这题考 CUDA 访存优化在 LLM 推理算子里的基本功。回答要把 GMEM 的连续合并访问、SMEM 的 bank 并行访问、warp 级访问模式和 profiling 现象连起来,而不是只背两个定义。
我会先区分两类问题:Memory Coalescing 主要发生在全局显存访问上,目标是让一个 warp 内线程访问连续、对齐、规则的地址,使硬件把多次 load/store 合并成尽量少的内存事务;Bank Conflict 主要发生在 shared memory 上,shared memory 被划成多个 bank,如果同一个 warp 的多个线程同时访问同一个 bank 的不同地址,就会被串行化,降低本来很低延迟的片上存储效率。在 LLM 推理算子里,矩阵乘、attention、norm、量化反量化都会频繁搬数据。如果 GMEM 访问不合并,带宽利用率低;如果 SMEM tile 布局造成 bank conflict,线程块内复用效率会下降。工程优化通常包括让线程映射匹配连续数据、使用向量化和对齐访问、调整 layout、padding shared memory、转置或 swizzle tile,并用 profiler 看内存事务、global load efficiency、shared memory replay 或 bank conflict 相关指标。
GMEM 是显卡全局显存,容量大但延迟高、依赖带宽利用率;SMEM 是线程块内共享的片上存储,延迟低、适合 tile 复用。Memory Coalescing 主要回答“全局显存访问有没有被合并成高效事务”,Bank Conflict 主要回答“shared memory 的 bank 并行能力有没有被冲突打碎”。
GPU 以 warp 为基本执行单位。如果一个 warp 的线程访问连续、对齐、规则的 GMEM 地址,硬件可以把访问合并成少量内存事务,带宽利用率高。如果线程访问跨 stride、离散地址或未对齐地址,就会拆成更多事务,同样的数据量需要更多 memory transaction,算子可能被全局显存带宽拖慢。
Shared memory 被划分为多个 bank,不同 bank 可以并行服务访问。若一个 warp 内多个线程访问同一个 bank 的不同地址,就会发生 bank conflict,访问被拆成多轮执行。它不是显存带宽不够,而是 SMEM 布局和线程索引映射不合理,导致片上存储的低延迟优势没有发挥出来。
GEMM、attention 和量化算子都会把矩阵或向量切成 tile。全局读写阶段如果线程映射不贴合连续数据,会破坏 coalescing;tile 放进 shared memory 后,如果按列访问、转置布局或 stride 恰好让多个线程落到同一 bank,就会触发 bank conflict。问题常出现在为了复用数据而改变 layout 的边界处。
GMEM 侧常见优化是保证对齐、连续、向量化访问,让相邻线程读写相邻元素,必要时调整数据布局或线程块映射。SMEM 侧常见优化是 padding、swizzle、换存储顺序、避免坏 stride,让 warp 内访问分散到不同 bank。优化不是盲目加 shared memory,而是让数据搬运和计算阶段都匹配硬件访问粒度。
判断优化是否有效,要看 global memory transaction、load/store efficiency、带宽利用率、SMEM bank conflict 或 replay、warp stall reason 等指标。若改完后理论访存量没变但事务数下降、stall memory 降低、算子耗时下降,才说明 coalescing 或 bank conflict 的优化真的生效。
不是。Coalescing 关注同一个 warp 的地址是否能合并成少量内存事务,缓存命中率关注数据是否已在 cache 中。访问可以合并但不命中,也可以命中但地址模式很差。
理论延迟更低,但前提是访问布局合理。如果 bank conflict 严重,或者搬入 shared memory 的额外开销超过复用收益,使用 shared memory 反而可能不划算。
转置会改变线程访问 shared memory 的 stride。若 stride 和 bank 数形成不利关系,一个 warp 内多个线程可能落到同一个 bank,需要用 padding 或 swizzle 打散。
GEMM、attention、RMSNorm/LayerNorm、embedding lookup、量化反量化和 KV cache 搬运都可能受访存模式影响。其中 GEMM 和 attention 的 tile 设计尤其依赖 GMEM/SMEM 协同。