清微智能一面(高性能):FlashAttention、FP16/BF16 与 SpMV
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 做一个自我介绍。
- 你之前那段实习使用的设备是什么?是 GPU 吗?
- 你学业课题里用的计算加速设备基本上都是 GPU 吗?
- DCU 能讲一下吗?
- 讲讲你做的算子的功能和精度细节,以及所用设备的体系结构。
- 这个成果是团队一起做的,还是你一个人做的?写论文了吗?发表了吗?
- 深度学习、大模型里的矩阵乘优化,以前接触过吗?
- 这套东西你之前手写过吗?
- 你提到 FlashAttention,解释一下它「flash」在什么地方?
- 这套东西让你用 CUDA 写,你觉得应该注意哪些思想?
- FP16 和 BF16 这两种 16 bit 浮点各有什么特点?
- float 的指数位、尾数位各有多少位?
- 不带转置的矩阵乘有做过吗?
- 给你稀疏矩阵做 SpMV,你会硬做还是先转成 CSR/COO?
《参考解析》
FlashAttention 的「flash」是「不把完整注意力矩阵写回显存」。标准注意力要物化 N×N 的分数矩阵,显存占用随序列长度平方增长;FlashAttention 用分块(tiling)在 SRAM 里算局部块,配合在线 softmax 逐步累积,避免中间矩阵落 HBM,从而把显存降到线性、速度也更快。
用 CUDA 实现时要注意的点:合并访存、shared memory 的分块与 bank conflict、warp 内协作、寄存器压力与 occupancy 的平衡、边界处理(非整除的块)、以及数值稳定性(softmax 减最大值)。
FP16 与 BF16 都是 16 位:FP16 有 5 位指数 + 10 位尾数,精度高但动态范围小,容易溢出;BF16 有 8 位指数 + 7 位尾数,动态范围和 FP32 一致但精度低,训练中更稳。float32 是 1 位符号 + 8 位指数 + 23 位尾数。
SpMV 先用合适格式再优化:CSR 适合按行遍历和 GPU 并行,COO 适合构建和转换,ELL 适合每行非零数接近的场景。直接按稠密矩阵硬做会浪费大量带宽,稀疏场景下带宽就是瓶颈。