真实面经题目 · 原创解析

LLM 推理算子优化中,Memory Coalescing 和 Bank Conflict 分别是什么,如何影响显存访问效率?

这题考 CUDA 访存优化在 LLM 推理算子里的基本功。回答要把 GMEM 的连续合并访问、SMEM 的 bank 并行访问、warp 级访问模式和 profiling 现象连起来,而不是只背两个定义。

出现于:阿里巴巴 · C/C++

60 秒回答模板

我会先区分两类问题: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 相关指标。

考点 两类存储
难度 真实面经题
回答目标 讲清 CUDA 访存模式和优化验证

深入解析

01

先区分 GMEM 和 SMEM

GMEM 是显卡全局显存,容量大但延迟高、依赖带宽利用率;SMEM 是线程块内共享的片上存储,延迟低、适合 tile 复用。Memory Coalescing 主要回答“全局显存访问有没有被合并成高效事务”,Bank Conflict 主要回答“shared memory 的 bank 并行能力有没有被冲突打碎”。

02

Memory Coalescing 看 warp 地址模式

GPU 以 warp 为基本执行单位。如果一个 warp 的线程访问连续、对齐、规则的 GMEM 地址,硬件可以把访问合并成少量内存事务,带宽利用率高。如果线程访问跨 stride、离散地址或未对齐地址,就会拆成更多事务,同样的数据量需要更多 memory transaction,算子可能被全局显存带宽拖慢。

03

Bank Conflict 看片上并行度

Shared memory 被划分为多个 bank,不同 bank 可以并行服务访问。若一个 warp 内多个线程访问同一个 bank 的不同地址,就会发生 bank conflict,访问被拆成多轮执行。它不是显存带宽不够,而是 SMEM 布局和线程索引映射不合理,导致片上存储的低延迟优势没有发挥出来。

04

推理算子里常见触发点

GEMM、attention 和量化算子都会把矩阵或向量切成 tile。全局读写阶段如果线程映射不贴合连续数据,会破坏 coalescing;tile 放进 shared memory 后,如果按列访问、转置布局或 stride 恰好让多个线程落到同一 bank,就会触发 bank conflict。问题常出现在为了复用数据而改变 layout 的边界处。

05

优化手段要贴着访问模式改

GMEM 侧常见优化是保证对齐、连续、向量化访问,让相邻线程读写相邻元素,必要时调整数据布局或线程块映射。SMEM 侧常见优化是 padding、swizzle、换存储顺序、避免坏 stride,让 warp 内访问分散到不同 bank。优化不是盲目加 shared memory,而是让数据搬运和计算阶段都匹配硬件访问粒度。

06

用 profiler 验证而不是靠猜

判断优化是否有效,要看 global memory transaction、load/store efficiency、带宽利用率、SMEM bank conflict 或 replay、warp stall reason 等指标。若改完后理论访存量没变但事务数下降、stall memory 降低、算子耗时下降,才说明 coalescing 或 bank conflict 的优化真的生效。

易错点

  • 只说全局内存慢、共享内存快,没有解释 warp 级地址合并和 bank 并行。
  • 把 Bank Conflict 误认为多个线程访问同一个地址;同一地址广播和同一 bank 不同地址冲突不是一回事。
  • 认为加 shared memory 一定变快,忽略搬运开销、occupancy 和 bank conflict。
  • 只背概念,不会说对齐、连续、padding、swizzle、线程映射这些工程手段。
  • 没有提 profiler 指标,无法证明瓶颈来自 coalescing 或 bank conflict。
  • 把所有访存问题都归因于显存带宽,忽略 shared memory 布局和 warp stall 的差异。

面试官追问

Memory Coalescing 和缓存命中率是同一件事吗?

不是。Coalescing 关注同一个 warp 的地址是否能合并成少量内存事务,缓存命中率关注数据是否已在 cache 中。访问可以合并但不命中,也可以命中但地址模式很差。

Shared memory 一定比 global memory 快吗?

理论延迟更低,但前提是访问布局合理。如果 bank conflict 严重,或者搬入 shared memory 的额外开销超过复用收益,使用 shared memory 反而可能不划算。

为什么矩阵转置容易出现 bank conflict?

转置会改变线程访问 shared memory 的 stride。若 stride 和 bank 数形成不利关系,一个 warp 内多个线程可能落到同一个 bank,需要用 padding 或 swizzle 打散。

LLM 推理里哪些算子最需要关注这些问题?

GEMM、attention、RMSNorm/LayerNorm、embedding lookup、量化反量化和 KV cache 搬运都可能受访存模式影响。其中 GEMM 和 attention 的 tile 设计尤其依赖 GMEM/SMEM 协同。