LOCK Präfix vs MESI-Protokoll?

8

Was ist der Zweck des x86 LOCK-Präfixes, wenn das MESI-Protokoll verhindert, dass andere Cores trotzdem in "exklusiv" -eigene Daten schreiben?

Ich bin ein wenig verwirrt zwischen dem, was LOCK bietet und was MESI bietet?

Ich verstehe, dass das MESI-Protokoll dafür sorgt, dass die Kerne einen konsistenten Speicherzustand sehen, aber wie ich es verstehe, verhindert es auch, dass Kerne in den Speicher schreiben, in den ein anderer Kern bereits schreibt.

    
user997112 26.04.2015, 16:05
quelle

2 Antworten

3

Das MESI-Protokoll macht die Speichercaches effektiv unsichtbar. Das bedeutet, dass Multithread-Programme sich keine Gedanken darüber machen müssen, ob sie die alten Daten lesen oder zwei Kerne in verschiedene Teile einer Cache-Zeile schreiben und die Hälfte der einen und die andere Hälfte zum Hauptspeicher schicken.

Dies hilft jedoch nicht bei Lese-Modifizier-Schreib-Operationen wie Inkrementieren, Vergleichen und Tauschen und so weiter. Das MESI-Protokoll verhindert nicht, dass zwei Kerne von jedem den gleichen Speicherblock lesen, jeder fügt einen hinzu und schreibt dann jeweils den gleichen Wert zurück, indem er zwei Inkremente in eins umwandelt.

Bei modernen CPUs sperrt das LOCK-Präfix die Cache-Zeile, so dass die Lese-Modifiziere-Schreib-Operation logisch atomar ist. Diese sind zu stark vereinfacht, aber hoffentlich werden sie Ihnen die Idee geben.

Entsperrtes Inkrement:

  1. Acquire cache line, shareable ist in Ordnung. Lesen Sie den Wert.
  2. Füge einen Wert zum gelesenen Wert hinzu.
  3. Erwerben Sie die Cache-Zeile exklusiv (wenn nicht bereits E oder M) und sperren Sie sie.
  4. Schreiben Sie den neuen Wert in die Cache-Zeile.
  5. Ändern Sie die Cache-Zeile, um sie zu ändern und zu entsperren.

Gesperrt:

  1. Erwerben Sie die Cache-Zeile exklusiv (wenn nicht bereits E oder M) und sperren Sie sie.
  2. Wert lesen.
  3. Fügen Sie einen hinzu.
  4. Schreiben Sie den neuen Wert in die Cache-Zeile.
  5. Ändern Sie die Cache-Zeile, um sie zu ändern und zu entsperren.

Beachten Sie den Unterschied? Im entsperrten Inkrement wird die Cache-Zeile wie alle Schreibvorgänge nur während der Schreibspeicheroperation gesperrt. In dem gesperrten Inkrement wird die Cache-Zeile über den gesamten Befehl gehalten, und zwar von der Leseoperation bis zur Schreiboperation und einschließlich während des Inkrements selbst.

Außerdem haben einige CPUs andere Dinge als Speichercaches, die die Speichersichtbarkeit beeinträchtigen können. Zum Beispiel haben einige CPUs einen Lese-Prefetcher oder einen Posted-Write-Puffer, die dazu führen können, dass Speicheroperationen außerhalb der Reihenfolge ausgeführt werden. Falls erforderlich, wird auch ein LOCK-Präfix (oder eine äquivalente Funktionalität auf anderen CPUs) alles tun, was zu tun ist, um Probleme bei der Reihenfolge der Speicheroperation zu beheben.

    
David Schwartz 08.01.2016 21:22
quelle
-1

Ja, du verwirrst zwei verschiedene Dinge. Das MESI-Protokoll ist ein Cache-Kohärenz-Protokoll, das sicherstellt, dass jeder Kern / Prozessor bei Anforderung die aktuellsten Daten aus dem Cache (oder Speicher) anderer Prozessoren erhält. Wenn eine Cacheline im "E" -Zustand ist, teilt dies dem anfordernden Prozessor mit, dass ein (und nur ein) anderer Prozessor eine Kopie dieser Zeile hat. Das ist alles, was es tut; Der Status 'E' verhindert auf keinen Fall, dass der anfordernde Prozessor auf die Daten zugreift ; es gibt nur die Tatsache an, dass nur ein Prozessor eine Kopie der Daten hat (und diese Kopie ist auch konsistent mit dieser im Speicher). Also, wenn ein Kern die Daten anfordert, die im 'E'-Zustand sind, erhält der Kern eine Kopie davon. Die andere Kopie, die in 'E' war, wird geändert, je nachdem, ob der Kern die Kopie zum 'Schreiben' oder 'Lesen' anfordert. Wenn es zum Schreiben angefordert wird, wird die alte Kopie ungültig ('I' Zustand) und wenn es zum Lesen ist, wird die alte Kopie in den freigegebenen 'S' Zustand versetzt.

    
waleed 08.01.2016 20:51
quelle

Tags und Links