Wie würden Sie generisch die Assoziativität von Cachezeilen anhand des Benutzermoduscodes erkennen?

Ich stelle einen kleinen Patch für zusammendas cachegrind / callgrind tool in valgrind Diese erkennt automatisch, unter Verwendung von vollständig generischem Code, CPU-Anweisungen und Cache-Konfiguration (derzeit bieten nur x86 / x64-Autokonfigurationen und andere Architekturen keine CPUID-Typkonfiguration für nicht privilegierten Code). Dieser Code muss vollständig in einem nicht privilegierten Kontext ausgeführt werden, d. H. Reinem Benutzermoduscode. Es muss auch auf sehr unterschiedliche POSIX-Implementierungen portierbar sein, damit grokking / proc / cpuinfo nicht funktioniert, da eines unserer Zielsysteme so etwas nicht hat.

Das Erkennen der CPU-Frequenz, der Anzahl der Caches, ihrer Größe und sogar der Cache-Zeilengröße kann mit 100% generischem POSIX-Code erfolgen, der keinerlei CPU-spezifische Opcodes enthält (nur eine Menge vernünftiger Annahmen, wie das Hinzufügen zwei Zahlen zusammen, wenn keine Speicher- oder Registerabhängigkeit vorliegt, werden wahrscheinlich in einem einzigen Zyklus ausgeführt. Dieser Teil ist ziemlich einfach.

Was ist nicht so einfach und warum frage ich StackOverflow, wie man die Assoziativität von Cache-Zeilen für einen bestimmten Cache erkennt? Assoziativität ist, wie viele Stellen in einem Cache eine bestimmte Cachezeile aus dem Hauptspeicher enthalten können. Ich kann sehen, dass L1-Cache-Assoziativität erkannt werden konnte, aber L2-Cache? Stört doch die L1-Assoziativität?

Ich schätze, dass dies wahrscheinlich ein Problem ist, das nicht gelöst werden kann. Aber ich werfe es auf StackOverflow und hoffe, dass jemand etwas weiß, was ich nicht weiß. Beachten Sie, dass ich, wenn wir hier versagen, einfach einen Assoziativitätsstandard von vier festschreiben werde, vorausgesetzt, dies würde keinen großen Unterschied für die Ergebnisse bewirken.

Vielen Dank,
Niall

Antworten auf die Frage(3)

Ihre Antwort auf die Frage