PCIe原子操作(Atomic Operation)

简介: PCIe原子操作(Atomic Operation)

1. PCIe原子操作介绍


原子操作(Atomic Operation, AtomicOp)是指不可被中断的一个或一系列操作,即该操作执行完毕前不会被任何其他事务或事件打断。PCIe进行原子操作时,发送单笔transaction即可完成 ① 读取目的地址原始值、② 修改原始值、③ 返回原始值这三步操作,且该三步不可被打断。原子操作有以下三种:


1. FetchAdd。该请求包含一个操作数,即需要累加的值A。该请求对应四步操作:读取目的地址原始值O -> 两数补码相加求和(O补+A补,忽略仅为与溢出) -> 把求得的和sum写入目的地址 -> 返回目的地址原始值O。


 2. Swap。该请求包含一个操作数,即需要交换的值S。该请求对应三步操作:读取目的地址原始值O -> 把值S写入目的地址 -> 返回目的地址原始值O。


 3. CAS(Compare and Swap)。该请求包含两个操作数,即需要比较的值C及需要交换的值S。该请求对应四步操作:读取目的地址原始值O -> C与O进行比较 -> 若O=C即把S写入目的地址 -> 返回目的地址原始值O。


 Atomic操作操作数位宽有32/64/128 bit三种,FetchAdd、Swap、CAS均支持32bits及64bits,目前(PCIe 5.0)仅CAS支持128bits操作数。Otomic操作的返回值位宽与操作数位宽相同。


 PCIe中原子操作能力是可选的,软件可以通过读取完成者PCIe设备能力2寄存器来获知完成者是否具备原子操作能力及原子操作路由能力,在发送原子操作请求之前也必须软件使能发送者PCIe设备控制2寄存器中的相关控制位。按照原子操作的请求者及完成者分类,PCIe原子操作可分为三类,分别为RC-to-EP, EP-to-RC, EP-to-EP。原子操作的发送者、完成者及原子操作包途径的所有交换节点均需具备原子操作的能力才能完成原子操作。


为了防止原子操作请求包被推送到不相关的路由节点,可以软件配置设备控制2寄存器的原子出口阻塞比特位,这样不相关路由节点在接收到原子操作请求后会把其当作畸形包处理。需要注意的是,PCIe到PCI/PCI-X桥之间是不支持原子操作的,此时可以采用目标锁定的方式发送locked transaction实现跟原子操作相同的功能。


 说到底,PCIe原子操作是一种存储器操作,所有存储器空间管理标准亦适用于PCIe原子操作。



a6f1fb60c19943d2b02ef66be01c9f56.jpg


PCIe Device Capabilities 2 Register


4c3ce151834b4f33a40f62e712e6b65a.jpg




2. PCIe原子操作优点及应用场景


 跟PCIe目标锁定请求相比,PCIe原子操作时延更低、可扩展性更强、对其他PCIe报文影响更小。尤其在对高级同步算法的良好支持方面,PCIe原子操作为高性能SMP应用到PCIe互联多处理器(紧耦合加速器、协处理器或通用图形处理器GPGPU等)系统的快速移植提供了可能。




3. PCIe原子操作报文协议相关总结


   PCIe原子操作是非转发内存读取事务(NP Mrd),支持32bit及64bit地址格式;

   原子操作的三种类型(FetchAdd, Swap, CAS)分别采用独立的类型码;


   完成者根据原子操作请求包中的length域及类型码来获知其需要返回的操作数位宽;


   若请求者支持自动地址转换(ATS),其发出的原子操作中的地址可以是转换后的地址;


   原子操作完成者收到原子操作请求包后,若其在访问目的地址或执行原子操作时出现不可纠正的错误,完成者需反馈CA;


   若原子操作完成者收到了其不支持的操作请求或操作数长度,按照UR进行处理;



4. 随时更新。。。


参考



  1. PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)


版本 描述 时间
v0.1 初稿,PCIe原子操作基本介绍 2021.09.02 ❤️🔥😄



目录
相关文章
PCIe锁定事务(Locked Transactions)介绍
PCIe锁定事务(Locked Transactions)介绍
762 0
PCIe锁定事务(Locked Transactions)介绍
|
7月前
|
安全 前端开发 Java
并发编程之原子操作Atomic&Unsafe
并发编程之原子操作Atomic&Unsafe
|
4月前
|
存储 安全 C++
C++ 原子变量atomic variable
原子变量是 C++11 引入的一种同步机制,用于多线程环境中的无锁、线程安全操作。其操作不可分割,避免了数据竞争和不一致问题。原子变量位于 `<atomic>` 头文件中,支持多种类型如 `std::atomic<T>` 和特化类型。基本用法包括定义原子变量、加载、存储、交换及比较交换操作。内存顺序(如 `std::memory_order_seq_cst`)用于控制内存访问顺序和可见性,适用于不同场景。原子变量常用于线程安全的计数器和标志位等。
|
5月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
46 0
|
8月前
|
负载均衡 调度 芯片
SMP多核启动(一):spin-table
SMP多核启动(一):spin-table
308 0
|
8月前
|
安全 Java vr&ar
Atomic原子类总结
Atomic原子类总结
|
存储 缓存 Java
高并发之volatile、synchronized关键和内存屏障(Memory Barrier)
高并发之volatile、synchronized关键和内存屏障(Memory Barrier)
394 0
高并发之volatile、synchronized关键和内存屏障(Memory Barrier)