真实面经题目 · 原创解析
LLM 推理算子中,Tensor Core、WMMA 和 MMA 分别是什么,工程上如何选择使用层级?
这题考候选人是否理解 NVIDIA GPU 矩阵乘加的硬件、CUDA C++ 抽象和更底层指令接口。回答要能说明 Tensor Core 是硬件单元,WMMA 是较高层 CUDA API,MMA 是更贴近指令和 PTX 的矩阵乘加操作。
真实面经题目 · 原创解析
这题考候选人是否理解 NVIDIA GPU 矩阵乘加的硬件、CUDA C++ 抽象和更底层指令接口。回答要能说明 Tensor Core 是硬件单元,WMMA 是较高层 CUDA API,MMA 是更贴近指令和 PTX 的矩阵乘加操作。
我会把三者放在不同层级理解。Tensor Core 是 GPU 上专门做小块矩阵乘加的硬件执行单元,用来加速 FP16、BF16、TF32、INT8、FP8 等低精度或混合精度矩阵计算。WMMA 是 CUDA C++ 提供的 warp-level matrix multiply-accumulate API,它把矩阵 fragment、load、mma、store 封装起来,适合学习和写相对可维护的自定义 kernel。MMA 更贴近底层指令,例如 PTX 或 CUDA 内联汇编里的 mma 操作,能精细控制 tile shape、数据类型、寄存器布局和流水线,常用于高性能 GEMM、attention 或量化 kernel。工程上如果只是业务推理,优先用 cuBLAS/cuBLASLt、CUTLASS 或推理框架;需要自定义算子时先考虑 CUTLASS 或 WMMA;当性能瓶颈明确、需要极致控制时才手写 MMA,并配合 shared memory tiling、寄存器复用、异步拷贝和 profiler 验证。
Tensor Core 不是一个 API 名字,而是 GPU 上加速矩阵乘加的硬件单元。它通常以小 tile 为粒度执行 D = A × B + C,服务于 GEMM、attention、卷积展开后的矩阵乘等高吞吐场景。LLM 推理大量线性层和 attention 计算能受益于它。
WMMA 提供 warp 级矩阵乘加接口,开发者用 fragment 表示矩阵块,通过 load_matrix_sync、mma_sync、store_matrix_sync 完成加载、计算和写回。它比手写指令友好,代码可读性更好,但可控性和能覆盖的指令形态有限。
MMA 通常指底层矩阵乘加指令或相关内联汇编接口。它暴露更多硬件细节,比如具体 tile shape、operand layout、数据类型组合、寄存器组织和同步约束。高性能库或极致优化 kernel 会用这一层获取更高控制力,但代码复杂度和可移植成本也更高。
如果需求是稳定、高性能的标准 GEMM,优先使用 cuBLAS/cuBLASLt 或成熟推理框架;如果要写带自定义 epilogue、量化、融合操作的 kernel,可以先看 CUTLASS 或 WMMA;只有当已有库无法满足数据布局、融合、延迟或特殊精度要求时,才值得手写 MMA 级实现。
使用 Tensor Core 不等于自动满性能。还要让 GMEM 到 SMEM、SMEM 到寄存器、MMA 计算、写回和 epilogue 形成流水线,处理好对齐、bank conflict、occupancy、寄存器压力和数据复用。很多 kernel 慢不是 Tensor Core 算不快,而是喂不饱。
LLM 推理常见 FP16/BF16/INT8/FP8 或混合精度路径,选择接口时要确认硬件架构、数据类型支持、累加精度和数值误差。自定义 kernel 还常把 bias、activation、dequant、scale、mask 或 residual 融合进 epilogue,减少额外访存。
WMMA 是开发自定义 CUDA kernel 的编程接口,cuBLAS 是成熟矩阵计算库。业务代码通常优先用 cuBLAS/cuBLASLt;WMMA 更适合需要自己写 kernel 的场景。
高性能 GEMM 需要完整处理分块、数据搬运、流水线、occupancy、寄存器压力和 epilogue。成熟库已经做了大量架构适配,手写只控制指令通常不够。
不是。不同 GPU 架构支持的类型不同,常见有 FP16、BF16、TF32、INT8、FP8 等路径。面试里应强调依赖硬件架构和 CUDA 支持,而不是固定一种类型。
GEMM 之后常接 bias、scale、activation、dequant、residual 等操作。如果拆成多个 kernel,会增加显存读写和 launch 开销;融合能减少访存和延迟。