-
Die vorliegende Erfindung bezieht
sich allgemein auf das Messen der Funktionsweise von Computersystemen
und, insbesondere, auf das Abtasten von Transaktionen, verwendet
dazu, auf Daten, gespeichert in Speichern von Computersystemen,
zuzugreifen.
-
Die Geschwindigkeit, unter der moderne Computersysteme
arbeiten, ist oftmals durch die Funktion deren Speicheruntersysteme,
wie beispielsweise Cache-Speicher und andere Level eines hierarchichen
Speicheruntersystems, enthaltend SRAM, DRAM, Platten und dergleichen,
eingeschränkt.
Cache-Speicher sind dazu vorgesehen, Daten zu speichern, die räumliche
und temporäre
Stellen teilen. Andere Speicher können Daten in irgendeiner Anzahl von
organisierten Arten, kurzzeitig oder für eine lange Dauer, speichern.
-
Um die Funktionsweise von Speichertransaktionen
zu analysieren und zu optimieren, sind bessere Messinstrumente erforderlich.
Derzeit sind nur ein paar wenige Instrumente vorhanden, die akkurat detaillierte
Informationen messen und erfassen können, die Speichertransaktionen
charakterisieren.
-
Existierende Hardware-Ereignis-Zähler können diskrete
Ereignisse, die zu spezifischen Speichertransaktionen in Bezug stehen,
wie beispielsweise Cache-Referenzen, oder Cache-Fehler, erfassen, allerdings
liefern bekannte Ereigniszähler
nur wenig Details, die ermöglichen
würden,
exakt die Ursachen von Ereignissen, die die Funktionsweise schwächen, zu
ermitteln, und wie solche Ereignisse vermieden werden könnten.
-
Zum Beispiel ist es derzeit extrem
schwierig, Informationen über
den Status eines Cache-Blocks, wie beispielsweise sauber (clean)
oder schmutzig (dirty), oder gemeinsam geteilt oder nicht gemeinsam geteilt,
zu erhalten, während
auf Daten zugegriffen wird. Es ist auch sehr schwierig zu bestimmen,
welche Speicheradressen tatsächlich
in dem Cache vorhanden sind, oder welche Speicheradressen für einen
bestimmten Cache-Block in Konflikt treten, da existierende Systeme
keine einfache Art und Weise vorsehen, um die virtuelle und physikalische
Adresse der Daten, auf die zugegriffen wird, zu erhalten.
-
In ähnlicher Weise ist es schwierig,
die Quelle einer bestimmten Speicherreferenz festzustellen, die
ein die Funktion schwächendes
Ereignis verursachte. Die Quelle könnte ein Befehl, ausgeführt in der
Prozessor-Pipeline, für
einen bestimmten Zusammenhang (z. B. Prozess, Thread, Hardware-Zusammenhang,
und/oder Adressenraumzahl), sein, sie könnte eine Speicheranforderung
sein, die extern zu der Prozessor-Pipeline vorliegt, wie beispielsweise
ein direkter Speicherzugriff (direct memory access – DMA),
der von verschiedenen Eingangs/Ausgangs-Vorrichtungen ausgeht, oder
sie könnte
eine Cache-Kohärenz-Nachricht
sein, die von anderen Prozessoren in einem Multiprozessor-Computersystem ausgeht.
Abtastzugriffe auf spezifische Bereiche von Speichern, wie beispielsweise
spezifische Blöcke
in Linien bzw. Zeilen eines Cache, physikalische Adressen in einem
Hauptspeicher, oder Seitenadressen in einem virtuellen Speicher,
sind noch schwieriger.
-
Es kann möglich sein, eine Simulation
oder ein Instrumentarium zu verwenden, um Speicheradressen für durch
einen Prozessor initiierte Zugriffe nachzuvollziehen, wie beispielsweise
solche aufgrund von Lade- und Speicherbefehlen. Allerdings stören Simulations-
und Instrumentierungstechniken gewöhnlich die wahre Operation
des Systems genug, um Messungen zu erhalten, die nicht optimal sind, insbesondere
für groß dimensionierte
Systeme mit realen Produkionsarbeitsbelastungen. Auch ändern, da
Instrumentierungstechniken Programme modifizieren oder ändern, sie
selbst Speicher- und Cache-Layouts,
was die Speicherfunktion des originalen Systems stört. Zum
Beispiel können
sich Befehl-Cache-Konflikte wesentlich zwischen instrumentierten
und nicht instrumentierten Versionen eines Programms unterscheiden.
-
Allerdings kann, wenn die Speicherzugriffe aufgrund
eines bestimmten Ereignisses erfolgen, wie beispielsweise einer
DMA-Transaktion oder einer Cache-Kohärenz-Transaktion in einem Multiprozessor,
ein Protokollieren auf zugegriffene Adressen gewöhnlich durch eine spezialisierte
Hardware vorgenommen werden, die spezifisch für diesen Teil des Speicher-Untersystems,
das überwacht
werden soll, ausgelegt ist.
-
Zusätzlich wäre es, um ein Betriebssystem und
eine Anwendungssoftware zu optimieren, nützlich, in der Lage zu sein,
andere Typen von Informationen über
Speichertransaktionen zu erhalten, wie beispielsweise den Umfang
eines Speichers, der durch unterschiedliche Ausführungs-Threads oder -Prozesse
verwendet wird, und den Umfang an Zeit, erforderlich dazu, bestimmte
Speichertransaktionen abzuschließen. Weiterhin wäre es noch
nützlicher, wenn
die Informationen dazu verwendet werden könnten, Befehlsabläufe und
Datenzuordnungen zu optimieren, vielleicht sogar dann, wenn das
System unter einer realen Arbeitsbelastung arbeitet.
-
Die EP-A-0465765 offenbart eine Vorrichtung
zum Abtasten von Zuständen
eines Computersystems, das einen hierarchischen Speicher besitzt, aufweisend
einen Selektor, einen Auslöser
und einen Abtasten.
-
Roth C et al: "Performance Monitoring on the PowerPCTM 604 Micropressor", International Conference on Computer
Design: VLSI in Comupters and Processors, New York, US, 2. Oktober
1995, Seiten 212–215,
offenbart eine Vorrichtung zum Abtasten von Zuständen eines Computersystems
mit einem hierarchischen Speicher, der in einer Vielzahl von Ebenen
organisiert ist, wobei der hierarchische Speicher Daten und Adressen
speichert, und wobei die Vorrichtung umfasst:
einen Selektor,
der auf Basis eines ersten Zustands und von Transaktionsinformationen
Speichertransaktionen auswählt,
wobei die Speichertransaktionen durch den hierarchischen Speicher
abzuarbeiten sind;
einen Auslöser; und
einen Abtaster,
der Zustände
des Computersystems speichert, die mit den ausgewählten Transaktionen identifiziert
werden, während
die ausgewählten
Speichertransaktionen in dem hierarchischen Speicher abgearbeitet
werden,
wobei der Selektor ein Modus-Register sowie ein Überwachungs-Register
enthält,
und das Modus-Register einen Transaktionsmodus speichert, gemäß dem Speichertransaktionen
ausgewählt
werden, und das Überwachungsregister
den ersten Zustand speichert, gemäß dem Speichertransaktionen
ausgewählt
werden; und
der Auslöser
den Selektor basierend auf Basis eines zweiten Zustands und/oder
von Transaktionsinformationen aktiviert.
-
Gemäß der vorliegenden Erfindung
ist eine solche Vorrichtung dadurch gekennzeichnet, dass die Auswählfunktion
bestimmt, ob eine spezielle Speichertransaktion von Interesse ist,
um abgetastet zu werden.
-
In den beigefügten Zeichnungen:
-
1 zeigt
ein Blockdiagramm eines Computersystems mit einer Abtastung von
Speichertransaktionen gemäß der Erfindung;
-
2 zeigt
ein Blockdiagramm einer Abtast-Hardware zum Überwachen einer Speicherfunktion
gemäß einer
bevorzugten Ausführungsform;
-
3 zeigt
ein Blockdiagramm eines Abtastpuffers, um Abtastinformationen zu
speichern;
-
4 zeigt
ein Flussdiagramm eines Verfahrens zum Abschätzen von Teilungs- und Konfliktstatistiken über Speichersystem-Interaktionen
zwischen Computersystemzusammenhängen;
-
5 zeigt
ein Flussdiagramm eines Verfahrens zum Abschätzen von Statistiken über Eigenschaften
von Speichersystem-Transaktionen;
-
6 zeigt
ein Flussdiagramm eines Verfahrens zum Verwenden von Statistiken über ein
Speichersystemverhalten, um Daten-Replizierungs- und Migrationsentscheidungen
vorzunehmen; und
-
7 zeigt
ein Flussdiagramm eines Verfahrens zum Verwenden von Statistiken über Speichersystem-Interaktionen,
um Zusammenhang-Planungs-Entscheidungen vorzunehmen.
-
Es sollte angemerkt werden, dass
die vorliegende Erfindung zu den 1 bis 3 und deren entsprechender
Beschreibung in Bezug steht. Die verbleibenden Figuren und die Beschreibung
sind beigefügt,
um beim Verständnis
der vorliegenden Erfindung und bei einem Vergleich zu unterstützen.
-
Systemübersichten
-
1 stellt
ein Computersystem 100 dar, das die Speichertransaktions-Abtasttechniken,
die hier beschrieben sind, verwenden kann. Das System 100 umfasst
einen oder mehrere Prozessoren) 110, Speicher 120,
und Eingabe/Ausgabe-Schnittstellen (I/O) 130,
verbunden durch Busleitungen 140.
-
Jeder Prozessor 110 kann
auf einem integrierten Halbleiterchip ausgeführt sein, umfassend eine Prozessor-Pipeline 111,
einen Daten-Cache- (D-Cache) 113 und einen Befehl-Cache
(I-Cache) 112, zum Beispiel der Digital Equipment Corporation Alpha
21264 Prozessor. Die Pipeline 111 kann eine Mehrzahl von
seriell angeordneten Stufen zum Verarbeiten von Befehlen umfassen,
wie beispielsweise eine Abruf-Einheit, eine Listen-Einheit, eine Ausgabeeinheit,
eine oder mehrere Ausführungseinheiten) und
eine Retire-Einheit.
Der Prozessor-Chip umfasst auch eine Hardware 119, die
in größerem Detail nachfolgend
zum Abtasten von Cache-Zustand-Informationen, während auf Daten, gespeichert
an Adressen in verschiedenen Speichern, zugegriffen wird, beschrieben
ist.
-
Die Speicher 120 können hierarchisch
angeordnet sein, einschließlich
eines Board-Ebenen-Cache
(B-Cache) 121, flüchtiger
Speicher (DRAM) 122 und persistenter Speicher (Platte) 123.
Die I/O 130 kann dazu verwendet werden, Daten zu dem System 100 unter
Verwendung von I/O Vorrichtungen, wie beispielsweise Speicherkanälen, zu
anderen Prozessoren, Tastenfeldern, Monitoren und Netzwerk-Steuereinheiten
zu anderen Computersystemen einzugeben und davon auszugeben.
-
Speicher-Transaktion
-
Allgemein ist eine Speicher-Transaktion
hier als irgendeine Operation definiert, die bewirkt, dass sich
Daten von einer Stelle zu einer anderen bewegen, zum Beispiel Laden
und Speichern, Direkt-Speicherzugriff-(DMA)-Operationen, und Kohärenz-Transaktionen
in dem Fall, wo mehrere Prozessoren oder Ausführungs-Threads auf Daten gleichzeitig
zugreifen.
-
Betriebsweise
-
Während
des Betriebs des Systems 100 werden Befehle und Daten von
Software-Programmen
in den Speichern 120 gespeichert. Die Befehle werden herkömmlich unter
Verwendung von bekannten Compiler-, Linker- und Loader-Techniken
erzeugt. Die Befehle werden in die Pipeline 111 eines der
Prozessoren 110 hinein über
den I-Cache 112 und die Daten über den D-Cache 113 überführt. In
der Pipeline 111 werden die Befehle für eine Ausführung decodiert.
-
Auf den Befehl-Cache (I-Cache) 112 wird durch
die Pipeline zugegriffen, um Befehle abzurufen, die durch die Prozessor-Pipeline 111 ausgeführt werden.
Einige der Befehle, zum Beispiel Lade- und Speicherbefehle, greifen
auf Daten (R/W), gespeichert in den Speichern, über den D-Cache 113 zu. Andere
Befehle, wie beispielsweise Verzweigungs- und Sprungbefehle, steuern
den Ausführungsablauf der
Programme. Daten können
auch über
einen Direktspeicherzugriff (DMA) und Cache-Kohärenz-Operationen übertragen
werden. Es ist erwünscht,
detaillierte Funktionsinformationen zu sammeln, während auf
Daten in irgendeinem der Speicher zugegriffen wird.
-
Speicher-Transaktions-Abtastung
-
2 stellt
eine Anordnung zum Abtasten von Speichertransaktionen dar. Ein Cache 200 umfasst
eine Mehrzahl von Zeilen 202. Der Cache kann direkt aufgelistet
sein oder kann assoziativ eingestellt sein. Jede Zeile besteht aus
einem Block oder mehreren Blöcken 201.
Zeilen in einem direkt aufgelisteten Cache werden nur einen einzelnen
Block enthalten, während
Zeilen in einem N-Weg-Einstell-Assoziativ-Cache N Blöcke enthalten
werden.
-
Zum Beispiel wird, in einem assoziativ
eingestellten Vier-Wege-Cache, eine Zeile Daten von vier unterschiedlichen
Speicheradressen speichern, die eine bestimmte Anzahl von Adressen-Bits
niedriger Ordnung gemeinsam haben. Während eines Zugriffs, nachdem
auf die Zeile durch den Cache-Zeilen-Index Bezug genommen worden
ist, muss jeder Block geprüft
werden, um zu bestimmen, ob die Zeile die erforderlichen Daten speichert.
Dies wird mit einem Tag bzw. Zeichen 210 vorgenommen. Die
exakten Details darüber,
wie die Blöcke
geprüft
werden, hängen
von der Ausführung
des assoziativ eingestellten Cache ab. Auch sind, zugeordnet zu
jedem Block, Daten 220, und Status-Informationen 230,
vorhanden. Eine unterschiedliche, physikalische Hardware kann zum Speichern
der Zeichen, der Daten und des Status verwendet werden.
-
Die Anordnung, dargestellt in 2, umfasst auch einen Übersetzungs-Vorgriffspuffer (Translation-Lookaside
Buffer – TLB) 240,
eine Trigger- bzw. Auslöser-Funktion 250,
einen Zähler 265,
eine Auswahl-Funktion 260, Abtastpuffer 301–303 und
eine Abtast-Software 260.
-
Während
eines Betriebs des Systems wird der Transaktions-Eingang 241 dem Übersetzungs-Vorgriffspuffer
(TLB) 240 auf der Leitung 241 präsentiert.
Der Transaktions-Eingang
kann eine virtuelle Adresse (VA), einen Zusammenhang-Identifizierer,
wie beispielsweise eine Adressen-Raum-Zahl (Address Space Number – ASN),
und in dem Fall eines Multi-Treaded Prozessor-Designs, einen Hardware-Zusammenhang-Identifizieren
(Hardware Context Identifier – HCI)
umfassen. Der Eingang kann auch den Typ der Zugriffs-Operation,
die durchgeführt
werden soll (R/W/DMA), umfassen.
-
Der TLB 240 übersetzt
die virtuelle Adresse zu einer physikalischen Adresse. Ein Bereich
der Adresse (die physikalische Adresse für einen physikalisch-indexierten
Cache, oder die virtuelle Adresse für einen virtuell-indexierten
Cache), die typischerweise auf einer bestimmten Anzahl von Bits
niedriger Ordnung (z. B. 8–16)
bestehen, werden dazu verwendet, einen Index in den Cache 200 hinein
auch in der Leitung 242' zu
bilden. Der Index wählt
eine bestimmte Cache-Zeile 202 aus.
-
Eine Durchsichts-Operation wird dann
in Bezug auf jeden der Blöcke 201 innerhalb
der ausgewählten
Cache-Zeile 202 durchgeführt, um zu bestimmen, ob die
geeigneten Daten in den Blöcken
der Zeile vorhanden sind. In Abhängigkeit
von der Zugriffs-Operation
können
Daten jeweils auf Leitungen 251 und 252 gelesen
oder geschrieben werden.
-
Falls die geeigneten Daten nicht
an irgendeinem der Blöcke
innerhalb der Zeile vorgefunden werden, dann werden andere Daten
von dem Cache herausgeräumt,
um Platz für
die neuen Daten zu schaffen. Falls die herausgeräumten Daten "schmutzig" (dirty) sind, d.
h. die Version der Daten, gespeichert in dem Cache, ist modifiziert,
und die Kopien der schmutzigen Daten, gespeichert in umgebenden Ebenen
der Speicher-Hierarchie,
nicht konsistent sind, können
die herausgeworfenen Daten benötigt werden,
um sie zurück
zu geeigneten Adressen in den umgebenden Ebenen bzw. Level der Speicher-Hierarchie
hineinzuschreiben, um eine Konsistenz beizubehalten.
-
Das Ziel ist dasjenige, Speicher-System-Transaktionen
abzutasten, um Klarheit über
das Verhalten des Speicher-Systems und von Programmen, die auf dem
Computersystem ausgeführt
werden, zu erhalten. Jede Speicher-Transaktion wird begutachtet,
wenn sie in das Speicher-System eintritt, um zu bestimmen, ob diese
bestimmte Transaktion für
eine Abtastung ausgewählt
werden sollte. Zwei Funktionen steuern, welche Transaktionen abzutasten
sind: die Auslöser-Funktion 250;
und die Auswahl-Funktion 260.
-
Die Auslöser-Funktion 250 bestimmt,
wenn die Auswahl-Funktion 260 aktiviert werden sollte, während die
Auswahl-Funktion 260 bestimmt, welche Speicher-Transaktionen
abgetastet werden sollte, wenn einmal die Auslöser-Funktion die Auswahl-Funktion
aktiviert hat. In dem allgemeinsten Fall kann jede dieser Funktionen
als eine Funktion irgendeines Speicher-Systems oder eines Speicher-Transaktions-Zustands
arbeiten.
-
Auswahl-Funktion
-
Die Auswahl-Funktion 260 wird über eine Freigabe-Leitung 266 freigegeben,
die die Auswahl-Funktion einschaltet, wenn der Zähler 265 einen spezifizierten
Wert erreicht. Das Beibehalten des Werts wird nachfolgend beschrieben.
Die Auswahl-Funktion gilt als Eingangs-Funktion über die Transaktion auf der
Leitung 242'', ebenso wie
als Status-Information über die
Transaktion auf der Leitung 267. Der Auftrag der Auswahl-Funktion
ist derjenige, zu entscheiden, ob die Transaktion von Interesse
ist, und, falls dies der Fall ist, die Information über die
Transaktion zu dem Abtast-Puffer 300 über die Leitung 299 zuzuführen.
-
In dem allgemeinen Fall speichert
ein Monitor-Register (Monitor Register – MON) 263 innerhalb der
Auswahl-Funktions-Logik den Zustand, verwendet dazu, gegenüber Speicher-System-Transaktion anzupassen.
In dem bestimmten Fall des Überwachens
von Zugriffen auf einen spezifischen Cache-Block kann das Monitor-Register 263 die
Zahlen von einem oder mehreren Block (Blöcken), der (die) überwacht
werden soll (sollen), speichern. Die Monitor-Register-Inhalte (wie
beispielsweise Block-Zahlen) können
in das Register durch eine Hardware oder eine Software über die
Leitung 261 eingeladen werden. Adressen anderer Bereiche
des Speichers können
in dem Monitor-Register gespeichert werden.
-
Eine Art und Weise, in der die Auswahl-Funktion 260 ausgeführt werden
kann, ist diejenige, durch Vordefinieren eines Satzes von unterschiedlichen
Auswahl-Funktionen und Einsetzen eines Modus-Registers 264 innerhalb
der Auswahl-Funktion. Das Modus-Register 264 kann
mit einem Modus-Wert über
die Leitung 262 geladen werden, um die bestimmte, vordefinierte
Auswahl-Funktion, um sie während
einer Abtastung zu verwenden, zu steuern. Die verschiedenen Auswahl-Funktions-Moden
können
Funktionen umfassen, die Transaktionen auswählen, die:
-
– auf
eine bestimmte Ebene in der Speicher-Hierarchie Bezug nehmen;
-
– auf
einen bestimmten Bereich eines Speichers innerhalb einer bestimmten
Ebene der Speicher-Hierarchie Bezug nehmen. Der bestimmte Bereich
kann einen Cache-Block
oder mehrere Cache-Blöcke
innerhalb einer Cache-Zeile oder mehrerer Cache-Zeilen, eine oder
mehr Cache-Zeilen, oder einem oder mehrerer fortführender
Bereiche) eines Hauptspeichers, adressiert durch irgendeine virtuelle oder
physikalische Adresse, umfassen;
- – einen
bestimmten Typ haben, z. B. Lesen, Schreiben oder für ungültig erklären
- – in
einen bestimmten Cache-Speicher passen;
- – in
einem bestimmten Cache-Speicher fehlen;
- – eine
bestimmte Cache-Protokoll-Zustand-Transaktion verursachen, z. B. "schmutzige" Hinauswürfe;
- – von
einer bestimmten Quelle ausgehen, z. B. einer Befehl-Ausführung in
der Prozessor-Pipeline, einer Befehl-Ausführung von einem bestimmten Zusammenhang, Prozess,
Thread, oder Adressen-Raum, einem direkten Speicher-Zugriff von einer
Eingangs/Ausgangs-Vorrichtung, oder Cache-Kohärenz-Nachrichten in einem Multiprozessor-Computersystem.
-
Auswahl-Funktionen können zusätzlich unter Verwendung
von Bool'schen Kombinationen
(AND, OR und NOT) von diesen Auswahl-Kriterien zusammengesetzt werden.
Alternativ kann die Auswahl-Funktion ohne eine programmierbare Logik,
gesteuert durch Software, um eine zusätzliche Flexibilität zu erzielen,
ausgeführt
werden.
-
Nachdem die Auswahl-Funktion eine
Speicher-Transaktion dahingehend identifiziert hat, dass sie abgetastet
werden soll, werden die Zustand-Informationen erfasst und in einem
der Abtastpuffer 300–302 aufgezeichnet.
Die Zustand-Informationen werden zusammengestellt, wenn die ausgewählte Transaktion
durch die verschiedenen Ebenen der Speicher-Hierarchie abgearbeitet
werden.
-
Verschiedene Ausführungstechniken sind möglich. Zum
Beispiel kann ein "ausgewähltes Transaktions"- Feld (wie beispielsweise
ein einzelnes Bit) jeder Speicher-Transaktion zugeordnet werden. Das Feld
bewirkt, dass logische Schaltungen in dem Speicher-System Informationen
an geeigneten Punkten während
der Verarbeitung der ausgewählten Transaktionen
aufzeichnen, wenn das Bit eingestellt ist. Eine alternative Ausführung verwendet
Komparator-Register an geeigneten Punkten in der Speicher-Systemhierarchie,
um identifizierende Informationen von jeder Speicher-Transaktion
mit den identifizierenden Informationen einer ausgewählten Transaktion
zu vergleichen, und falls sie zueinander passen, um relevante Zustand-Informationen
aufzuzeichnen.
-
Betriebsmoden
-
Es wird die Ausführung der Auswahl-Funktion
unter Verwendung von Komparator-Registern,
um ausgewählte
Transaktionen an jeder Ebene der Speicher-Hierarchie auszuwählen, betrachtet.
Unter Beschränkung
der Aufmerksamkeit auf eine einzelne Ebene der Speicher-Hierarchie,
bestehend aus einem einzelnen Cache-Speicher, kann die Auswahl-Funktion
einen bestimmten Bereich des Cache spezifizieren, um zu überwachen,
wie beispielsweise einen Satz von Cache-Blöcken. Falls der Indexbereich
der Transaktions-Informationen,
ausgeführt
auf der Leitung 242, identisch zu einem der Block-Indizes,
gespeichert in dem Monitor-Register in der Auswahl-Funktion 260,
ist, dann werden die Informationen über den Zustand des indexierten
Cache-Blocks erfasst und in einem der Abtastpuffer aufgezeichnet, wie
dies im Detail nachfolgend beschrieben ist.
-
Eine bestimmte Zustand-Information
kann erfasst werden, bevor diese Transaktion durch das Speicher-System
abgearbeitet ist, und zusätzliche Zustand-Informationen
können
erfasst werden, nachdem die Transaktion abgeschlossen ist. Nachdem eine
spezifizierte Anzahl von Transaktionen aufgezeichnet worden ist,
zum Beispiel wenn irgendeiner der Abtastpuffer 300–302 voll
ist, kann ein Lesesignal auf der Leitung 271 erzeugt werden.
Das Lesesignal 271 kann in der Form einer Unterbrechung,
eines über
eine Software abrufbaren Werts, eingestellt in einem Register, oder
eines Ausnahme-Zustands vorliegen.
-
Auf das Lesesignal hin kann die Abtast-Software 280 die
Zustand-Informationen, gespeichert in dem Abtastpuffer, für eine weitere
Verarbeitung über die
Leitung 272 lesen. Es sollte angemerkt werden, dass mehrere
Puffer 300–302 verwendet
werden können,
um mehrere Abtastungen zusammenzustellen. Eine Erhöhung der
Zahl von Puffern kann die Kosten eines Abtast-Overheads, durch Übertragen mehr
als eine Abtastung pro Lesesignal, amortisieren.
-
Auslöser-Funktion
-
Der beladbare Zähler 265 wird mit
Countdown-Werten auf der Leitung 268 initialisiert. Der Zähler 265 wird
unter Verwendung von Auslöser-Ereignissen
auf der Leitung 254 dekrementiert. Auslöser-Ereignisse können Block-Zyklen
auf der Leitung 251 oder Transaktionen auf der Leitung 252 sein. Welches
Auslöser-Ereignis
zu verwenden ist, kann auf der Leitung 253 ausgewählt werden.
-
Ob ein Auslöser-Ereignis auf der Leitung 254 den
Zähler 275 erniedrigt
bzw. dekrementiert oder nicht, wird durch die Auslöser-Funktion 250 gesteuert.
Die Auslöser-Funktion kann irgendeine
wahlweise Funktion des Zustands einer Speicher-Transaktion sein,
die über
Informationen, die über
Leitungen 242''' und 267 ankommen, bestimmt
werden können. Die
Funktion 250 kann mit zwei internen, beladbaren Registern
ausgeführt
werden, wie dies vorstehend für
die Auswahl-Funktion beschrieben ist.
-
Einige spezifische Beispiele nützlicher
Auslöser-Funktionen
umfassen solche, die anpassen:
- – irgendeine
Speicher-Transaktion;
- – Speicher-Transaktionen,
die auf eine bestimmte Ebene der Speicher-Hierarchie Bezug nehmen,
z. B. ein bestimmter Cache;
- – Speicher-Transaktionen,
die eine bestimmte Ebene der Speicher-Hierarchie treffen, z. B.
einen bestimmten Cache;
- – Speicher-Transaktionen
die in irgendeiner bestimmten Ebene der Speicher-Hierarchie fehlschlagen;
- – Speicher-Transaktionen,
die bestimmte Cache-Protokoll-Zustand-Übergänge erfahren, z. B. schmutzige
Aussonderungen;
- – Speicher-Transaktionen,
die auf einen bestimmten Bereich eines Speichers zugreifen, z. B.
einen Bereich von Adressen, eine bestimmte Cache-Zeile, ein bestimmter
Cache-Block innerhalb einer bestimmten Cache-Zeile, ein bestimmter Bereich
des Cache, usw.;
- – Speicher-Transaktionen
von einer bestimmten Quelle, z. B. von der Prozessor-Pipeline, von einer
bestimmten, direkten Speicherzugriff-(Direct Memory Access – DMA)-Vorrichtung,
ein Kohärenzverkehr
von einem anderen Prozessor, usw.; und
- – Speicher-Transaktionen
eines bestimmten Typs, wie beispielsweise Lesetransaktionen, Schreib-Transaktionen
oder ungültige
Transaktionen.
-
Die Verwendung der Auslöser-Funktion 250 ermöglicht der
abtastenden Hardware, eine spezifische Zahl von Transaktionen vor
Anwenden der Auswahl-Funktion auf die Datenfolge von Speicherreferenzen
zu überspringen
bzw. auszulassen. In einem anspruchsvollen Beispiel würde dies
ermöglichen, drei
Zugriffe auf einen bestimmten Block zu zählen und dann Speicher-Transaktions-Abtastungen
für die nächsten zwei
Ausfälle
zu diesem Block zu sammeln. In einem anderen, nützlichen Beispiel kann man
eine Auswahl nach einem Zugriff auf einen bestimmten Cache-Block
durch einen bestimmten Zusammenhang triggern (wie beispielsweise
ein Prozess oder ein Thread) und kann dann Abtastungen für eine spezifizierte
Zahl von aufeinanderfolgenden Transaktionen zu demselben Block durch
eine unterschiedliche Hardware, einen Prozess oder Thread-Zusammenhänge sammeln.
-
Deshalb sind dabei zwei Schritte
einer Abtastung vorhanden:
- 1) Bestimmen einer
passenden Transaktion und dann
- 2) Entscheiden, abtastende Daten beizubehalten oder auszusondern,
die sich auf die passende Transaktion beziehen, so dass die Abtastung
sowohl in räumlichen
als auch temporären
Dimensionen stattfinden kann.
-
Das Countdown-Register 265 kann über die Leitung 268 zurückgesetzt
werden. Für
eine zufällige Abtastung
kann der Anfangswert, geschrieben in das Countdown-Register hinein,
zufällig
von einem Intervall von Zahlen ausgewählt werden, und die Zufalls-Zahl (random
number) kann entweder über
eine Software oder über
eine Hardware-Schaltung, geeignet zum Erzeugen von Zufallszahlen,
berechnet werden. Es sollte angemerkt werden, dass das Register 265 auch
aufwärts
zählen
kann.
-
Abtastpuffer
-
3 stellt
die Details dar, wie man die Puffer 300–302 zuordnen kann.
Der Puffer kann als ein Satz von mittels Software lesbaren Registern,
oder andern Typen von Speichern, ausgeführt werden. Der Puffer umfasst
ein Status-Feld 310, ein Adressen-Feld 320, ein
Kontext-Feld 330, ein Zugriffs-Quellen-Feld 340,
ein Befehl-Feld 350, ein Latenz-Feld 360 und Felder 370 für andere
Zustände.
-
Das Status-Feld 310 kann
Block-Status-Informationen und Cache-Zustand-Protokoll-Informationen darüber umfassen,
ob der Block "schmutzig" oder "sauber" ist (modifiziert
oder nicht), gemeinsam geteilt ist (ein oder mehrere Ausführungs-Threads können auf
die Daten zugreifen), exklusiv (nicht gemeinsam geteilt) ist, gültig oder
ungültig
ist (die Daten sind legitimiert) und ein Cache-Treffer oder ein Fehl-Status
(miss status) ist. Es kann auch Informationen enthalten, wie beispielsweise
die bestimmte Zeilen-Index-Zahl
und die Blockzahl, die der Transaktion in einem Cache-Speicher zugeordnet
sind. Falls mehrere Ebenen in der Speicher-Hierarchie vorhanden
sind, dann können
dort mehrere Kopien des Felds 310 vorhanden sein, wobei
jedes Feld Status-Informationen über
die Transaktion für
eine bestimmte Ebene der Speicher-Hierarchie speichert.
-
Das Adressen-Feld 320 kann
die virtuellen und/oder physikalischen Adressen der Daten, auf die durch
die Transaktion, die abgetastet wird, zugegriffen ist, speichern.
-
Ein Punkt der Hardware-Umsetzung
kann die Zahl von Drähten
sein, die erforderlich ist, um die physikalischen und virtuellen
Adressen zu dem Puffer 300 zu führen, zum Beispiel ungefähr 47 Drähte, oder
dergleichen, für
die virtuelle Adresse, plus 40, oder dergleichen, Drähte für die physikalische
Adresse. In Computersystemen, die mittels einer Unterstützungs-Software
verwaltete TLBs unterstützen,
kann die Anzahl von Drähten
durch einfaches Speichern des Index des TLB-Eintritts, der die virtuell-zu-physikalische
Translation in dem Adressen-Feld 320 durchführt, zusammen
mit dem Offset in die betreffende Seite hinein, reduziert werden.
Dann kann die Software 280 den Eintritt von dem spezifizierten TLB-Eintritt
lesen, um sowohl die virtuelle als auch die physikalische Adresse
zu bestimmen.
-
Es ist anzumerken, dass sich diese
Technik auf zwei Eigenschaften bezieht.
-
Die erste Eigenschaft erfordert,
dass der TLB-Eintritt, der von Interesse ist, nicht zwischen der Zeit,
zu der die Informationen aufgezeichnet wurden, und der Zeit, zu
der die Software den TLB-Eintritt liest, ersetzt worden ist. In
Fällen,
wo die TLB eine bestimmte Annäherung
der am kürzesten
vorher verwendeten (LRU) Ersetzungspolice ausführt, wie dies der allgemeine
Fall sein wird, wird dies kein Problem sein, da der Eintritt, der
in Rede steht, kürzlich
aufgrund davon verwendet worden ist, dass er in einem kürzlichen
Cache-Zugriff eingesetzt
worden ist.
-
Die zweite Eigenschaft erfordert,
dass die Software den TLB-Eintritt lesen kann. In Fällen, wo ein
direktes Lesen der TLB nicht möglich
ist, kann die Software eine Schattenkopie der Inhalte der TLB beibehalten.
-
Das Kontext-Feld 330 kann
die Adressen-Raum-Zahl (Address Space Number – ASN), den Hardware-Kontext-Identifizieren
(Hardware Context Identifier – HCI)
in dem Fall eines Multi-Threaded-Prozessors, einen Prozess-Identifizieren
(Process Identifier- PID) und/oder einen Thread-Identifizierer (Thread
Identifier – TID)
der Quelle der Speicher-Transaktion
speichern, wenn die Quelle eine Befehlsausführung in der Prozessor-Pipeline
ist. Das Feld kann auch die Adressen-Raum-Zahl (Address Space Number – ASN),
auf die durch die Speicher-Transaktion, verursacht durch den Befehl,
Bezug genommen ist, speichern.
-
Das Quellen-Feld 340 kann
dazu verwendet werden, die Quelle des Zugriffs, z. B. einen Lade- oder
Speicherbefehl, eine DMA-Anforderung, oder eine Cache-Kohärenz-Protokoll-Operation,
ebenso wie zusätzliche
Informationen, um die Quelle zu identifizieren, zu speichern.
-
Falls die Quelle des Zugriffs eine
Befehlsausführung
war, dann kann der Programm-Zähler (Programm
Counter – PC)
des Befehls, der den Zugriff verursachte, in dem Befehl-Feld 350 gespeichert werden.
Das Programm-Zähler-Feld 350 kann
auch dazu verwendet werden, Informationen über andere Arten von Quellen,
um ein Register zu sparen, zu speichern. Zum Beispiel kann, falls
die Quelle eine Kohärenz-Operation
von einem anderen Prozessor in einem Multiprozessor-Computersystem
ist, dann das Feld 350 dazu verwendet werden, die Prozessor-Zahl
des Prozessors, von dem die Anforderung ausging, die die Kohärenz-Operation
verursachte, zu halten. Für
einen DMA-Typ von Transaktionen kann die Identität, falls die I/O-Vorrichtung
die DMA initiierte, gespeichert werden.
-
Das Zeitintervall (Latenz) zwischen
aufeinanderfolgenden Zugriffen und/oder dem Intervall, von wo an
die Anforderung ausgegeben wurde, bis die Daten in dem Prozessor
ankommen (oder in dem Fall eines Schreibens, das Intervall, von
wo an die Daten zu dem Speicher geschickt wurden, bis die Daten
in dem Speicher festgelegt wurden), kann in dem Latenz-Feld 360 gespeichert
werden. Das Intervall kann in Einheiten von Prozessor-Taktzyklen gemessen
werden oder das Intervall kann in anderen Einheiten gemessen werden,
wie beispielsweise die Zahl von Transaktionen, abgearbeitet durch
das Speicher-System.
Das Intervall kann auch in die Zeit, erforderlich dazu, die Transaktion
an jeder Ebene der Speicher-Hierarchie zu verarbeiten, aufgeteilt
werden.
-
Zusätzliche Register, wie beispielsweise
das Feld 370, können
zu dieser Struktur hinzugefügt
werden, um einen zusätzlichen
Speicher-Systemzustand zu speichern, der zum Zeitpunkt erfasst ist,
zu dem die abgetastete Speicher-Transaktion abgearbeitet ist. Dieser
Zustand kann Informationen über
Speicher-Systemtransaktionen umfassen, die seit der letzten Abtastung
aufgetreten sind, wie beispielsweise Zählungen über die gesamte Anzahl von
Transaktionen, oder von Transaktionen, die einen bestimmten Satz
von Kriterien erfüllen.
-
Wie in 2 dargestellt
ist, können
Abtastereignisse auf der Leitung 290, die Teil des abgetasteten
Zustands sein können,
treffen/fehlschlagen, gültig/ungültig, schmutzig,
und dergleichen, umfassen. Ein Auswahlsignal auf der Leitung 291 kann
bestimmen, welches bestimmte Ereignis abzutasten ist.
-
Andere Zustand-Informationen können auch Inhalte
oder eine Zahl von gültigen
Eintritten in Speicher-System-Strukturen umfassen, wie beispielsweise
Schreib-Puffer, Victim-Cache, Übersetzungs-Vorgriffspuffer
(Translation Lookaside Buffers – TLBs), Miss-Adressen-Dateien
(Miss-Address Files – MAFs),
und Speicher-Transaktions-Warteschlangen.
-
Random-Memory-Transaktions-Abtast-Techniken
-
In einer bevorzugten Ausführungsform
werden Transaktionen, die auf irgendeine Ebene der Speicher-Hierarchie
zugreifen, unter Verwendung von mindestens zwei Betriebsmoden abgetastet.
In einem ersten Modus werden Zugriffe auf spezifische Bereiche (Adressen)
von Speichern abgetastet. In einem zweiten Modus werden zufällig ausgewählte Speicher-Transaktionen
abgetastet, um die Funktionsweise irgendeines Teils der Speicher-Hierarchie abzuschätzen.
-
In dem ersten Modus können die
interessantesten Informationen durch Abtasten von mindestens zwei
aufeinanderfolgenden Transaktionen zu derselben, physikalischen
Stelle zusammengestellt werden, durch, zum Beispiel, einen Cache-Block.
Dies wird Cache-Zustand-Übergänge ergeben.
-
In dem zweiten Modus wird eine zuverlässige Abtastung
einer großen
Anzahl von Transaktionen über
die Zeit eine statistische Analyse ermöglichen, um die gesamte Speicher-Funktion
abzuschätzen, ohne
ernsthaftes Beeinträchtigen
des Durchsatzes des Systems. Mit anderen Worten ermöglicht eine zufällige Abtastung,
eine Speicher-Funktion in tatsächlichen
Betriebssystemen zu messen.
-
Deshalb können die Vorrichtung und das Verfahren,
die hier offenbart sind, Transaktionen abtasten, um Cache-Blöcke als
sauber oder schmutzig zu spezifizieren, um Bereiche von Speichern,
alle Speicherstellen, alle Speicherstellen, wo Cache-Blöcke schmutzig
sind, Speicherstellen, wo die Daten nicht in dem Cache vorhanden
sind, zu spezifizieren.
-
Da Cache-Zustand-Übergänge von besonderem Interesse
sind, ist die Anordnung, dargestellt in 2, so ausgelegt, um Kopien von Zustand-Informationen
für mindestens
zwei aufeinanderfolgende Zugriffe zu speichern, wenn der Modus eine
Cache-Abtastung ist. Die erste Kopie erfasst Informationen über den
Zustand des Cache-Blocks nach dem ersten Zugriff. Der Zustand nach
dem zweiten Zugriff wird als die zweite Kopie gespeichert. Durch
Vergleichen dieser zwei Zustände
ist es möglich,
zu bestimmen, welche Übergänge in dem
Cache-Kohärenz-Protokoll
des Systems aufgetreten sein müssen.
-
Die Angabe von Speicher-Zustand-Informationen
für aufeinanderfolgende
Transaktionen kann durch sequenzielle Zugriffe verallgemeinert werden, die
einfach durch Software spezifizierte Kriterien, wie beispielsweise
aufeinanderfolgende Fehlschläge, aufeinanderfolgende
Treffer, aufeinanderfolgende Ungültigkeiten,
usw., anpassen. Diese sind unterschiedliche Variationen in Bezug
auf den Cache-Abtast-Modus, eingestellt über die Leitung 262.
-
In der bevorzugten Ausführungsform
werden die Zustand- und Adressen-Informationen
erfasst, wenn ein Cache-Block aktualisiert wird, so dass dabei kein
Erfordernis vorhanden ist, den Cache direkt zu lesen. Durch Erfassen
der Informationen auf diese Art und Weise in den Cache 200 hinein
ist das Hardware-Design einfacher, da das Erfordernis, Drähte von
jedem Cache-Block zu der Abtasteinrichtung 270 zu führen, ver mieden
wird. Das Design kann auch durch Begrenzen der Abtastung auf eine
kleine Anzahl von Blöcken
vereinfacht werden. Wenn nur eine kleine Anzahl von Blöcken gleichzeitig
abtastet, wird eine zusätzliche
Hardware für
jeden Cache-Block vermieden.
-
Unter Verwendung einer Software,
um das Monitor-Register 264 zu beladen, kann eine flexible Kontrolle
eines weiten Bereichs von Überwachungstechniken
ausgeführt
werden. Zum Beispiel kann, wenn keine Zugriff-Aktivität für einen
bestimmten Cache-Block innerhalb einer spezifizierten Zeitperiode erfasst
ist, dann die Software die Überwachung
dieses Blocks durch einfaches Spezifizieren eines anderen Blocks,
um ihn zu überwachen,
aussondern. In einem anderen Modus kann der überwachte Cache-Block zufällig ausgewählt werden,
um statistisch das Verhalten jedes Blocks in dem Cache abzutasten.
Alternativ kann eine Software die Blöcke in einer Round-Robin-Reihenfolge
abtasten.
-
Es ist auch möglich, selektiv einen Cache-Block,
der einer spezifizierten Programm-Variablen oder einer Daten-Struktur
zugeordnet ist, zu überwachen.
Hierbei bestimmt die Software, welcher Cache-Block eine bestimmte
Variable speichern wird, und wählt
diesen Block als den einen aus, um ihn zu überwachen. Diese Technik ermöglicht Programmierern,
interaktiv eine Speicher-System-Funktion durch Identifizieren von
Konflikten beim Ausführen
von Programmen, die untersucht werden sollten, auszutesten. Ähnliche
Techniken können
durch eine adaptive Laufzeit-Software verwendet werden, um ernsthafte Cache-Konflikte über eine
dynamische Daten-Wiederzuordnung zu vermeiden.
-
Es sollte angemerkt werden, dass
die Transaktions-Abtastung, wie sie hier beschrieben ist, für unterschiedliche
Ebenen in der Speicher-Hierarchie durch Duplizieren der Abtast-Software,
dargestellt in 2, eingesetzt
werden kann. Es ist anzumerken, dass diese Technik auf den zwei
TLB-Eigenschaften, die vorstehend beschrieben sind, beruht.
-
Die Abtast-Techniken, wie sie hier
beschrieben sind, ermöglichen
eine feinfühlige Überwachung von
Speicher-Transaktionen mit einem geringen Hardware-Overhead. Diese
Informationen können auf
viele Arten und Weisen verwendet werden. Zum Beispiel können die
zusammengestellten Informationen System-Designer dabei helfen, besser
die Funktionsweise von Speicher-Untersystemen, wie beispielsweise
Cache, DRAM, und dergleichen, zu verstehen. Die Funktions-Daten
können
dazu verwendet werden, Optimierungen zu leiten.
-
Abschätzen von Speicher-Interaktionen
unter Kontexten bzw. Zusammenhängen
-
Die abgetasteten Informationen über Speicher-System-Transaktionen
können
dazu verwendet werden, eine Vielzahl von Statistiken über eine
Speicher-System-Aktivität
zu berechnen. Dieser Prozess 400 ist in 4 dargestellt. Der Prozess setzt ein wiederholtes
Auswählen
eines Bereichs eines Speichers, um ihn zu überwachen, z. B. eines spezifischen
Cache-Blocks innerhalb einer spezifischen, einem Satz zugeordneten
Cache-Zeile innerhalb eines spezifischen Cache-Speichers, Schritt 410,
ein Aufzeichnen von Zustand-Informationen
von mehreren, aufeinanderfolgenden Speicher-Transaktionen, die auf
diesen Bereich zugreifen, Schritt 420, und ein Kommunizieren
dieser aufgezeichneten Zustand-Informationen zu einer Software,
Schritt 430, ein.
-
Nachdem eine vorbestimmte Anzahl
von Abtastungen zusammengestellt worden ist oder eine vorbestimmte
Zeitdauer abgelaufen ist, kann die Abtast-Software statistisch die
aufgezeichneten Informationen analysieren, um eine Vielfalt von
Eigenschaften über
eine Cache-Benutzung und von Speicher-System-Interaktionen unter
Kontexten abzuschätzen.
-
Eine typische Art und Weise einer
Verwendung dieser Maßnahme
ist diejenige für
die Software, periodisch einen Random-Cache-Block auszuwählen, um
eine Folge von Abtastungen für
Transaktionen zu überwachen
und zusammenzustellen, die auf diesen bestimmten Block zugreifen.
Nachdem eine vorgegebene Zeitperiode abgelaufen ist, wählt die Software
einen neuen Random-Cache-Block aus, um ihn zu überwachen, und der gesamte
Prozess 400 kann wiederholt werden. Über die Zeit werden Abtastungen
für alle
Blöcke
in dem Cache entstehen.
-
Diese zufällige Abtastung in der räumlichen Dimension
ermöglicht
die Abschätzung
von Statistiken, die sich auf ein gemeinsames Teilen und auf Konflikte
in sowohl dem Raum als auch der Zeit beziehen. Es ist anzumerken,
dass die zufällige
Auswahl des Bereichs, um ihn zu überwachen,
durch eine Hardware-Logik ausgeführt
werden kann. Allgemein ist es möglich,
jeden Bereich zu überwachen, bis
eine spezifizierte Anzahl von Abtast-Ereignissen 290 aufgetreten
ist. Die Ereignisse 290 können Speicher-Transaktionen zu
dem Bereich, oder die gesamten Speicher-System-Transaktionen, oder
eine abgelaufene Zeit, gemessen in Prozessor-Taktzyklen oder anderen
Einheiten, sein.
-
Für
jede Transaktion ist es möglich,
eine Vielzahl von Informationen zu erfassen, wie dies hier beschrieben
ist. Für
diese Analysen umfassen die Informationen, die für jede Transaktion von Interesse sind,
deren Treffer- oder Fehl- bzw. Miss-Status in dem Cache, der von
Interesse ist, Cache-Protokoll-Zustand-Informationen über den
Block, auf den durch die Transaktion Bezug genommen ist, den Typ einer
Transaktion (z. B. lesen, schreiben oder für ungültig erklären), die virtuelle und physikalische
Adresse, auf die durch die Transaktion Bezug genommen ist, die entsprechende
Stelle innerhalb des Cache (wie beispielsweise die Block- und/oder
Zeilen-Indizes).
-
Zusätzliche, aufgezeichnete Informationen identifizieren
den Kontext der Transaktion, wie beispielsweise eine Cache-Kohärenz-Operation
von einem anderen Prozessor, einen Direkt-Speicher-Zugriff von einer
Eingangs/Ausgangs-Vorrichtung, oder eine Befehlsausführung von
einem bestimmten Prozess, einem Thread, einer Adressen-Raum-Zahl oder einem Hardware-Kontext.
-
Die Analyse der Abtastungen umfasst
zuerst Auswählen
eines Untersatzes der Abtastungen, die von Interesse sind, Schritt 440.
Insbesondere kann ein Untersatz Paare von Abtastungen von aufeinanderfolgenden
Zugriffen zu einem Bereich, wie beispielsweise einem spezifischen
Cache-Block, sein, die auch zusätzliche
Funktionskriterien erfüllen.
-
Da das ausgewählte Transaktions-Paar von aufeinanderfolgenden
Zugriffen zu derselben physikalischen Stelle in dem Cache resultierte,
können
Informationen, aufgezeichnet über
die Transaktionen, dazu verwendet werden, ein gemeinsames Teilen oder
Konflikte für
diesen physikalischen Raum in dem Cache abzuschätzen. Auch können Statistiken über Häufigkeiten
von verschiedenen Zustand-Übergängen in
dem Cache-Protokoll bestimmt werden, da eine Prüfung des Protokoll-Zustands
in Bezug auf zwei aufeinanderfolgende Transaktionen die Transaktion
identifiziert, die stattgefunden haben muss, um von dem Zustand
in der ersten Abtastung des Paars zu dem Zustand in der zweiten
Abtastung des Paars zu gehen.
-
Um ein gemeinsames Teilen abzuschätzen, wählt die
Analyse Paare aus, wo die zweite Transaktion in dem Paar ein Cache-Treffer
im Schritt 450 war. Dies zeigt an, dass dort ein gemeinsames
Teilen zwischen der ersten und der zweiten Transaktion vorhanden
war. Durch Prüfen
des Kontextes, der Informationen identifiziert, die beiden Abtastungen
zugeordnet sind, ist es möglich,
zu bestimmen, welche Kontexte nützlich
diesen physikalischen Raum während
des abgetasteten Zeitintervalls gemeinsam teilten. Durch Ansammeln
dieser Information über
viele solcher Paare von Abtastungen kann man statistisch Metriken
abschätzen,
die sich auf sowohl eine Intea-Kontext- als auch eine Inter-Kontext-Teilung von physikalischen
Stellen beziehen.
-
Eine nützliche Metrik wird durch Zählen der Anzahl
von Paaren bestimmt, wo das erste Paar in der Abtastung einen spezifischen
Kontext anpasst und wo das zweite Paar in der Abtastung einen zweiten
spezifischen Kontext anpasst, was effektiv zu einer Matrix von Zählungen
führt,
die durch die Identifizieren des ersten und des zweiten Kontextes
indexiert sind. Ähnlich
kann man, durch Analysieren von Paaren, wo die zweite, abgetastete
Transaktion einen Cache-Fehler im Schritt 460 erfuhr, statistisch Metriken
abschätzen,
die sich auf einen Intea-Kontext- und einen Inter-Kontext-Konflikt
für physikalische
Stellen beziehen.
-
Eine alternative Verwendung dieser
Hardware ist diejenige, einen spezifischen Cache-Bereich, um ihn
zu überwachen,
auszuwählen.
Der ausgewählte
Bereich entspricht dem Raum in dem Cache, der eine bestimmte Programm-Variable
oder Daten-Struktur speichert. Durch Zusammenstellen von Abtastungen
und Filtern der Abtastungen, um Abtast-Paare zu erhalten, wo mindestens
eine der Transaktionen die Variable oder Daten-Struktur, die von Interesse ist, einsetzt,
ist es möglich,
Cache-Konflikt-Raten abzuschätzen,
und andere, spezifische Programm-Variablen oder Daten-Strukturen, die
die Quellen der Konflikte sind, zu identifizieren.
-
Diese Abschätzung kann dynamisch vorgenommen
werden, um eine Online-Programm-Fehlersuche
oder eine Optimierung von Funktions-Problemen innerhalb eines laufenden
Programms oder Systems zu ermöglichen.
Diese Technik ermöglicht Programmierern,
interaktiv eine Speicher-System-Funktion durch Identifizieren von
Konflikten beim Ausführen
von Programmen, die untersucht werden, nach Fehlern zu durchsuchen. Ähnliche
Techniken können
durch eine adaptive Laufzeit-Software verwendet werden, um ernsthafte
Cache-Konflikte über eine
dynamische Daten-Verschiebung zu vermeiden.
-
Abschätzungsstatistiken von Eigenschaften
von Speicher-Transaktionen
-
Die abgetasteten Informationen über Speicher-System-Transaktionen
können
dazu verwendet werden, eine Vielzahl von Statistiken über eine
Speicher-System-Aktivität
zu berechnen. Dieser Prozess 500 ist in 5 dargestellt und wird unter Verwendung
der Hardware, die zuvor beschrieben ist, mittels der folgenden Schritte
durchgeführt:
- Schritt 1: Wähle eine Auswahl-Funktion aus,
um Speicher-Transaktionen, die von Interesse sind, zu identifizieren, 510.
- Schritt 2: Zeichne Informationen über ausgewählte Speicher-System-Transaktionen
auf, 520.
- Schritt 3: Kommuniziere die aufgezeichneten Zustand-Informationen
zu der Software, 530.
- Schritt 4: Wähle
einen Untersatz von Transaktionen aus, die dahingehend angesehen
werden, dass sie von Interesse sind, 540.
- Schritt 5: Analysiere diesen Untersatz, um verschiedene Statistiken
oder Eigenschaften abzuschätzen, 550.
-
Die aufgezeichneten Zustand-Informationen umfassen
eine Fülle
von Informationen über
jede Speicher-Transaktion, so dass viele nützliche Statistiken berechnet
werden können.
-
Die Informationen in den Abtastungen
können
umfassen:
- – Adressen,
auf die durch die Speicher-Transaktion Bezug genommen ist;
- – einen
Kontext identifizierende Informationen, wie beispielsweise einen
Prozess-Identifizierer, einen
Thread-Identifizieren, einen Hardware-Kontext-Identifizierer, eine
Adressenraum-Zahl, einen Direkt-Speicher-Zugriffs-Vorrichtungs-Identifizierer
oder einen Prozessor-Identifizierer eines Cache-Kohärenz-Verkehrs;
- – Status-Informationen
für jede
Ebene in der Speicher-Hierarchie, auf die durch die Transaktion
Bezug genommen ist, wie beispielsweise Cache-Treffer/Fehlschlagen,
schmutzung/sauber, und/oder gemeinsam geteilter/exklusiver Status.
-
Analysieren der aufgezeichneten
Zustand-Informationen
-
Ein Abtasten individueller Speicher-System-Transaktionen
macht es möglich,
eine Vielzahl von statistischen Metriken über Verteilungen von Eigenschaften
des Speicher-System-Verhaltens
zu berechnen. Zum Beispiel ist es möglich, Verteilungen von Latenzen
zu Service-Speicher-Anforderungen abzuschätzen, oder Raten von Cache-Treffern
an einer bestimmten Ebene oder Bereich in der Speicher-Hierarchie
abzuschätzen.
Filtermechanismen können
verwendet werden, um Untersätze
der aufgezeichneten Transaktionen, die von Interesse sind, zu identifizieren,
was Statistikern ermöglicht,
um sich mit bestimmten Aspekten des Speicher-Systems, die von Interesse
sind, zu befassen, wie beispielsweise Transaktionen zu einem bestimmten
Bereich oder einer bestimmten Ebene in der Speicher-Hierarchie, oder
eine bestimmte Klasse von Transaktionen, wie beispielsweise lesen,
schreiben, oder für
ungültig
erklären.
-
Nachdem ein Satz von Abtastungen,
die von Interesse sind, identifiziert worden ist, können standardmäßige, statistische
Techniken verwendet werden, um Durchschnitte, Standardabweichungen,
Histogramme und andere Statistiken über die Abtastungen, die von
Interesse sind, abzuleiten. Durchschnitte können dazu verwendet werden,
Raten eines Auftretens von bestimmten Ereignissen auf der Leitung, 290,
der 2, wie beispielsweise
Cache-Treffer oder -Fehler, oder Räumungen, abzuschätzen.
-
Es ist auch möglich, den Anteil von Anforderungen
aufgrund von Lesvorgängen,
Schreibvorgängen
oder ungültigen
Vorgängen
abzuschätzen.
Diese Raten können
in Bezug auf einen bestimmten Zusammenhang bestimmt werden, um so
Metriken, wie beispielsweise Cache-Treffer-Raten pro Prozess, oder
eine durchschnittliche Speicher-System-Latenzzeit,
erfahren durch ein Thread, abzuschätzen. Es ist auch möglich, den
Anteil einer Ebene der Speicher-Hierarchie abzuschätzen, der
durch einen bestimmten Kontext verbraucht ist.
-
Standard-Fehler-Abschätz-Techniken
können
verwendet werden, um Vertraulichkeits-Intervalle über die
Genauigkeit der abgeleiteten Statistiken zu erhalten. Insbesondere
können,
für Statistiken,
die eine Anzahl von Abtastungen mit einer spezifischen Eigenschaft
einsetzen, Fehlergrenzen unter Verwendung des reziproken Werts der
Quadratwurzel der Anzahl von Abtastungen mit dieser Eigenschaft
angenähert
werden. Diese Fehlergrenzen können
auch verwendet werden, um dynamisch die Rate zu kontrollieren, unter
der ausgewählte
Transaktionen abgetastet werden, um so eine Genauigkeit mit einem Abtast-Overhead
abzuwägen.
-
Wenn die aufgezeichneten Zustand-Informationen
Latenz-Informationen umfassen, entweder in der Form der Latenz,
die erforderlich ist, um die Speicher-Transaktion zu verarbeiten,
oder im Hinblick auf die Latenz zwischen zwei aufeinanderfolgenden,
abgetasteten Speicher-Transaktionen, können die Informationen dazu
verwendet werden, Statistiken, die auf einer Latenz basieren, zu
berechnen. Eine Latenz wird typischerweise in Zeiteinheiten gemessen,
wie beispielsweise Prozessor-Taktzyklen, können allerdings auch in anderen
Einheiten gemessen werden, wie beispielsweise die Anzahl von Speicher-Transaktionen, die
abgearbeitet sind.
-
Befehl und
Daten-Neuverteilung
-
In einem sehr allgemeinen Sinne führen Prozessoren
Befehle aus, die in Bezug auf Daten arbeiten. In vielen modernen
Computersystemen werden die Befehle und Daten gewöhnlich als
separate Strukturen unter Verwendung unterschiedlicher Speicherseiten
beibehalten, da die Zugriffsmuster für Befehle sehr unterschiedlich
gegenüber
einem solchen für
Daten ist. Eine Speicher-Auflistung virtuell zu physikalisch für Befehle
und Daten wird gewöhnlich durch
das Betriebssystem durchgeführt.
Alternativ kann eine Neuverteilung von Strukturen manuell, oder
durch Compiler, Linker und Loader, vorgenommen werden. Einige Systeme
können
Strukturen dynamisch, wenn sie die Befehle ausführen, neu verteilen.
-
Unter Verwendung der Hardware, die
hier beschrieben ist, ist es möglich,
ein Feedback zu einer Vielzahl von interessierenden Teilen einer
Software anzugeben. Zum Beispiel können abgetastete Speicher-Transaktions-Zustand-Informationen
verwendet werden, um, zum Beispiel, Seiten-Umlistungs-Policen anzusteuern,
oder um eine Eigen-Interferenz durch
Vorsehen einer Rückführung zu
Compilern, Linkern oder Loadern zu vermeiden.
-
Zum Beispiel kann ein Software-Konflikt Adressen
auf der Seiten-Ebene ansammeln, um über dynamische Seiten-Neuauflistungs-Algorithmen, ausgeführt durch
Betriebssysteme, zu informieren. Es ist auch möglich, interessierende Profilierungs-Tools
zu schaffen, die potenzielle Funktions-Probleme für Programmierer
und Benutzer identifizieren.
-
Zum Beispiel ist es nun möglich, abzuschätzen, wie
oft Daten schmutzig sind, wenn die Daten ausgesondert werden, und
wie oft DMA-Übertragungen
oder Cache-Kohärenz-Protokoll-Übertragungen auftreten,
was ein Gefühl
dafür gibt,
wie effektiv das Speicher-System
verwendet wird.
-
Seiten-Replizierung und
Migration in einem Multiprozessor-Computersystem
-
In Multiprozessor-Systemen mit einem
nicht gleichförmigen
Speicher-Zugriff (Non-Uniform
Memory Access – NUMA)
besitzt jeder Prozessor Bereiche des Speicher-Systems, die schneller zugreifen können (oder
mit einer höheren
Bandbreite), als dies andere Teile des Speicher-Systems vornehmen
können.
Um eine Funktion zu verbessern, können Daten (die entweder Programm-Daten
oder Befehle sein können),
auf die häufig
durch einen Prozessor zugegriffen wird, zu einem Bereich des Speicher-Systems bewegt
werden, auf den schneller durch diesen Prozessor zugegriffen werden
kann.
-
Diese Bewegung kann auf zwei Arten
vorgenommen werden. Die Daten können
repliziert werden, indem mehrere Kopien der Daten erstellt werden.
Idealerweise werden die Daten vernünftig durch den System-Speicher "gestreut". Alternativ können die
Daten durch tatsächliches
Bewegen der Daten in einen Speicher mit einer niedrigeren Latenz
oder höheren
Bandbreite migriert werden. Die Schritte 600, die eingesetzt
sind, sind in 6 dargestellt
und umfassen das Folgende:
- Schritt 1: Aufzeichnen
von Informationen über ausgewählte Speicher-System-Transaktionen, 610.
- Schritt 2: Identifizieren von Bereichen, auf die häufig zugegriffen
ist, des Speichers (z. B. Seiten), 620.
- Schritt 3: Identifizieren von Kandidaten für eine Replizierung und Migration, 630.
- Schritt 4: Replizieren und/oder Migrieren von geeigneten Daten,
um spezifische Metriken zu verbessern, 640.
-
Der Schlüssel zu diesem Prozess ist
in Schritt 2 und Schritt 3 gegeben. Informationen darüber, auf
welche Teile von Daten, z. B. über
Informationen über
virtuelle und physikalische Adressen, Bezug genommen ist, auf die
häufig
durch diesen Prozessor zugegriffen ist, und auch welche Teile von
Daten wesentliche Cache-Fehler erfuhren oder hohe Latenzen bei deren
Zugriff erfuhren, können
verwendet werden, um Replizierungs- und/oder Migrations-Entscheidungen
zu leiten.
-
Informationen über den Typ von Zugriffen (z. B.
lesen, schreiben und für
ungültig
erklären)
können die
Entscheidung darüber
leiten, ob zu replizieren oder zu migrieren ist, oder ob die Daten
an Ort und Stelle zu belassen sind. Zum Beispiel sollten Daten, die
häufig
durch mehrere Prozessoren geschrieben werden (z. B. im Schreiben
gemeinsam geteilte Seiten), nicht repliziert oder migriert werden,
während Daten,
die häufig
gelesen, allerdings nur selten beschrieben werden (z. B. im Lesen
gemeinsam geteilte Seiten), gute Kandidaten für eine Replizierung sind. Seiten,
auf die nur schwer durch nur einen einzelnen Prozessor zugegriffen
wird, sind gute Kandidaten für
eine Migration zu einem Speicher, der näher zu dem zugreifenden Prozessor
liegt. Diese Informationen können
durch statistisches Abtasten von Speicher-System-Transaktions-Informationen
gesammelt werden, wie dies hier beschrieben ist.
-
Die Informationen über Speicher-System-Transaktionen
können
dynamisch zusammengestellt werden und können in einer Online-Weise verwendet
werden, um dynamisch die Replizierungs- und Migrations-Policen des
Computersystems zu steuern. Typischerweise werden eine Replizierung und
Migration durch das Betriebssystem gehand habt, allerdings können sie
durch andere Software- oder Hardware-Schichten gehandhabt werden.
-
Dabei sind verschiedene, potenzielle
Funktions-Metriken vorhanden, die versuchen können, Replizierungs- und Migrations-Policen
zu verbessern, einschließlich
einer Erhöhung
in dem gesamten System durch Ersatz, eine Erhöhung in dem Durchsatz für bestimmte
Aufträge
mit einer hohen Priorität,
einer Verringerung in einem Verkehr zwischen Prozessoren und Speichern,
einer Verringerung der gesamten Speicher-Latenz, oder einer gesamten
Erhöhung der
System-Funktion.
-
Kontext-Ablaufplanung
-
Da Cache in einem hierarchischen
Speicher Daten teilten, die von verschiedenen Hardware-Kontexten
ausgehen, treten Threads, die in unterschiedlichen Hardware-Kontexten ablaufen,
für diese
Linien in einem Cache in Wettbewerb. Deshalb ist es erwünscht, Threads
so ablaufmäßig zu planen,
dass Ressource-Konflikte minimiert werden.
-
Eine vernünftige Ablaufplanung ist besonders
wichtig für
Multithreaded-Prozessoren,
wo Speicher-Referenzen von unterschiedlichen Hardware-Kontexten
an einer sehr feinstufigen Ebene verschachtelt werden, und die Relevanz
wird dann erhöht,
wenn diese Kontexte gemeinsam Speicher-System-Ressourcen teilen,
wie beispielsweise Cache. Allerdings ist es auch für Single-Threaded-Prozessoren
wichtig, wenn die Cache groß genug
relativ zu der Anzahl von Speicher-Transaktionen, vorgenommen durch
einen Thread während
eines ablaufmäßigen Quantum,
sind. Dann ist eine gewisse Hoffnung vorhanden, einige nützliche
Cache-Inhalte zu erhalten, wenn das nächste Quantum bzw. die nächste Menge
einem bestimmten Kontext zugeordnet ist. Alle diese Ablauf-Entscheidungen können dynamisch
an eine Rückführung angepasst werden,
gesammelt von einer statistischen Abtastung von Speicher-System-Transaktionen
während eines
Online-Betriebs.
-
Dies kann durch Abtasten von Speicher-System-Transaktions-Informationen,
wie dies hier beschrieben ist, vorgenommen werden. Eine Betriebssystem-Software
kann unter Berücksichtigung
verschiedener Aspekte von Speicher-Referenz-Mustern von Threads
oder Prozessen einen Vorteil erhalten, wenn Ablauf-Entscheidungen
vorgenommen werden. Dieser Prozess 700 ist in 7 dargestellt.
-
Schritt 710 tastet Transaktionen
für spezifizierte
Kontexte ab. Durch Erfassen von alten und neuen Kontext-Identifizierern
als Teil einer Cache-Überwachung,
kann die Be triebssystem-Software statistisch den Grad abschätzen, mit
dem unterschiedliche Kontexte in dem Cache gemeinsam geteilt werden
und in Konflikt treten, und zwar im Schritt 720. Diese
Abschätzungen
können
durch Kontext-Ablaufplanungs-Einrichtungen in den Schritten 731–733 verwendet
werden, um bevorzugt Kontexte ablaufmäßig zu planen. Die Ablaufplanungs-Entscheidungen 731–733,
die nachfolgend beschrieben sind, können unter Berücksichtigung
von verschiedenen Metriken, einschließlich einer Erhöhung der Menge
eines gemeinsamen Teilens unter Kontexten, die für Speicher-Ressourcen in Wettbewerb
treten, oder Verringern von Konflikten, die gemeinsam Kontexte,
die für
Speicher-Ressourcen
in Wettbewerb treten, teilen, von Vorteil sein.
-
Co-Ablaufplanung
-
Zum Beispiel macht es Sinn, bevorzugt
einen Thread parallel ablaufmäßig zu planen,
der einen großen
Cache-Grundstock (Cache Footprint) besitzt, gleichzeitig mit einem
Thread, der nur eine bescheidene Benutzung des Cache vornimmt, da
die Speicher-System-Anforderungen
solcher Threads zueinander passen, um dadurch das gemeinsame Teilen zu
erhöhen.
Auch macht es Sinn, nicht überlappende Bereiche
des Cache so umfangreich wie möglich
zu verwenden.
-
Andererseits sollte die Betriebssystem-Software
anstreben, Ressource-Konflikte zu minimieren, zum Beispiel durch
Vermeiden einer gleichzeitigen Ablaufplanung von zwei Threads mit
großen
Cache-Footprints, wo dies möglich
ist, da dies zu viel mehr Konflikt-Fehlern als die Threads führen wird, die
zueinander nützliche
Daten von dem Cache ausräumen,
um dadurch Konflikte zu verringern.
-
Ablaufplanung, die auf
einer gemeinsamen Teilung basiert
-
Ablaufplanungs-Policen auf einer
Basis einer gemeinsamen Teilung oder einer proportionalen Teilung
wünschen
Idealerweise, jedem Kontext eine maximale gemeinsame Teilung jedes
Cache-Speichers in der Speicher-Hierarchie zu geben. Mit der vorliegenden
Abtast-Technik ist es möglich,
statistisch den Teil eines Cache, der durch jeden Kontext belegt
ist, abzuschätzen,
und zwar im Schritt 720. Dies ermöglicht der Ablaufplanungs-Einrichtung, ihre Entscheidungen
auf Metriken zu begründen,
wie beispielsweise solche, die jedem Prozess eine maximale, gemeinsame
Teilung von Speicher-System-Ressourcen
gibt, was effektiv Speicher-System-Ressourcen unter Kontexten im
Verhältnis
zu deren Erfordernissen unterteilt.
-
Ablaufplanung, die auf
einer Zuordnung basiert
-
Jeder Kontext, der ablaufmäßig geplant
werden kann, besitzt dazu zugeordnet Ressourcen, wie beispielsweise
den Umfang eines Cache, den er verwenden kann. Ein Kontext, der
mehr als seinen zugeordneten Anteil verwendet, kann verlangsamt
oder ausgesetzt werden. Ein ähnlicher
Kontext, der seinen zugeordneten Anteil nicht ausreichend benutzt,
kann favorisiert werden. Während
einige Kontexte anhängig
sind, können
andere deren gemeinsames Teilen des Cache erhöhen. In anhängigen oder ausgesetzten Kontexten
kann ermöglicht
werden, fortzufahren, nachdem deren Cache-Benutzung verringert wurde, und
zwar als ein Ergebnis eines erhöhten
Cache-Drucks von anderen, aktiven Kontexten. Dies kann gegenüber bekannten
Maßnahmen
unterschieden werden, die allgemein nicht ermöglichen, dass Informationen,
auf der Cache-Zeilen- oder Block-Ebene, überwacht werden, und zwar anders als
durch Simulation.
-
Alle diese Ablaufplanungs-Entscheidungen können dynamisch
angepasst werden, um zurückgeführt zu werden,
gesammelt aus einem statistischen Abtasten von Speicher-System-Transaktionen
während
eines Online-Betriebs.