Ich versuche, eine genaue Beschreibung der Datencache-Hierarchie der aktuellen CPU unter Linux zu erhalten: nicht nur die Größe der einzelnen L1 / L2 / L3- (und möglicherweise L4-) Datencaches, sondern auch die Art und Weise, wie sie aufgeteilt oder gemeinsam genutzt werden Kerne.
Auf meiner CPU (AMD Ryzen Threadripper 3970X) verfügt beispielsweise jeder Kern über einen eigenen 32-KB-L1-Datencache und einen 512-KB-L2-Cache. Der L3-Cache wird jedoch von mehreren Kernen innerhalb eines Kernkomplexes (CCX) gemeinsam genutzt. Mit anderen Worten, es gibt 8 verschiedene L3-Caches mit jeweils 16 MB.
Der Abschnitt "Cache" dieses Screenshots von CPU-Z unter Windows ist im Grunde das, was ich herausfinden möchte:
Ich habe kein Problem damit, diese Informationen unter Windows zu erhalten GetLogicalProcessorInformation()
.
Unter Linux scheint es jedoch sysconf()
nur die Cache-Größe pro Kern für L1- und L2-Datencaches ( _SC_LEVEL1_DCACHE_SIZE
und _SC_LEVEL2_DCACHE_SIZE
) oder die gesamte L3-Cache-Größe ( _SC_LEVEL3_CACHE_SIZE
) zu geben.
BEARBEITEN: Die Ausgabe von lstopo unter VMWare . Die virtuelle Maschine verfügt über 8 Kerne. Die L1- und L2-Cache-Informationen sind in Ordnung, aber die L3-Cache-Größe scheint nicht korrekt zu sein:
sysconf()
. Wie kann man sie verstehen, wenn wir nicht wissen, ob Caches geteilt werden oder nicht?cpuid
Anweisung selbst auf dieser ISA verwenden und möglicherweise sogar einige Details zum Cache-Layout pro Modell einbetten. IDK, wie detailliert die verschiedenen CPUID-Blätter wie sandpile.org/x86/cpuid.htm#level_0000_0004h darstellen können.lstopo
Linux auf Bare Metal ausprobieren ? (zB einen Live-USB booten). Ihr falsches Ergebnis könnte die Schuld der VM sein, daher sollten wir dies ausschließen. Es überrascht nicht, dass es auf meinem i7-6700k-Desktop wie erwartet funktioniert und alle 4 Kerne im selben Paket zeigt, die sich einen L3-Cache teilen. Die Intel Sandybridge-Familie ist jedoch die am weitesten verbreitete und nicht kürzlich geänderte Serie von x86-CPUs.lstopo
auch für Windows verfügbar ist .lstopo
Verwenden Sie diecpuid
Anweisung (und möglicherweise die ACPI-SRAT
Tabelle).cpuid
ist relativ einfach zu bedienen, aber Intel und AMD unterscheiden sich in diesem Aspekt stark.hwloc
(zu demlstopo
gehört) verfügt über eine API-Schnittstelle, über die Sie die Cache-Topologie sowohl unter Windows als auch unter Linux abrufen können.Antworten:
Ein vollständiges Bild der Cache-Hierarchie finden Sie programmgesteuert, indem Sie Dateien in
/sys
(sysfs) öffnen .Jeder "Thread" oder "logische Prozessor" wird durch ein Unterverzeichnis in dargestellt
/sys/devices/system/cpu/
. In diesem Verzeichnis finden Sie ein Cache-Verzeichnis. Cache-Informationen für den ersten logischen Prozessor finden Sie beispielsweise hier:Jede diesem logischen Prozessor zugeordnete Cache-Entität wird durch ein
index[0-9]*
Verzeichnis dargestellt. Die Zahl nach dem Index repräsentiert nicht die Ebene. Dieselbe Cache-Entität kann mehrfach unter verschiedenen logischen Prozessoren aufgelistet werden. In diesen Verzeichnissen finden Sie alle Eigenschaften der Cache-Entität (Ebene, Mengen, Zeilengröße usw.).Die vollständige Dokumentation finden Sie hier .
Um die gewünschte Ausgabe zu erhalten, müssen Sie vor allem Folgendes überprüfen
shared_cpu_list
:Dies zeigt Ihnen, welche logischen Prozessoren diese Cache-Entität gemeinsam nutzen. Durch Überprüfen aller Entitäten (
/sys/devices/system/cpu/cpu*/cache/index*/
) und Entfernen von Duplikaten mitshared_cpu_list
können Sie programmgesteuert auf alle benötigten Daten zugreifen.Beachten Sie, dass Ihr Hypervisor keine genauen Informationen weitergeben muss. Dies zeigt Ihnen nur die Cache-Hierarchie, wie sie der Gastkern sieht.
quelle