Warum wird eine Ladenladeschranke als teuer angesehen?

8

Die meisten CPU-Architekturen werden Speicheroperationen neu anordnen, aber meine Frage ist warum? Meine Interpretation einer Ladenladeschranke würde so aussehen:

%Vor%

Darüber hinaus sehe ich nicht, wie diese Barriere bei der Lock-Free-Programmierung im Vergleich zur Freigabe und zum Erwerb von Semantiken viel nutzen würde.

    
William 14.12.2014, 22:46
quelle

1 Antwort

12

Kurze Antwort : Die Ladenladeschranke verhindert, dass der Prozessor spekulativ LOAD ausführt, die nach einer Ladenladeschranke kommt, bis alle vorherigen Speichervorgänge abgeschlossen sind.

Details :

Der Grund dafür, dass eine Ladenladeschranke teuer ist, ist, dass sie das Neuordnen von LOAD- und STORE-Vorgängen über die Schranke hinweg verhindert.

Angenommen, Sie hatten eine Befehlsfolge wie die folgende:

%Vor%

Wenn diese Sequenz ausgeführt wird, ist der Wert von r1 das Ergebnis einer Operation, deren Ausführung sehr lange dauert. Der Befehl ST r1, [ADDR1] muss anhalten, bis r1 gelesen wird. In der Zwischenzeit kann ein Out-of-Order-Prozessor die LD r3, [ADDR2] und andere Anweisungen spekulativ ausführen, wenn sie unabhängig vom früheren Speicher sind. Sie werden nicht wirklich festgeschrieben, bis der Speicher festgeschrieben ist, aber indem der Großteil der Arbeit spekulativ ausgeführt wird, können die Ergebnisse im Neuordnungspuffer gespeichert und bereit sein, schneller zu committen.

Dies funktioniert für ein Einprozessorsystem, weil die CPU prüfen kann, ob Abhängigkeiten zwischen ADDR1 und ADDR2 bestehen. Aber in einem Multiprozessorsystem können mehrere CPUs Lasten und Speicher unabhängig ausführen. Es kann mehrere Prozessoren geben, die ein ST zu ADDR1 und ein LD von ADDR2 ausführen. Wenn die CPUs in der Lage sind, spekulativ diese Anweisungen auszuführen, die keine Abhängigkeiten zu haben scheinen, können unterschiedliche CPUs unterschiedliche Ergebnisse sehen. Ich denke, der folgenden Blogpost gibt eine gute Erklärung, wie dies passieren kann (I glaube nicht, dass es etwas ist, was ich in dieser Antwort kurz zusammenfassen könnte.)

Betrachten Sie nun die Codefolge, die eine Ladenladeschranke hat:

%Vor%

Dies würde verhindern, dass der LD r3, [ADDR2] Befehl und die folgenden abhängigen Befehle spekulativ ausgeführt werden, bis die vorherigen Speicheranweisungen abgeschlossen sind. Und dies könnte die CPU-Leistung reduzieren, da die gesamte CPU-Pipeline möglicherweise stehen bleiben muss, während auf den Abschluss des ST-Befehls gewartet wird, obwohl in der CPU selbst keine Abhängigkeit zwischen dem LD und dem ST besteht.

Es gibt einige Dinge, die getan werden können, um die Menge zu begrenzen, die die CPU zum Stillstand bringen muss. Aber die Quintessenz ist, dass die Ladenladeschranke zusätzliche Abhängigkeiten zwischen Ladungen und Speichern schafft, und dies begrenzt die Menge der spekulativen Ausführung, die die CPU ausführen kann.

    
Gabriel Southern 15.12.2014, 05:27
quelle