繁体   English   中英

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

[英]Programmatically get accurate CPU cache hierarchy information on Linux

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

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

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

CPU-Z 截图

使用GetLogicalProcessorInformation()获取有关 Windows 的这些信息没有问题。

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

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

lstopo 截图

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

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

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

与该逻辑处理器关联的每个缓存实体由index[0-9]*目录表示。 索引后的数字不代表级别。 相同的缓存实体可能在不同的逻辑处理器下多次列出。 在这些目录中,您可以找到缓存实体的所有属性(级别、集合、行大小等)。

$ 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

完整的文档可以在这里找到。

最重要的是,要获得您想要的 output,您需要检查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消除重复项,您可以以编程方式访问您需要的所有数据。

请注意,您的管理程序不需要传递准确的信息。 这只会向您显示缓存层次结构,因为来宾 kernel 看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM