2017-05-29 4 views
2
  1. Wie Sie wissen, beginnend mit Version 2.0 unterstützt PCI Express Verbindung atomare Operationen: FetchAdd, Swap, CAS: https://pcisig.com/sites/default/files/specification_documents/ECN_Atomic_Ops_080417.pdfKönnen wir x86_64-CPU-Atomics verwenden, um auf PCI Express die zusammengesetzten atomaren Operationen zu erzeugen?

  2. auch bekannt, dass x86_64 CPU Assembler Verbindung atomare Operationen hat: lock add, [lock] xchg, lock cmpxchg : https://godbolt.org/g/MmqMRw

, die von C-Compiler verwendet volatile atomic_int -Operationen hergestellt werden können:

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); 

Ich mag Zugriff auf den Pufferspeicher auf dem Gerät (Ethernet, GPU, ...), die verbunden ist mit PCI Express PC-x86_64, durch unter Verwendung der Verbindung atomare Operationen. I.e. Wir wissen bereits, wie funktioniert Hardware-Bus (PCIe unterstützt Atomic FetchAdd/Swap/CAS), aber wir wollen wissen, welche Assembler-Quellcode erforderlich, um diese PCIe-Funktionen zu verwenden.

Können wir x86_64 CPU Verbindung atomare Operationen verwenden: lock add, [lock] xchg, lock cmpxchg die Verbindung atomare Operationen auf PCI Express zu generieren: FetchAdd, Swap, CAS?

Oder was für asm-Code sollten wir verwenden auf x86_64 CPU atomare Operationen FetchAdd, Swap, CAS auf PCI Express 2.0/3.0 auszuführen?

+0

Das ist eher eine Hardware- als Software-Frage über die x86/64-Architektur. – Olaf

+1

Sie fragen XY Frage. CPU-Befehle sind orthogonal zur Funktionsweise von BUS. – 0andriy

Antwort

1

Für das, was ich aus dem Internet sammeln kann, die neuesten Generationen von Intel-CPUs zum Zeitpunkt des Schreibens [1][2][3] nur PCIe AtomicOps als Beender unterstützen.

Die in den Uncore integrierten PCIe-Geräte können zwar AtomicOp ausführen, aber keine anfordern, die PCIe-Ports können eine AtomicOp anfordern, aber möglicherweise nur zum Weiterleiten von vom Gerät initiierten Anforderungen.

Es scheint, dass der PCI-Root-Komplex AtomicOps nicht anfordern kann.
Das Aktivieren von AtomicOps würde eine enge Kopplung zwischen dem Prozessor und dem Root-Komplex erfordern: Nicht nur der Prozessor muss die Art der ausgeführten Operation übertragen - wodurch eine Zuordnung zwischen x86-Anweisungen und PCIe AtomicOps implementiert wird - sondern auch seine Operanden.
Darüber hinaus muss der Root-Komplex in der Lage sein zu erkennen, wann ein Schreibvorgang ein AtomicOps-fähiges Gerät unter allen möglichen Zielen anvisiert - und somit eine Reihe von per Software konfigurierbaren Adressbereichen erfordert.
Schließlich müssen AtomicOps speziell vom QPI Quiesce Master gehandhabt werden - da das Zielgerät bereits für die Atomarität sorgt, kann eine globale QPI-Sperre vermieden werden.
All dies natürlich unter der Annahme, dass der Zielspeicher nicht cachefähig ist (oder stattdessen eine Cache-Sperre stattfinden würde).

Ich glaube nicht, dass dies unüberwindbare Hindernisse sind, vielmehr glaube ich, dass AtomicOps in erster Linie erfunden wurden, um die Latenz eines IO-> HostMem-atomaren Schreibens oder eines IO-> IO-Schreibens zu verkürzen.
Looking at what Intel wrote:

heute meldungsbasierte Transaktionen werden für PCIe-Geräte verwendet werden, und diese verwenden, Interrupts, die lange Latenzzeit, im Gegensatz zu CPU-Updates in dem Hauptspeicher, die verwenden atomare Transaktionen erleben kann.

es scheint, dass das Hauptanliegen ist die Verwendung eines Interrupts ist ein Gerätetreiber, der eine atomare Schreib benachrichtigen muss im Namen seiner verwalteten Gerät durchgeführt werden.

Host-> IO AtomicOps sind erlaubt, aber es scheint, dass sie nicht wie heute generiert werden können, sicherlich nicht mit einem lock Präfix allein.
Ich glaube auch, dass die Ausgabe eines AtomicOps zu einem Gerät vom Prozessor nur nützlich sein würde, um einen Schreibvorgang durchzuführen, der andere PCIe-Geräte atomar ist, da die Prozessoren normalerweise sich selbst mit Sperren synchronisieren.

Verwandte Themen