真实面经题目 · 原创解析

LLM 推理算子中,Tensor Core、WMMA 和 MMA 分别是什么,工程上如何选择使用层级?

这题考候选人是否理解 NVIDIA GPU 矩阵乘加的硬件、CUDA C++ 抽象和更底层指令接口。回答要能说明 Tensor Core 是硬件单元,WMMA 是较高层 CUDA API,MMA 是更贴近指令和 PTX 的矩阵乘加操作。

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

60 秒回答模板

我会把三者放在不同层级理解。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 编程层级取舍

深入解析

01

Tensor Core 是硬件能力

Tensor Core 不是一个 API 名字,而是 GPU 上加速矩阵乘加的硬件单元。它通常以小 tile 为粒度执行 D = A × B + C,服务于 GEMM、attention、卷积展开后的矩阵乘等高吞吐场景。LLM 推理大量线性层和 attention 计算能受益于它。

02

WMMA 是 CUDA C++ 抽象

WMMA 提供 warp 级矩阵乘加接口,开发者用 fragment 表示矩阵块,通过 load_matrix_sync、mma_sync、store_matrix_sync 完成加载、计算和写回。它比手写指令友好,代码可读性更好,但可控性和能覆盖的指令形态有限。

03

MMA 更贴近底层指令

MMA 通常指底层矩阵乘加指令或相关内联汇编接口。它暴露更多硬件细节,比如具体 tile shape、operand layout、数据类型组合、寄存器组织和同步约束。高性能库或极致优化 kernel 会用这一层获取更高控制力,但代码复杂度和可移植成本也更高。

04

选择层级要看目标

如果需求是稳定、高性能的标准 GEMM,优先使用 cuBLAS/cuBLASLt 或成熟推理框架;如果要写带自定义 epilogue、量化、融合操作的 kernel,可以先看 CUTLASS 或 WMMA;只有当已有库无法满足数据布局、融合、延迟或特殊精度要求时,才值得手写 MMA 级实现。

05

性能来自整条流水线

使用 Tensor Core 不等于自动满性能。还要让 GMEM 到 SMEM、SMEM 到寄存器、MMA 计算、写回和 epilogue 形成流水线,处理好对齐、bank conflict、occupancy、寄存器压力和数据复用。很多 kernel 慢不是 Tensor Core 算不快,而是喂不饱。

06

推理场景要考虑精度和融合

LLM 推理常见 FP16/BF16/INT8/FP8 或混合精度路径,选择接口时要确认硬件架构、数据类型支持、累加精度和数值误差。自定义 kernel 还常把 bias、activation、dequant、scale、mask 或 residual 融合进 epilogue,减少额外访存。

易错点

  • 把 Tensor Core、WMMA、MMA 都说成同一个 API,没有分清硬件、封装和指令层。
  • 认为用了 Tensor Core 就一定高性能,忽略数据搬运和流水线。
  • 一上来就说手写 MMA,没说明为什么不用 cuBLAS、cuBLASLt、CUTLASS 或框架算子。
  • 只讲 FP16,不提 BF16、TF32、INT8、FP8 等取决于架构和精度需求的路径。
  • 忽略累加精度和数值误差,回答只关注速度。
  • 不会把这个问题和 LLM 推理里的 GEMM、attention、量化和融合算子联系起来。

面试官追问

WMMA 和 cuBLAS 是什么关系?

WMMA 是开发自定义 CUDA kernel 的编程接口,cuBLAS 是成熟矩阵计算库。业务代码通常优先用 cuBLAS/cuBLASLt;WMMA 更适合需要自己写 kernel 的场景。

为什么手写 MMA 不一定比库快?

高性能 GEMM 需要完整处理分块、数据搬运、流水线、occupancy、寄存器压力和 epilogue。成熟库已经做了大量架构适配,手写只控制指令通常不够。

Tensor Core 只支持 FP16 吗?

不是。不同 GPU 架构支持的类型不同,常见有 FP16、BF16、TF32、INT8、FP8 等路径。面试里应强调依赖硬件架构和 CUDA 支持,而不是固定一种类型。

LLM 推理为什么关注 epilogue 融合?

GEMM 之后常接 bias、scale、activation、dequant、residual 等操作。如果拆成多个 kernel,会增加显存读写和 launch 开销;融合能减少访存和延迟。