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 混为一谈。
相关推荐
sunshine22 girl3 小时前
Java学习五 面向对象高级5 内部类1
java·学习
每天题库5 小时前
架子工脚手架工题库:安全操作考点与模拟题练习指南
学习·安全·考试·题库·考证
yangmu32035 小时前
Codex 提示词优化教程:用四要素把模糊需求变成可执行任务
人工智能·学习
无敌贵点大王6 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
喜欢打篮球的普通人8 小时前
MiniMind 学习笔记(十二):Pretrain 实操——从版本梳理到 8GB 显卡上的真实训练
人工智能·笔记·学习
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(87):VizoMem——把文本历史转化为可检索的视觉记忆
论文阅读·人工智能·学习·开源·github
坤坤子吖9 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
HY小宝F9 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 03 · 网络基础:建立“包“的思维 —— 学习总结
网络·学习
dadaobusi10 小时前
学习:AXI协议
学习