面灵AI→

10.23 禾赛科技高性能计算一面:DCU 与 GPU 的架构差异,手撕共享内存 GEMM

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 先做一个自我介绍。
  2. 你们这个 DCU 跟 GPU 有什么区别?
  3. 它的编程语言是一个类似 CUDA 的语言吗?
  4. DCU 跟 GPU 详细的硬件架构区别讲一下。
  5. 它的算力跟通信带宽是怎么样的?
  6. 它支持 FP8 吗?
  7. 为什么选这个平台做优化?
  8. 用的 DCU 是哪几个版本?显存有多大?
  9. 手撕:用 CUDA 写 GEMM,要求利用共享内存 tile 优化,减少 HBM 访问。
  10. 反问。

《参考解析》

DCU 与 GPU 的定位差异:DCU 是海光的通用计算加速卡,走 GPGPU 路线,软件栈对 CUDA 做兼容(HIP 风格接口 + 自家工具链),所以「像不像 CUDA」的答案是:源码迁移成本低,但底层调度、库覆盖与算子调优要重做。硬件上它是大量计算单元(CU)组成的 SIMD 阵列,每个 CU 内有多组 SIMD 单元与向量寄存器,配 HBM 与高带宽互联;与 NVIDIA 的差异在 SM 的组织方式、wavefront 宽度、缓存层级与互联拓扑,这些差异决定同一个 kernel 在两边的最优 block 大小与占用率不同。

算力与带宽怎么答:不要只报一个 TFLOPS,要分精度报(FP64/FP32/FP16/BF16/INT8),并说清是峰值还是实测、是否含稀疏加速。带宽同理:HBM 带宽、卡间互联带宽、主机到设备的 PCIe 带宽是三件事。用 roofline 收口:算这个算子每做一次浮点运算要搬多少字节,得到算术强度,再与机器的算力带宽比对照,判断是计算密集还是访存密集,这决定优化方向是提占用率还是减少搬运。FP8 要照实说:支持就讲清是 E4M3 还是 E5M2、是否需要缩放因子;不支持就说清项目里因此用了 FP16/BF16。

为什么选这个平台:这题在验证你是不是真做过选型。合理理由包括供应与合规、单位算力成本、显存够放下大矩阵、以及已有的集群生态;同时承认代价——算子库不全、调优资料少、出问题只能读源码或找原厂。只说「国产化」会被认为没参与决策。

共享内存 GEMM 的写法:核心是把大矩阵分块,让每个 block 负责输出矩阵的一个 tile。每线程负责 tile 内一个或几个元素,沿 K 维循环:先把 A、B 对应的子块从 global memory 协作搬进 shared memory(每个线程搬若干元素,注意合并访问),__syncthreads() 后每个线程只从 shared memory 读取并累加到寄存器,再同步进入下一块。这样每个元素从 HBM 读的次数从 O(K) 降到 O(K/tile),全局访存量降一个量级。要点:block tile 常见 16×16 或 32×32,每线程算 4×4 或 8×8 的微 tile 以复用寄存器;shared memory 按 [tile][tile+1] 填充避免 bank conflict;用 double buffering(cp.async 或分两块交替)把下一块的加载和当前块的计算重叠;边界块要判越界;最后调 block 大小与占用率,别为了大 tile 把 shared memory 占满导致 occupancy 掉到 25% 以下。

手撕的评分点:看的不是跑分,而是你有没有把「分块 → 协作加载 → 同步 → 寄存器累加 → 写回」这条链路写对,以及能不能解释每个参数为什么这么取。写完主动说瓶颈(shared memory 带宽、同步次数、寄存器压力)与下一步改法(向量化加载、float4、split-K),比闷头调参要好。