先把两个“原子”分开,否则很容易混:
- PCIe AtomicOp:PCIe 链路上的原子事务(FetchAdd / Swap / CAS),设备对系统内存/对端内存做“读-改-写”不被打断。
- NVMe 原子写 / atomic write:NVMe 命令级语义,保证若干 LBA 的写“要么全成、要么全不成”,是存储一致性概念,不是 PCIe AtomicOp。
一、PCIe 原子操作主要用在哪些场景
PCIe AtomicOp 从 PCIe 3.0 起正式增强,核心是让IO 设备像 CPU 一样对共享内存做无锁 RMW(Read-Modify-Write)。
典型场景:
- 设备 ↔ 主机共享内存的同步
- GPU / DPU / 智能网卡更新主机内存里的队列头/尾指针
- 无锁队列、ring buffer 生产/消费指针
- 信号量、barrier、eventfd 类轻量同步
- 多设备协同
- GPU↔GPU、NIC↔GPU、FPGA↔GPU 更新共享计数器
- HSA / ROCm 里用 64-bit FetchAdd 更新 dispatch id,用 CAS 做无锁同步
- 分布式 / RDMA 场景
- NIC 对主机内存里的统计计数器做 FetchAdd
- 多 writer 场景避免“读-改-写”被插空
- IO 设备自己做无锁算法
- 原来要靠“主机 CPU 用 LOCK 指令”或“设备读回→算→写回(非原子)”
- AtomicOp 把 RMW 压成一笔 TLP,由 Completer(RC/内存控制器)原子完成
一句话:只要“多个 PCIe 设备 / CPU / 加速器”并发访问同一块内存里的控制变量、指针、计数器、信号量,又不想靠锁和往返软件协调,就可能用 PCIe AtomicOp。
二、NVMe 设备是否需要“发起”PCIe 原子操作?
普通 NVMe SSD:通常不需要,也不是必须
标准 NVMe 模型是:
- 主机写Submission Queue (SQ)
- 主机写Doorbell MMIO
- 设备 DMA 读 SQ 命令
- 设备 DMA 读写数据
- 设备写Completion Queue (CQ)
- 设备发 MSI-X 中断
这里面:
- SQ/CQ 本来就是“单写者”结构:
- SQ:主机写,设备读
- CQ:设备写,主机读
- Doorbell 是普通 MMIO 写
- 主机和设备之间不需要用 PCIe CAS/FetchAdd 来抢同一变量
所以传统 NVMe SSD 不需要作为 AtomicOp Requester 去更新主机内存。
但有些“高级 NVMe / 类 NVMe 设备”可能会用
以下情况 NVMe 控制器可能发起 PCIe AtomicOp:
- NVMe 用 Host Memory Buffer (HMB) 放 FTL/元数据,并且多控制器/多函数共享
- 多函数 SSD、SR-IOV NVMe
- 多个 controller 更新同一块主机内存里的队列/引用计数/锁变量
- 可以用 FetchAdd/CAS 避免来回加锁
- NVMe 支持 Shared Queue / 多 host 多 controller 架构
- 多 port、multi-controller namespace
- 设备内部多个核更新主机侧共享队列头尾
- NVMe 做 GPU/NIC 协同、计算存储、CXL/PCIe 共享内存编程
- 比如“存储设备同时是加速器”
- 要在主机内存里更新信号量、完成计数、task id
- 厂商私有扩展
- 有些 SSD 控制器用 AtomicOp 更新主机内存里的统计/telemetry/IO 调度结构
- 但这不是 NVMe base spec 的硬性要求
三、NVMe 的“原子性”更多靠这些,而不是 PCIe AtomicOp
NVMe 自己谈的 atomic 主要是:
- Atomic Write Unit (AWUN / NAWUN)
- Atomic Write Unit Power Fail (AWUPF / NAWUPF)
- Atomic Compare & Write(可选)
- Reservation / Namespace locking
- 控制器内部保证多命令、掉电、FTL 映射更新的一致性
这些是“写盘原子性”,解决 partial write / torn write,和 PCIe FetchAdd/CAS 不是一回事。
四、结论
- PCIe AtomicOp 场景:GPU/NIC/DPU/FPGA 对主机或对端内存做无锁同步、队列指针、计数器、信号量。
- 普通 NVMe SSD:一般不发起 PCIe AtomicOp;它用 MMIO doorbell + DMA + 单写者队列模型就够了。
- 高级 NVMe(HMB、SR-IOV、multi-controller、计算存储):可能会用 PCIe AtomicOp,但不是 NVMe 基本模型必需。
- 别把NVMe atomic write 和PCIe AtomicOp 混为一谈。