2013-06-30 6 views
5

Ich interessiere mich für die Feinabstimmung Cache-bewusste Datenstrukturen (siehe zum Beispiel die Sperre-freie Skip-Struktur in Michael Spiegel's dissertation oder Herlihy et al hopscotch hashing) sowie in der Verhinderung false sharing z. während gleichzeitiger Array-Verarbeitung. Ich weiß bereits, wie man die JVM-Pointer-Größe über die Eigenschaft "sun.arch.data.model" findet, aber ich konnte keine Möglichkeit finden, die Größe von Cache-Zeilen im L1-Cache zu bestimmen.Wie finde ich die Größe der L1 Cache-Zeilen innerhalb eines Java-Prozesses?

Beachten Sie, dass diese Informationen nicht kritisch sind, da ich einfach weiterhin konservative Schätzungen für die L1-Zeilengröße verwenden kann (64 Byte bei der Feinabstimmung von Cache-bewussten Datenstrukturen oder 256 Byte bei Verhinderung von falschem Teilen); Wenn es jedoch einfach ist, die L1-Cache-Eigenschaften zu erhalten, kann ich sie auch nutzen.

+0

Ich denke, dass diese (sehr interessante, würde ich sogar aufregende sagen) Aufgabe würde viel zu viel zu implementieren kosten. Ich würde hier die faule Sache machen: Hardcode-Cachegrößen für CPU-Modelle, und bestimmen, dass - wie es einfacher sein könnte. Dies könnte jedoch schiefgehen, wenn die JVM in einer VM ausgeführt wird, die das eigentliche CPU-Modell verbirgt, während Ihre Lösung die richtigen Größen für dieses Szenario verwendet ... – ppeterka

+0

Die Liniengröße ist die Liniengröße; In welchem ​​Sinne ist es jemals 64 ** und ** 256? –

+0

@OliCharlesworth Wenn ich die genaue Zeilengröße nicht kenne, verwende ich verschiedene Schätzungen, je nachdem, was ich versuche, z. Wenn ich eine Cache-bewusste Datenstruktur verfeinere, werde ich die niedrigere Schätzung von 64 Bytes verwenden, weil auf diese Weise die Datenstruktur immer noch gut funktioniert, wenn die tatsächliche Zeilengröße größer als 64 Bytes ist, und wenn ich es bin Wenn ich die falsche Freigabe verhindere, werde ich die höhere Schätzung von 256 Bytes verwenden, da dies immer noch gut funktioniert, wenn die tatsächliche Zeilengröße weniger als 256 Bytes beträgt. –

Antwort

1

Ich habe eine kleine Bibliothek für Java namens CacheSize programmiert, die derzeit nur Intel-Prozessor unterstützt. Sie können alle Informationen zugreifen auf den verschiedenen Ebenen des Cache:

  • Cache-Zeilengröße
  • Anzahl von Sets/Line
  • associativy
  • ...

Webseite here ist. Auch erhältlich über Maven Central.

0

Was Sie tun könnten, ist eine einfache Schleife, die einzelne Bytes aus dem Speicher bei einem bestimmten Schritt liest. Wenn der Schritt 1 (Byte) ist, dann müssten Sie einmal pro Iteration eine Zeilenabzugsstrafe zahlen. Wenn Sie den Übersprung verdoppeln, könnten Sie die Hälfte der Leistung erwarten, da Sie jetzt eine Zeile zweimal mit der gleichen Anzahl von Iterationen abrufen.

Sobald Sie die Cacheline-Größe mit Ihren Schritten erreicht haben, sollten Sie den Perf-Degradations-Stopp sehen, da Sie die Stufe erreichen würden, an der Sie einmal pro Iteration eine Linie holen und die Schrittweite nicht ändern wird. d nur Zeilen überspringen. Ein Problem dabei ist, dass Sie einen HW-Stream-Prefetcher in Ihrer CPU auslösen können, und die Zeilen im Voraus auf einer niedrigeren Cache-Ebene warten. Daher würde ich erwarten, dass sich die Steigung verringert, aber nicht vollständig aufrichtet. Bei einem Schritt der doppelten Cache-Zeilengröße kann dies verschwinden, da Sie einige der Stream-Prefetcher durch schnelleres Schütteln abschütteln könnten (es könnte noch Schritt-Prefetcher geben, die Ihnen weiterhelfen, aber die Auswirkung sollte dramatisch kleiner sein).

Denken Sie auch daran, dass Ihr Code über einen Datensatz (z. B. ein Array) laufen sollte, der größer als der Cache der letzten Ebene ist. Einige MB sollten ausreichen.

Verwandte Themen