中等CUDACUDA面试高频NVIDIA百度
CUDA 中 Global Memory、Shared Memory、Register 的区别?为什么 kernel 优化要关注它们?
8 0 0
参考答案
GPU 内存层级(从慢到快、从大到小): - **Global Memory(全局内存 / HBM)**:GPU 主显存(几十 GB),所有线程可访问,但延迟高(数百周期)、带宽相对有限。跨 kernel 持久。 - **Shared Memory(共享内存)**:位于 SM 内,一个 block 内的线程共享(几十~上百 KB/SM),延迟低(类似 L1 缓存),用于线程间协作和数据复用。生命周期为 block。 - **Register(寄存器)**:每个线程私有,最快,数量有限。用多了会"寄存器溢出"到 local memory(其实在慢速 global 里),损失性能。 **为什么优化要关注**: 1. **访存是主要瓶颈**:很多 GPU kernel 是 memory-bound,global memory 访问慢。优化核心是"减少 global memory 访问、提高数据复用"。 2. **Shared memory 做数据复用**:把要反复用的数据从 global 加载到 shared(如矩阵乘的 tiling、FlashAttention 的分块),显著减少 global 读写。 3. **合并访问(coalesced access)**:让同一 warp 的线程访问连续地址,合并成少数几次内存事务,充分利用带宽。 4. **寄存器/shared 用量影响 occupancy**:用太多会限制 SM 上并发的 warp 数,削弱延迟隐藏。 FlashAttention、GEMM、算子融合的本质都是围绕这个内存层级做数据搬运优化。
讨论区(0)
还没有评论,来做第一个发言的人吧