pcie原子操作和nvme原子操作

先把两个"原子"分开,否则很容易混:

  • 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)。

典型场景:

  1. 设备 ↔ 主机共享内存的同步
    • GPU / DPU / 智能网卡更新主机内存里的队列头/尾指针
    • 无锁队列、ring buffer 生产/消费指针
    • 信号量、barrier、eventfd 类轻量同步
  2. 多设备协同
    • GPU↔GPU、NIC↔GPU、FPGA↔GPU 更新共享计数器
    • HSA / ROCm 里用 64-bit FetchAdd 更新 dispatch id,用 CAS 做无锁同步
  3. 分布式 / RDMA 场景
    • NIC 对主机内存里的统计计数器做 FetchAdd
    • 多 writer 场景避免"读-改-写"被插空
  4. 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:

  1. NVMe 用 Host Memory Buffer (HMB) 放 FTL/元数据,并且多控制器/多函数共享
    • 多函数 SSD、SR-IOV NVMe
    • 多个 controller 更新同一块主机内存里的队列/引用计数/锁变量
    • 可以用 FetchAdd/CAS 避免来回加锁
  2. NVMe 支持 Shared Queue / 多 host 多 controller 架构
    • 多 port、multi-controller namespace
    • 设备内部多个核更新主机侧共享队列头尾
  3. NVMe 做 GPU/NIC 协同、计算存储、CXL/PCIe 共享内存编程
    • 比如"存储设备同时是加速器"
    • 要在主机内存里更新信号量、完成计数、task id
  4. 厂商私有扩展
    • 有些 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 混为一谈。
相关推荐
SZleoWang2 分钟前
费曼学习法的4个步骤:选概念、教别人、找缺口、再简化
学习
lengxuenong26 分钟前
树状数组 · 信息学学习手册2-离散化与逆序对
c++·学习·算法
minglie11 小时前
订阅莫名变少的奇怪现象
学习
zhangrelay1 小时前
手机长周期测评十周年终结版本-2026
笔记·学习·智能手机
boy快快长大1 小时前
【Jenkins】入门学习
运维·学习·jenkins
m4Rk_2 小时前
【论文阅读】Agent记忆机制(106):COUNTERMEM——用可执行世界模型验证“如果当时换个动作”的反事实记忆
论文阅读·人工智能·学习·开源·github
测试运维日常笔记3 小时前
SQL 快速学习笔记:1~2 小时掌握面试重点
笔记·sql·学习
fanged3 小时前
Audio学习4(DSP)(TODO)
学习
lengxuenong3 小时前
树状数组 · 信息学学习手册3-优化LIS
c++·学习·算法
果壳science3 小时前
关于光子、量子猜想
笔记·科技·学习·创业创新·学习方法