【infra之路】Shared Memory 的访问范围:严格限定于单个 SM

Shared Memory 是 SM 私有的,只有分配到该 SM 上的 Block 才能访问。 其他 SM 上的线程无法直接读写任何非本 SM 的 Shared Memory。


核心规则

问题 答案
同一 SM 内的多个 Block 能否共享 SMEM? ❌ 不能。每个 Block 有独立的 SMEM 分配,互不可见
不同 SM 上的线程能否访问同一块 SMEM? ❌ 绝对不能。SMEM 没有全局地址空间
SMEM 的生命周期 从 Block 调度到 SM 开始,到 Block 执行结束为止
SMEM 的物理位置 嵌入在 SM 内部,与 L1 Cache 共用 SRAM,片外不可达

为什么这样设计?

复制代码
┌─────────────────────────────────────────────────────┐
│                    GPU Die                          │
│                                                     │
│  ┌──────────┐  ┌──────────┐       ┌──────────┐    │
│  │   SM 0   │  │   SM 1   │ ...   │   SM N   │    │
│  │ ┌──────┐ │  │ ┌──────┐ │       │ ┌──────┐ │    │
│  │ │ SMEM │ │  │ │ SMEM │ │       │ │ SMEM │ │    │
│  │ │(私有)│ │  │ │(私有)│ │       │ │(私有)│ │    │
│  │ └──────┘ │  │ └──────┘ │       │ └──────┘ │    │
│  └──────────┘  └──────────┘       └──────────┘    │
│        ↕              ↕                  ↕         │
│  ┌─────────────────────────────────────────────┐   │
│  │           L2 Cache (全芯片共享)              │   │
│  └─────────────────────────────────────────────┘   │
│                       ↕                            │
│  ┌─────────────────────────────────────────────┐   │
│  │              HBM / GDDR (全局)               │   │
│  └─────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘
  • 带宽 :SMEM 提供 ~20TB/s 级带宽,靠的是每个 SM 独立一份。如果全局共享,带宽会坍缩到 HBM 级别(~3TB/s)
  • 延迟:SMEM 延迟 ~30 cycles,因为物理距离在 SM 内部。跨 SM 访问不可能保持这个延迟
  • 同步 :__syncthreads() 只同步同一 Block 内的线程,正是因为 SMEM 的作用域就是 Block

如果需要跨 SM 通信怎么办?

必须通过更高层级的存储中转:

需求 机制 延迟代价
同 Grid 内 Block 间通信 Global Memory + __threadfence_system() / Cooperative Groups ~400+ cycles
同 Kernel 内流水线阶段 Persistent Thread + Global Memory 信号量 ~400+ cycles
跨 Kernel 数据传递 Global Memory / Managed Memory Kernel launch overhead
同 SM 内 Warp 间通信 Shared Memory ✅(同一 Block 内) ~30 cycles

⚠️ 注意 :即使是同一个 Grid 中的两个 Block 被调度到同一个 SM 上,它们的 SMEM 仍然是隔离的。SM 会为每个活跃 Block 分配独立的 SMEM 区域,彼此不可见。


常见误解澄清

误解 事实
"同一 SM 上的 Block 可以共享 SMEM" ❌ 每个 Block 有独立 SMEM 分区,硬件强制隔离
"SMEM 可以通过指针传给其他 SM" ❌ SMEM 地址是 SM 局部虚拟地址,跨 SM 无意义
"__shared__ 变量在所有 SM 上是同一份" ❌ 每个 SM 上每个 Block 都有自己的一份副本
"Hopper 的 TMA 让 SMEM 变全局了" ❌ TMA 只是异步拷贝引擎,目标仍是本 SM 的 SMEM

一句话总结

Shared Memory 是 SM 级别的私有资源,作用域严格等于一个 Block。它的高带宽和低延迟正是以"不可跨 SM 访问"为代价换来的。任何跨 SM 的数据交换都必须上升到 Global Memory 或更高层级------这是 GPU 存储层次中不可逾越的物理边界。

相关推荐
_Evan_Yao5 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
ESDWAN6 小时前
跨境网络丢包怎么定位?用MTR和Traceroute分析链路问题
网络
砺星Leetx6 小时前
工业总线选型与对接实战:PROFINET、EtherCAT、EtherNet/IP、PROFIBUS、Modbus-TCP 与 CC-Link
网络·网络协议·tcp/ip·控制器·国产拧紧系统
2401_868534786 小时前
软考网络规划设计师SSL协议知识点详解
服务器·网络
thefool1122667 小时前
TCP 1
java·1024程序员节
Escalating_xu7 小时前
【Linux 网络编程】手写序列化与反序列化:从 x op y 到能校验的文本协议
linux·运维·网络
润滑卫士7 小时前
油液多参数融合故障诊断:数据级融合与决策级融合方法
运维
李纲明8 小时前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie