Alle Plattformen sind willkommen. Bitte geben Sie die Plattform für Ihre Antwort an.
Eine ähnliche Frage: Wie kann die Seitengröße des CPU-Cache in C ++ programmgesteuert ermittelt werden?
c++
c
caching
operating-system
systems-programming
paxos1977
quelle
quelle
SDL_GetCPUCacheLineSize
dann einen Blick darauf werfen,cpuid macro
welcher Assembly-Quellcode für jeden vorhanden ist des Prozessormodells. Sie können einen Blick auf imgur.com/a/KP57m6s werfen oder direkt einen Blick auf die Quelle werfen .Antworten:
Unter Linux (mit einem relativ neuen Kernel) können Sie diese Informationen aus / sys abrufen:
Dieses Verzeichnis verfügt über ein Unterverzeichnis für jede Cache-Ebene. Jedes dieser Verzeichnisse enthält die folgenden Dateien:
Auf diese Weise erhalten Sie mehr Informationen über den Cache, als Sie jemals erhoffen würden, einschließlich der Cacheline-Größe (
coherency_line_size
) sowie der CPUs, die diesen Cache gemeinsam nutzen. Dies ist sehr nützlich, wenn Sie Multithread-Programmierung mit gemeinsam genutzten Daten durchführen (Sie erhalten bessere Ergebnisse, wenn die Threads, die Daten gemeinsam nutzen, auch einen Cache gemeinsam nutzen).quelle
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
kehrt64
in meinem System zurück. Gleiches gilt auch für index1,2,3-Ordner.Unter Linux schauen Sie sich sysconf (3) an.
Sie können es auch über die Befehlszeile mit getconf abrufen:
quelle
Ich habe an einigen Cache-Zeilen gearbeitet und musste eine plattformübergreifende Funktion schreiben. Ich habe es einem Github-Repo unter https://github.com/NickStrupat/CacheLineSize übergeben , oder Sie können einfach die folgende Quelle verwenden. Fühlen Sie sich frei, damit zu tun, was Sie wollen.
quelle
Auf x86 können Sie die verwenden CPUID- Befehl mit Funktion 2 verwenden, um verschiedene Eigenschaften des Caches und des TLB zu bestimmen. Das Parsen der Ausgabe von Funktion 2 ist etwas kompliziert, daher verweise ich Sie auf Abschnitt 3.1.3 der Intel-Prozessoridentifikation und der CPUID-Anweisung (PDF).
Um diese Daten aus C / C ++ - Code abzurufen, müssen Sie Inline-Assemblys, Compiler-Intrinsics oder eine externe Assembly-Funktion aufrufen, um die CPUID-Anweisung auszuführen.
quelle
Wenn Sie SDL2 verwenden, können Sie diese Funktion verwenden:
Dies gibt die Größe der L1-Cache-Zeilengröße in Byte zurück.
Führen Sie auf meinem x86_64-Computer dieses Code-Snippet aus:
Produziert
CacheLineSize = 64
Ich weiß, dass ich etwas spät dran bin, aber nur Informationen für zukünftige Besucher hinzufüge. In der SDL-Dokumentation heißt es derzeit, dass die zurückgegebene Nummer in KB angegeben ist, tatsächlich jedoch in Byte.
quelle
Auf der Windows-Plattform:
von http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx
quelle
ARMv6 und höher hat
C0
oder das Cache Type Register. Es ist jedoch nur im privilegierten Modus verfügbar.Zum Beispiel aus dem technischen Referenzhandbuch für Cortex ™ -A8 :
Gehen Sie nicht davon aus, dass der ARM-Prozessor über einen Cache verfügt (anscheinend können einige ohne einen konfiguriert werden). Die Standardmethode zur Bestimmung ist via
C0
. Aus dem ARM ARM , Seite B6-6:quelle
Sie können auch versuchen, dies programmgesteuert zu tun, indem Sie das Timing messen. Natürlich ist es nicht immer so präzise wie cpuid und dergleichen, aber es ist portabler. ATLAS führt dies in der Konfigurationsphase durch. Vielleicht möchten Sie es sich ansehen:
http://math-atlas.sourceforge.net/
quelle