Shared_Memory_&_SRAM
2026/7/23大约 4 分钟
在英伟达 GPU(以及许多异构处理器)的语境下,SRAM 是一种芯片硬件层面的“晶体管物理构造”,而 Shared Memory(共享内存)则是运行在这个硬件上的一种“软件可控的存储层级抽象”。
它们的关系就像 “硅基木材”与“做出来的桌子”。为了让你在底层架构和算子开发时完全不混淆,我们直接切入它们的物理本质和本质区别:
一、 SRAM:物理硬件材料(It's Hardware)
SRAM(Static Random-Access Memory,静态随机存取内存) 是一种纯粹的物理硬件芯片构造。
- 物理实现:它通常由 6 个晶体管(6T)组成一个比特位。它不需要刷新电路,只要通电,数据就能永久锁死在晶体管的状态里。
- 物理特性:
- 速度无敌快:它的读写延迟通常只有几个时钟周期(几纳秒),而显卡片外的主显存(HBM 或 GDDR)读写延迟高达几百个周期(数百纳秒)。
- 能耗极低:因为数据不需要像 DRAM 那样频繁电容充放电,所以搬运数据的功耗非常小。
- 面积巨大、容量极小:6个晶体管才存1个比特,导致它在硅片上极其吃面积。所以每块显卡内部的 SRAM 总量非常珍贵(通常只有几百 KB 到十几 MB)。
- 硬件分工:在 GPU 芯片内部,所有的 L1 Cache(一级缓存)、L2 Cache(二级缓存)、寄存器堆(Register File)以及共享内存(Shared Memory),在物理材料上全都是由 SRAM 制造的。
二、 Shared Memory:软件和架构层面的抽象(It's Architecture / Software Logic)
Shared Memory(共享内存) 是 GPU 流多处理器(SM)内部、由程序员通过代码完全控制的、驻留在 SRAM 硬件上的一块高速存储空间。
- 它的存在意义:传统的 CPU 缓存(L1/L2 Cache)是“硬件和操作系统完全托管”的,程序员写代码时无法决定把哪个变量锁在 L1 缓存里。而 GPU 为了追求极致的算子性能,开辟了 Shared Memory。它在编程模型里是一个明确暴露给程序员的地址空间。
- 核心特性:
- 软件可控(Scratchpad Memory):你可以像在 Triton 或 CUDA C++ 里写
tl.load或分配共享空间那样,强行命令数据“现在、立刻、马上从主显存搬进这块高速空间,我不发指令你绝对不准把它擦掉”。 - 线程块内共享(Block-level Shared):同一个线程块(Thread Block / Warp Group)内部的所有并发线程,都可以同时读写这块内存空间,用来进行跨线程的高速数据交换和协同。
三、 核心区别横评表
| 维度 | SRAM(静态随机存取内存) | Shared Memory(共享内存) |
|---|---|---|
| 本质属性 | 芯片物理晶体管构造(硬件层) | 内存层次抽象与编程模型接口(软件/架构层) |
| 充当的角色 | 原材料。GPU 内部的寄存器、L1、L2 缓存全部由它充当。 | 具体的储物间。它是硬件划分出来专供程序员代码调度的独立空间。 |
| 可控性 | 程序员无法直接感知或操作具体的晶体管。 | 程序员在算子开发(如 Triton、CUDA)中可以直接分配、读写它。 |
| 生命周期 | 与显卡硬件共存亡(只要通电就在)。 | 随着当前执行的算子(Kernel)线程块的启动而创建,销毁而释放。 |
💡 在大模型算子(如 FlashAttention)里,它们是怎么交织的?
当你在手写一个 FlashAttention 或者是矩阵乘法算子时:
- 你规划了一个 Tiling(分块算法) 逻辑,开辟了一块名为
smem的共享内存。 - 你的代码发动指令,把 $Q, K$ 矩阵的小方块从 HBM(慢速主显存)搬运到
smem里。 - 物理发生的事情:显卡硬件收到指令,启动 DMA 或 TMA 硬件单元,把数据通过总线抽向了物理 SRAM 芯片颗粒 中那块被划分为 Shared Memory 的特定晶体管区域。
- 紧接着,你让各个线程去
smem里读数据算 Softmax。这时候,如果读写的索引没设计好,32个线程撞在了同一个物理 SRAM 晶体管分区上,就会触发我们前面提到的 Bank 冲突。
极简总结: SRAM 规定了这块存储能跑多快(硬件天花板),而 Shared Memory 决定了程序员能在这么快的存储里玩出什么花样(算子融合、消灭带宽瓶颈)。
