Bus schnüffeln - Bus snooping

Bus-Snooping oder Bus-Sniffing ist ein Schema, mit dem ein Kohärenz-Controller (Snooper) in einem Cache (ein Snoopy-Cache ) die Bustransaktionen überwacht oder snoopet. Ziel ist es, die Cache-Kohärenz in verteilten gemeinsam genutzten Speichersystemen aufrechtzuerhalten . Ein Cache, der einen Kohärenzcontroller (Snooper) enthält, wird als Snoopy-Cache bezeichnet. Dieses Schema wurde 1983 von Ravishankar und Goodman eingeführt.

Wie es funktioniert

Wenn bestimmte Daten von mehreren Caches gemeinsam genutzt werden und ein Prozessor den Wert der gemeinsam genutzten Daten ändert, muss die Änderung an alle anderen Caches weitergegeben werden, die über eine Kopie der Daten verfügen. Diese Änderungsausbreitung verhindert, dass das System die Cache-Kohärenz verletzt . Die Benachrichtigung über Datenänderungen kann durch Bus-Snooping erfolgen. Alle Snoopers überwachen jede Transaktion in einem Bus. Wenn eine Transaktion zum Ändern eines gemeinsam genutzten Cache-Blocks auf einem Bus angezeigt wird, prüfen alle Snoopers, ob ihre Caches dieselbe Kopie des gemeinsam genutzten Blocks haben. Wenn ein Cache eine Kopie des gemeinsam genutzten Blocks enthält, führt der entsprechende Snooper eine Aktion aus, um die Cache-Kohärenz sicherzustellen. Die Aktion kann ein Flush oder eine Ungültigmachung des Cache-Blocks sein. Es beinhaltet auch eine Änderung des Cache-Blockstatus in Abhängigkeit vom Cache-Kohärenzprotokoll.

Arten von Snooping-Protokollen

Abhängig von der Art und Weise, wie eine lokale Kopie eines Schreibvorgangs verwaltet wird, gibt es zwei Arten von Snooping-Protokollen:

Schreiben-ungültig machen

Wenn ein Prozessor in einen gemeinsam genutzten Cache-Block schreibt, werden alle gemeinsam genutzten Kopien in den anderen Caches durch Bus-Snooping ungültig . Diese Methode stellt sicher, dass nur eine Kopie eines Datums ausschließlich von einem Prozessor gelesen und geschrieben werden kann. Alle anderen Kopien in anderen Caches sind ungültig. Dies ist das am häufigsten verwendete Snooping-Protokoll. Zu dieser Kategorie gehören die Protokolle MSI , MESI , MOSI , MOESI und MESIF .

Schreib-Update

Wenn ein Prozessor in einen gemeinsam genutzten Cache-Block schreibt, werden alle gemeinsam genutzten Kopien der anderen Caches durch Bus-Snooping aktualisiert. Diese Methode sendet Schreibdaten an alle Caches in einem Bus. Es entsteht ein größerer Busverkehr als beim Schreib-Ungültigmachungs-Protokoll. Deshalb ist diese Methode ungewöhnlich. Drachen- und Glühwürmchenprotokolle gehören zu dieser Kategorie.

Implementierung

Eine der möglichen Implementierungen ist wie folgt:

Der Cache hätte drei zusätzliche Bits :

  • V  - gültig
  • D  - Dirty Bit bedeutet, dass die Daten im Cache nicht mit denen im Speicher identisch sind
  • S  - geteilt

Jede Cache-Zeile befindet sich in einem der folgenden Zustände: "schmutzig" (wurde vom lokalen Prozessor aktualisiert), "gültig", "ungültig" oder "gemeinsam genutzt". Eine Cache-Zeile enthält einen Wert und kann gelesen oder geschrieben werden. Das Schreiben in eine Cache-Zeile ändert den Wert. Jeder Wert befindet sich entweder im Hauptspeicher (auf den nur sehr langsam zugegriffen werden kann) oder in einem oder mehreren lokalen Caches (der schnell ist). Wenn ein Block zum ersten Mal in den Cache geladen wird, wird er als "gültig" markiert.

Bei einem Lesefehler in den lokalen Cache wird die Leseanforderung auf dem Bus gesendet. Alle Cache-Controller überwachen den Bus. Wenn diese Adresse zwischengespeichert wurde und sie sich im Status "schmutzig" befindet, ändert sie den Status in "gültig" und sendet die Kopie an den anfordernden Knoten. Der "gültige" Status bedeutet, dass die Cache-Zeile aktuell ist. Bei einem lokalen Schreibfehler (es wird versucht, diesen Wert zu schreiben, er befindet sich jedoch nicht im Cache) stellt das Bus-Snooping sicher, dass alle Kopien in anderen Caches auf "ungültig" gesetzt sind. "Ungültig" bedeutet, dass eine Kopie im Cache vorhanden war, aber nicht mehr aktuell ist.

Ein Anfangszustand könnte beispielsweise folgendermaßen aussehen:

Tag  | ID | V | D | S
---------------------
1111 | 00 | 1 | 0 | 0
0000 | 01 | 0 | 0 | 0
0000 | 10 | 1 | 0 | 1
0000 | 11 | 0 | 0 | 0

Nach einem Schreiben der Adresse 1111 00 würde sich dies in Folgendes ändern:

Tag  | ID | V | D | S
---------------------
1111 | 00 | 1 | 1 | 0
0000 | 01 | 0 | 0 | 0
0000 | 10 | 1 | 0 | 1
0000 | 11 | 0 | 0 | 0

Die Caching-Logik überwacht den Bus und erkennt, ob zwischengespeicherter Speicher angefordert wird. Wenn der Cache verschmutzt und gemeinsam genutzt wird und der Bus diesen Speicher anfordert, liefern die Snooping-Elemente den Wert aus dem Cache und benachrichtigen dann jede Einheit, die diesen Speicher benötigt, darüber, dass der Speicher aktualisiert wurde. Wenn die anderen Einheiten über den aktualisierten Cache benachrichtigt werden, deaktivieren sie das gültige Bit für ihren Cache dieser Variablen. Somit wird der ursprüngliche Cache als exklusiv markiert (S-Bit wäre Null).

Wenn eine als fehlerhaft markierte Adresse ungültig gemacht wird (dh ein Cache hätte eine fehlerhafte Adresse und der andere Cache schreibt), ignoriert der Cache diese Anforderung. Der neue Cache wird als fehlerhaft, gültig und exklusiv markiert und dieser Cache übernimmt nun die Verantwortung für die Adresse.

Vorteil

Der Vorteil der Verwendung von Bus-Snooping besteht darin, dass es schneller als ein verzeichnisbasierter Kohärenzmechanismus ist . Die gemeinsam genutzten Daten werden in einem gemeinsamen Verzeichnis abgelegt, das die Kohärenz zwischen den Caches in einem verzeichnisbasierten System aufrechterhält. Bus-Snooping ist normalerweise schneller, wenn genügend Bandbreite vorhanden ist , da alle Transaktionen eine Anforderung / Antwort sind, die von allen Prozessoren gesehen wird.

Nachteil

Der Nachteil des Bus-Snooping ist die eingeschränkte Skalierbarkeit . Häufiges Snooping in einem Cache führt zu einem Rennen mit einem Zugriff von einem Prozessor, wodurch die Cache-Zugriffszeit und der Stromverbrauch erhöht werden können. Jede der Anforderungen muss an alle Knoten in einem System gesendet werden. Dies bedeutet, dass die Größe des (physischen oder logischen) Busses und die von ihm bereitgestellte Bandbreite zunehmen müssen, wenn das System größer wird. Da das Bus-Snooping nicht gut skaliert werden kann, verwenden größere Cache-kohärente NUMA- Systeme (ccNUMA) tendenziell verzeichnisbasierte Kohärenzprotokolle .

Snoop Filter

Wenn eine Bustransaktion zu einem bestimmten Cache-Block erfolgt, müssen alle Snoopers die Bustransaktion abhören. Dann suchen die Snoopers nach dem entsprechenden Cache-Tag , um zu überprüfen, ob es denselben Cache-Block hat. In den meisten Fällen haben die Caches keinen Cache-Block, da ein gut optimiertes paralleles Programm nicht viele Daten zwischen Threads teilt. Daher ist die Suche nach Cache-Tags durch den Snooper normalerweise eine unnötige Arbeit für den Cache, der nicht über den Cache-Block verfügt. Die Tag-Suche stört jedoch den Cache-Zugriff eines Prozessors und verursacht zusätzlichen Stromverbrauch.

Eine Möglichkeit, das unnötige Schnüffeln zu reduzieren, ist die Verwendung eines Schnüffelfilters. Ein Snoop-Filter bestimmt, ob ein Snooper sein Cache-Tag überprüfen muss oder nicht. Ein Snoop-Filter ist eine verzeichnisbasierte Struktur und überwacht den gesamten kohärenten Verkehr, um die Kohärenzzustände von Cache-Blöcken zu verfolgen. Dies bedeutet, dass der Snoop-Filter die Caches kennt, die eine Kopie eines Cache-Blocks haben. Auf diese Weise kann verhindert werden, dass die Caches, die nicht über die Kopie eines Cache-Blocks verfügen, unnötiges Snooping durchführen. Abhängig von der Position der Snoop-Filter gibt es drei Arten von Filtern. Einer ist ein Quellfilter, der sich auf einer Cache-Seite befindet und eine Filterung durchführt, bevor der Kohärenzverkehr den gemeinsam genutzten Bus erreicht. Ein anderer ist ein Zielfilter, der sich in Empfänger-Caches befindet und unnötige Cache-Tag-Suchvorgänge im Empfängerkern verhindert. Diese Art der Filterung verhindert jedoch nicht die anfängliche Kohärenznachricht von der Quelle. Schließlich beschneiden netzwerkinterne Filter den Kohärenzverkehr innerhalb des gemeinsam genutzten Busses dynamisch. Der Snoop-Filter wird auch als inklusiv und exklusiv eingestuft. Der inklusive Snoop-Filter verfolgt das Vorhandensein von Cache-Blöcken in Caches. Der exklusive Snoop-Filter überwacht jedoch das Fehlen von Cache-Blöcken in Caches. Mit anderen Worten bedeutet ein Treffer im Inklusiv-Snoop-Filter, dass der entsprechende Cache-Block von Caches gehalten wird. Andererseits bedeutet ein Treffer im exklusiven Snoop-Filter, dass kein Cache den angeforderten Cache-Block hat.

Verweise

Externe Links