Frage

Ich lese Speicher Barrieren von Paul E. McKenney http://www.rdrop.com/users/paulmck /scalability/paper/whymb.2010.07.23a.pdf alles ist in großen Details erklärt und wenn ich sehe, dass alles klar ich Begegnung eines Satz, die stultifies alles und mache ich glaube, dass ich nichts verstanden. Lassen Sie mich das Beispiel

void foo(void)
{
   a = 1; #1
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   assert(a == 1); #4
}

Lassen Sie uns sagen, diese beiden Funktionen auf einem anderen Prozessoren ausgeführt werden. Nun vielleicht, was passieren könnte, ist, Speicher zu einem # 1 nach Speicher zu sehen war # 2 durch den zweiten Prozessor b, da der erste Prozessor Warteschlangen speichern, um „a“ und zu speichern b Anweisung fortzufahren. OK, das ist in Ordnung, fügen wir einen Schreib Zaun in der Leitung zwischen # 1 und # 2, aber dieser Code kann immer noch fehlschlagen, weil die zweite Prozessor könnte die Ungültigkeitsmitteilung Warteschlange, so dass wir einen weiteren Speicher Zaun (Lese Zaun diesmal) Addierten die Linie zwischen # 4 und # 4.

void foo(void)
{
   a = 1; #1
   write_memory_barrier();
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   read_memory_barrier();
   assert(a == 1); #4
}

Dieser zweiten Prozessor erzwingt alle Nachrichten in der Warteschlange (Invalidier a) zu verarbeiten und wieder durch das Senden Lese MESI Nachricht zum ersten Prozessor auf # 4 zu lesen. IN ORDNUNG. Als nächstes wird der Artikel sagt,

Viele CPU-Architekturen deshalb liefern schwächere Speicherbarrieren Anweisungen, die nur das eine oder das tun andere von diesen beiden. Grob gesagt, nur eine „Lese-Speicherbarriere“ markiert den Ungültigkeitswarteschlange und ein „Schreibspeicher Barriere“markiert nur die Speicherpuffer. während einer vollwertiger Speicherbarriere tut beides.

Große, das ist klar, aber nach, dass ich sehe, dies

Der Effekt davon ist, dass eine Lese Speichersperraufträge nur Lasten auf die CPU, die es ausführt, so dass alle lädt die Lesespeicher vorhergehenden Schranke abgeschlossen zu haben scheinen vor jeder Belastung im Anschluss an die Lese Speicherbarriere. In ähnlicher Weise ein Schreib Speichersperraufträge nur speichert, wieder auf der CPU, die es ausführt, und so wieder, dass alle speichert die vorhergehenden Schreibspeicher Barriere erscheint auf hat vor jedem Geschäft abgeschlossen im Anschluss an die Schreib-Speichersperre.

so

alle Lasten der Lesespeicherbarriere vorhergehenden wird scheinen vor jeder Belastung folgenden abgeschlossen haben die Lesespeicherbarriere

, dass die Mischungen bis alles, was zuvor erläutert wurde. Was bedeutet es? Welche Last in Funktion „bar“ müssen abgeschlossen sein, bevor Last von „a“ # 4? Ich verstehe die Assertion ohne Gedächtnis Barriere in dieser Funktion nur scheitern konnte, weil der Prozessor einen alten Wert lesen kann, weil es immer noch nicht gelungen ist es der Cache-Zeile ungültig zu machen, in dem Objekt „a“ befindet.

Erklärung in Einzelheiten wäre wirklich hilfreich, ich versuche es den ganzen Tag zu verstehen.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Was bedeutet das?

Es bedeutet, dass, wenn Sie:

read
read
read
READ BARRIER
read
read
read

wirkt dann die Lesesperre als „join Punkt“ Dividieren diese in zwei Chargen lesen. Alle liest vor dem Lesebarriere durchgeführt wurden, bevor jeder folgenden lesen die Lesebarriere begonnen wird.

Welche Belastungen in bar() vor der Belastung von a abschließen muss (# 4) begonnen wird?

Alle lesen von b (# 3) gezwungen sind, jede Lese von a vorangestellt (# 4). Dies bedeutet, dass a nicht gelesen, bis nach b nicht mehr 0. Da foo() eine Schreibsperre verwendet diese a, um sicherzustellen, hat bereits zu 1 (# 1) durch die Zeit geändert worden, dass b geändert wird (# 2). Die beiden Barrieren so zusammenarbeiten, die assert-Anweisung, um sicherzustellen, wird immer erfolgreich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top