我们可以使用x86_64 CPU atomics在PCI Express上生成复合原子操作吗?

问题描述:

  1. 如你所知,从2.0版本,PCI Express支持化合物的原子操作:FetchAddSwapCAShttps://pcisig.com/sites/default/files/specification_documents/ECN_Atomic_Ops_080417.pdf我们可以使用x86_64 CPU atomics在PCI Express上生成复合原子操作吗?

  2. 也称,该x86_64的CPU具有汇编化合物的原子操作:lock add[lock] xchglock cmpxchghttps://godbolt.org/g/MmqMRw

可以由C-编译器使用volatile atomic_int -operations制备:

int expceted_cas = 0; 
volatile atomic_int a; 

atomic_fetch_add(&a, 1); 
atomic_exchange(&a, 1); 
atomic_compare_exchange_weak(&a, &expceted_cas, 1); 

我使用化合物的原子操作要获得有关设备(以太网,GPU,...)通过PCI Express的使得连接到PC-x86_64的缓冲存储器,通过。即我们已经知道如何使用硬件总线(PCIe支持atomics FetchAdd/Swap/CAS),但我们想知道需要什么汇编源代码来使用这个PCIe功能。

我们可以使用x86_64的CPU化合物的原子操作:lock add[lock] xchglock cmpxchg产生对PCI Express的该化合物的原子操作:FetchAddSwapCAS

或者我们应该在x86_64 CPU上使用什么asm代码来执行原子操作FetchAdd,Swap,CAS关于PCI Express 2.0/3.0?

+0

这是比x86/64体系结构软件问题更多的硬件。 – Olaf

+1

你在问XY问题。 CPU命令与总线工作方式正交。 – 0andriy

为了什么我可以从互联网上收集,英特尔CPU在写[1][2][3]唯一支持的PCIe AtomicOps为完成者时间的最新一代。

的PCIe设备集成到非核心可以完成AtomicOp但不能要求之一,PCIe端口可以请求AtomicOp但是这可能只是转发设备发起的请求。

似乎PCI根复合体无法请求AtomicOps。
启用AtomicOps将需要在处理器和根复合体之间的紧密耦合:不仅处理器具有发送它正在执行的操作的类型 - 从而实现x86指令和PCIe AtomicOps之间的映射 - 也是其操作数。
此外,根联合体必须能够确定何时写启用的目标设备中所有可能的目的地中的AtomicOps - 因而需要一套软件配置的地址范围。
最后,AtomicOps需要由QPI静默控制特殊处理 - 因为目标设备已经照顾原子性,可避免全球QPI锁。
所有这些,当然,假设目标内存不可缓存(或缓存锁定会发生)。

我不认为这些是不可逾越的障碍,相反我相信AtomicOps的发明主要是为了缩短IO-> HostMem原子写入或IO-> IO写入的延迟。
Looking at what Intel wrote

今天,基于消息的事务用于PCIe设备,而这些使用可以体验长的等待,不像CPU的更新使用原子事务主内存中断。

似乎主要关心的是使用中断通知设备驱动程序必须代表其受管设备执行原子写入操作。

Host-> IO AtomicOps被允许,但看起来它们不能像今天那样生成, 肯定没有单独使用lock前缀。
我也相信,从处理器向设备发出AtomicOps只会对执行与其他PCIe设备相关的写入有用,因为处理器通常将自己与锁进行同步。