2014-05-15 9 views
5

Ich mache einige Cache-Leistungsmessungen und ich muss sicherstellen, dass die Caches vor dem Timing keine "nützlichen" Daten enthalten.Wie löschen Sie die L1-, L2- und L3-Caches?

Angenommen, ein L3-Cache wäre 10MB würde ausreichen, um einen Vektor von 10M/4 = 2.500.000 Gleitkommazahlen zu erstellen, iterieren durch den gesamten Vektor, summieren die Zahlen und das würde den gesamten Cache von allen Daten leeren vor dem Iterieren durch den Vektor?

+0

Wenn Sie den Cache löschen möchten, einfach ziehen Sie eine Reihe von Daten durch, die nichts mit Ihren Testdaten zu tun haben. – Mysticial

+0

@Mysticial hey Mystical, tut das mein Vektor Idee bekommt Ihre Zustimmung? Wären 2.500.000 genug?Ich war mir wegen der Cache-Assoziativität nicht sicher. – user997112

+0

Ja, nur 'memset()' irgendeinen großen zusammenhängenden Stück Speicher. Einige Prozessoren haben einen Hash-L3-Cache. Es ist also möglich, dass ein Teil des zusammenhängenden Speichers, der genau der Größe des Caches entspricht, aufgrund von Kollisionen nicht ausreicht. Aber ich würde sagen, ein paar hundert MB zu ziehen, sollte ausreichen. – Mysticial

Antwort

3

Ja, das sollte ausreichen, um den Cache L3 nützlicher Daten zu leeren.

Ich habe ähnliche Arten von Messungen gemacht und kreuzverifiziert, indem ich die Cache-Zähler von Intel verwendet habe, um zu bestätigen, dass ich die erwartete Anzahl von L3 Cache-Misses während meiner Tests erhalte.

Wenn Sie absolut sicher gehen wollen, sollten Sie auch die Zähler verwenden. Insbesondere können Sie Cache-Fehler der letzten Ebene messen, indem Sie Event select 2EH, Umask 41H in den meisten Intel-Architekturen verwenden.

Einzelheiten zu diesen Zählern finden Sie unter Intel Manual.

+0

Hi @ merlin2011, kannst du den Test, den du auf einer Site durchgeführt hast, posten und mir den Link geben, um ihn zu sehen? Ich habe versucht, denselben Test durchzuführen, um zu beweisen, dass der L3-Cache wirklich sauber war, aber ich kann das nicht. – Draxent

2

Es hängt davon ab, wie verrückt Sie versuchen, Ihre Garantie zu erhalten.

x86_64 L3-Cache ist physikalisch indexiert, und während ein 10MiB-Chunk, der im virtuellen Raum linear ist, fast physisch zusammenhängend auf einem leicht geladenen Computer ist, ist dies nicht garantiert.

Sandy und Ivy Bridge, zum Beispiel, haben L3-Cache in 2MiB Scheiben mit 16-Wege-Assoziativität (128kiB Schritt), so dass Sie physische Abdeckung, indem Sie einen MAP_HUGETLBmmap() Anruf unter der Annahme, Standard 2-4MiB große Seiten garantieren.

Da jeder Slice (zumindest bei einer neuen Sandy/Ivy Bridge) an einen anderen Core angehängt ist und der Slice, auf dem sich eine gegebene physikalische Adresse befindet, durch einen Hash einiger Adressbits niedriger/mittlerer Ordnung bestimmt wird, Sie müssen möglicherweise ein Array etwas größer als die Größe von L3, um für geringfügig ungleichmäßige Überlappung zu begegnen.

An dieser Stelle sollte das Scrubben Ihres Arrays einige Male linear erfolgen.

0

Eine andere Option ist die Verwendung dedizierter Cache-Inaktivierungsanweisungen, die von einigen ISAs bereitgestellt werden. x86 für z.B. hat wbinvd für diesen Zweck (oder clflush für eine einzelne Zeile).

http://x86.renejeschke.de/html/file_module_x86_id_325.html

Ein Problem ist, dass es Ring-0-Berechtigungen erfordert. Ein anderes ist, dass es nicht garantiert, dass der Flush vor irgendeinem Serialisierungspunkt abgeschlossen wird, also nicht gut genug ist, um System-Nicht-Volatilität zu garantieren, aber es kann für Benchmarking ausreichen, solange Sie verhindern können, dass die nachfolgenden WBs essen Erhöhen Sie Ihre Speicherbandbreite.

Wenn Sie diese Probleme beheben können, kann es in einigen Fällen eine bessere Lösung sein, als über eine große Datenstruktur zu gehen, nur um sicherzustellen, dass der Cache geleert wird. Einige CPUs entscheiden sich möglicherweise dafür, Caching-Abrufe zu vermeiden, von denen sie glauben, dass sie in Zukunft nicht wiederverwendet werden (es gibt mehrere Artikel über diese Optionen und zumindest einige Behauptungen, dass sie in realen CPUs implementiert sind)

Verwandte Themen