面灵AI→

沐曦 AI 工程师笔试加一面:roofline、算子瓶颈与 stall 定位

轮次
笔试、一面
结果
进二面
时间
2026-10
来源
牛客网

《面试题目》

  1. GPU 和 DCU 在底层架构上具体有什么区别?
  2. SpMV 和 GEMM 的特性分别是什么?
  3. 针对 CPU 优化,跨 NUMA 掉性能怎么调?OpenMP 怎么用?
  4. 矩阵乘的分块优化怎么实现?
  5. 实习做的什么?为什么做了一份跟方向不相关的工作?对 TTS 的实现有什么了解?
  6. 平时用哪些调优工具,主要看哪些条目?
  7. 发生 stall 时主要有哪些情况分类?怎么定位 stall 的原因?
  8. CPU 和 GPU 并发时,CPU 调度太慢,怎么提高整体性能?
  9. 一个 CUDA kernel 在 launch 的时候,CPU 都做了哪些事?
  10. 怎么判断一个算子是带宽瓶颈还是计算瓶颈?
  11. 介绍一下 roofline 模型和算术强度。
  12. 接触过 DSA 编程吗?
  13. 了解算子融合吗?举一个具体的例子。
  14. 平时工作学习里 AI 用得多吗?怎么排工作流?

《参考解析》

roofline 与算术强度:横轴是算术强度(FLOP/Byte),纵轴是可达性能,屋顶由两条线拼成——左侧斜线是带宽上限(峰值带宽乘算术强度),右侧平台是算力上限,交点对应的算术强度就是机器的拐点。算子落在斜线区是带宽瓶颈,落在平台区是计算瓶颈。判断别凭感觉,看 profiler 的 memory 与 compute throughput 占比。

stall 分类与定位:常见的有 long scoreboard(等全局内存)、short scoreboard(等共享内存)、barrier(等同步)、MIO throttle(共享内存或特殊功能单元排队)、math pipe throttle(计算单元打满)、not selected。Nsight Compute 的 Warp State 页直接给占比,先看最高的一类,再回源码找对应的访存模式、bank conflict 或同步点。

SpMV 与 GEMM:GEMM 计算密集、数据可复用,靠分块提高片上复用率,shared memory 加 register tiling;SpMV 访存不规整、每行非零元个数不定,算术强度极低,几乎必然带宽受限,方向是换压缩格式(CSR、ELL)、按行分组降低 warp 内负载不均、向量化访存。

CPU 侧与 launch 开销:跨 NUMA 掉性能通常是内存分到了远端节点,用 numactl 同时绑核绑内存,OpenMP 还要注意线程亲和性与 false sharing。CPU 调度跟不上 GPU 时问题多在提交路径:每次 launch 要走驱动做参数拷贝、上下文检查、命令入队,小 kernel 多了固定开销超过计算本身,解法是 CUDA Graph、批量提交或算子融合。