Fra*_*une 8 c c++ linux cpu-architecture cpu-cache
我正在尝试准确描述 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 的此屏幕截图的“缓存”部分基本上是我试图找出的内容:
我在 Windows 上使用GetLogicalProcessorInformation().
但是,在 Linux 上,它似乎sysconf()只给我 L1 和 L2 数据缓存的每核缓存大小(_SC_LEVEL1_DCACHE_SIZE和_SC_LEVEL2_DCACHE_SIZE),或总的 L3 缓存大小(_SC_LEVEL3_CACHE_SIZE)。
编辑: lstopo在 VMWare 下的输出。虚拟机有 8 个内核。L1 和 L2 缓存信息很好,但 L3 缓存大小似乎不正确:
通过打开 (sysfs) 中的文件,可以以编程方式找到缓存层次结构的完整图片/sys。
每个“线程”或“逻辑处理器”由 中的一个子目录表示/sys/devices/system/cpu/。在该目录中,您将找到一个缓存目录。例如,可以在此处找到第一个逻辑处理器的缓存信息:
$ ls /sys/devices/system/cpu/cpu0/cache/
index0
index1
index2
index3
power
uevent
Run Code Online (Sandbox Code Playgroud)
与该逻辑处理器关联的每个高速缓存实体都由一个目录表示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
Run Code Online (Sandbox Code Playgroud)
完整的文档可以在这里找到。
最重要的是,要获得所需的输出,您需要检查shared_cpu_list:
$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list
0,28
Run Code Online (Sandbox Code Playgroud)
这将向您显示哪些逻辑处理器共享此缓存实体。通过检查所有实体 ( /sys/devices/system/cpu/cpu*/cache/index*/) 并使用 消除重复项shared_cpu_list,您可以以编程方式访问所需的所有数据。
请注意,您的虚拟机管理程序不需要传递准确的信息。这只会显示来宾内核看到的缓存层次结构。
| 归档时间: |
|
| 查看次数: |
682 次 |
| 最近记录: |