DevTech(题目未给完整职位) · Technical phone screen

Nvidia GPU 内存层级:HBM、Shared Memory 与寄存器怎么取舍

Nvidia DevTech 电面提到 GPU SRAM/HBM 差异;本文按可见范围、容量与复用说明 global memory、shared memory、cache、register 和 matmul tile。

题目重点:Nvidia DevTech 电面提到 GPU SRAM/HBM 差异;本文按可见范围、容量与复用说明 global memory、shared memory、cache、register 和 matmul tile。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练回答把 SRM 理解为片上 SRAM 相关存储,包括 shared memory、cache 与寄存器文件;面试时先问对方指哪一层。HBM 是部分 GPU 的外部显存技术,不能把所有 CUDA global memory 物理实现都说成 HBM。
  • 不报固定 GB、KB 或每 SM 上限;容量、bank 数、寄存器数和线程上限都依设备架构,应通过目标设备属性和性能工具确认。
  • 矩阵乘法 tile 例子用 FP16 输入、64×64 的 A/B 子块,仅演示数据装载量;真实 kernel 的矩阵形状、累加器和硬件指令未见题目。

解题路线

  1. 先按物理位置和可见范围区分:GPU DRAM 是大容量、所有 SM 可访问的 global memory;每个 SM 的 shared memory 是块内线程可协作使用的片上存储;寄存器通常保存线程私有临时量;L1/L2 cache 由硬件管理,L2 跨 SM 共享。
  2. shared memory 容量较小但适合把一块会重复使用的数据从 global memory 搬进来;块内线程需协作装载并在需要处同步。若访问造成 bank conflict 或装载量超过可用空间,局部化可能不增反降。
  3. 寄存器预算影响同时驻留的 warps/blocks;过多线程私有临时量可能导致 spilling。CUDA 的“local memory”是逻辑上每线程私有,物理上通常位于设备内存,不应因名称 local 就当成片上 SRAM。
  4. 用 roofline 思路比较运算量与 global memory 字节数,先判断访存还是计算瓶颈,再决定分块、合并访存、缓存策略和线程映射。具体收益要用 profiler 量测。

手动走一遍

训练例中 A 和 B 各取 64×64 的 FP16 tile,共 2×64×64×2=16,384 字节,约 16 KiB 的输入片段可放入 shared memory 的候选预算。块内重复用这些元素计算输出子块,可减少从 global memory 反复取相同数据;但输出累加器、双缓冲、对齐和寄存器仍占资源,不能只凭 16 KiB 宣称可行或最优。

规模与取舍

全局矩阵仍需存 O(MK+KN+MN) 个元素;tile 边长 B 的两个 FP16 输入块约 4B² 字节片上存储,不含累加器和缓冲。分块可改善数据复用,但占用更多 shared memory 或寄存器可能降低 occupancy,最终时间由带宽、计算吞吐、同步和调度共同决定。

易错点与追问

容易失分的边界

  • 把 HBM、global memory、shared memory 当成完全同义;前者是物理存储技术,后两者是 CUDA 可见的不同内存空间。
  • 认为 local memory 必然在片上;CUDA local 主要描述线程私有地址空间,溢出可落在设备内存。
  • 说 shared memory 一定比 global 快而不看 bank conflict、装载/同步开销和缓存命中。
  • 死记某代 GPU 的容量或线程上限,在未指定硬件时当成通用答案。

继续深挖

  • 若面试官给具体型号,再查 shared memory/SM、每块资源、寄存器预算和 HBM 带宽,估计 tile 与 occupancy。
  • 若 matmul 访存占主导,比较合并 global memory 访问和 shared memory 复用;若计算占主导,讨论矩阵指令与精度取舍。
  • 若多个 GPU 参与训练,HBM 之外还要考虑设备间互联、all-reduce 与跨设备数据放置。

技术参考

✓已复制微信号!