c++之在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

52php 阅读:41 2025-02-15 21:57:57 评论:0

我正在尝试准确描述 Linux 上当前 CPU 的数据缓存层次结构:不仅是单个 L1/L2/L3(可能还有 L4)数据缓存的大小,还有它们拆分或共享的方式核心。

例如,在我的 CPU(AMD Ryzen Threadripper 3970X)上,每个内核都有自己的 32 KB 的 L1 数据缓存和 512 KB 的 L2 缓存,但是 L3 缓存在一个核心复合体 (CCX) 内的内核之间共享。换句话说,有 8 个不同的 L3 缓存,每个 16 MB。

Windows 上 CPU-Z 的此屏幕截图的“缓存”部分基本上是我试图找出的内容:



我可以通过 GetLogicalProcessorInformation() 在 Windows 上获取这些信息。 .

但是,在 Linux 上,似乎 sysconf()只给我 L1 和 L2 数据缓存的每核缓存大小( _SC_LEVEL1_DCACHE_SIZE_SC_LEVEL2_DCACHE_SIZE ),或总的 L3 缓存大小( _SC_LEVEL3_CACHE_SIZE )。

编辑:lstopo 的输出 在VMWare下 .虚拟机有 8 个内核。 L1 和 L2 缓存信息很好,但 L3 缓存大小似乎不正确:

请您参考如下方法:

可以通过在 /sys 中打开文件以编程方式找到缓存层次结构的完整图片。 (系统文件)。

每个“线程”或“逻辑处理器”由 /sys/devices/system/cpu/ 中的子目录表示。 .在该目录中,您将找到一个缓存目录。例如,可以在此处找到第一个逻辑处理器的缓存信息:

$ ls /sys/devices/system/cpu/cpu0/cache/ 
index0 
index1 
index2 
index3 
power 
uevent 

与该逻辑处理器关联的每个缓存实体由 index[0-9]* 表示。目录。 index后面的数字不代表级别。相同的缓存实体可能会在不同的逻辑处理器下多次列出。在这些目录中,您可以找到缓存实体的所有属性(级别、集、行大小等)。
$ ls /sys/devices/system/cpu/cpu0/cache/index0 
coherency_line_size 
level 
number_of_sets 
physical_line_partition 
power 
shared_cpu_list 
shared_cpu_map 
size 
type 
uevent 
ways_of_associativity 

可以找到完整的文档 here .

最重要的是,要获得您想要的输出,您需要检查 shared_cpu_list :
$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list 
0,28 

这将显示哪些逻辑处理器共享此缓存实体。通过检查所有实体 ( /sys/devices/system/cpu/cpu*/cache/index*/ ),并使用 shared_cpu_list 消除重复项,您可以以编程方式访问您需要的所有数据。

请注意,您的管理程序不需要传递准确的信息。这只会向您显示 guest 内核看到的缓存层次结构。


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号