Can we use x86_64 CPU atomics to generate on PCI Express the compound atomic operations?

Viewed 2016
  1. As you know, starting with version 2.0, PCI Express supports compound atomic operations: FetchAdd, Swap, CAS: https://pcisig.com/sites/default/files/specification_documents/ECN_Atomic_Ops_080417.pdf

  2. Also known, that x86_64 CPU has assembler compound atomic operations: lock add, [lock] xchg, lock cmpxchg: https://godbolt.org/g/MmqMRw

That can be produced by C-compiler used 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 );

I want to access to the buffer memory on device (Ethernet, GPU, ...) that connected by PCI Express to PC-x86_64, by using compound atomic operations. I.e. we already know how works hardware bus (PCIe supports atomics FetchAdd/Swap/CAS), but we want to know what assembler source code required to use this PCIe features.

Can we use x86_64 CPU compound atomic operations: lock add, [lock] xchg, lock cmpxchg to generate on PCI Express the compound atomic operations: FetchAdd, Swap, CAS?

Or what asm-code should we use on x86_64 CPU to perform atomic operations FetchAdd, Swap, CAS on PCI Express 2.0/3.0?

1 Answers
Related