【发布时间】:2017-10-30 04:09:32
【问题描述】:
如您所知,从 2.0 版开始,PCI Express 支持复合原子操作:
FetchAdd、Swap、CAS:https://pcisig.com/sites/default/files/specification_documents/ECN_Atomic_Ops_080417.pdf还知道,x86_64 CPU 具有汇编程序复合原子操作:
lock add、[lock] xchg、lock cmpxchg:https://godbolt.org/g/MmqMRw
这可以通过使用volatile atomic_int-operations 的C 编译器生成:
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 );
我想通过使用复合原子操作访问通过 PCI Express 连接到 PC-x86_64 的设备上的缓冲内存(以太网、GPU...) >。 IE。我们已经知道硬件总线的工作原理(PCIe 支持原子 FetchAdd/Swap/CAS),但我们想知道需要哪些汇编源代码才能使用此 PCIe 功能。
我们能否使用 x86_64 CPU 复合原子操作:lock add、[lock] xchg、lock cmpxchg 在 PCI Express 上生成复合原子操作:FetchAdd、Swap、CAS?
或者我们应该在 x86_64 CPU 上使用什么 asm 代码在 PCI Express 2.0/3.0 上执行原子操作 FetchAdd、Swap、CAS?
【问题讨论】:
-
这更多是关于 x86/64 架构的硬件而非软件问题。
-
你在问 XY 问题。 CPU 命令与 BUS 的工作方式是正交的。
标签: multithreading driver linux-device-driver x86-64 pci-e