我在我的 PC 上使用 Ubuntu 12.04 和 intel i5 450。我使用了两种方法来获取一级指令缓存的缓存行大小。但结果不同。
firo@snow:~/ws$ getconf LEVEL1_ICACHE_LINESIZE
32
firo@snow:~/ws$ cat /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size
64
有什么不对?太混乱了。
我在我的 PC 上使用 Ubuntu 12.04 和 intel i5 450。我使用了两种方法来获取一级指令缓存的缓存行大小。但结果不同。
firo@snow:~/ws$ getconf LEVEL1_ICACHE_LINESIZE
32
firo@snow:~/ws$ cat /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size
64
有什么不对?太混乱了。
给定一个 Intel CPU 并假设标准 Linux/glibc 并且没有cpuid
...
getconf
从/报告的缓存值sysconf()
来自 glibc 的 i386/sysconf.c。sysfs 中的那些来自intel_cacheinfo.c。
最明显的区别是 sysfs 只返回来自cpuid
4 的值,而sysconf()
首先查看cpuid
2 并且只检查cpuid
4 如果其中一个字节是0xFF
. sysconf.c 中 0x09 的条目之间存在差异:
{ 0x09, 4, 32, M(_SC_LEVEL1_ICACHE_SIZE), 32768 },
以及Intel® 64 and IA-32 Architectures Software Developer's Manual 的表 3-22 :
09H | 缓存 | 一级指令缓存:32KBytes,4-way set associative,64 byte line size
所以它看起来像 glibc 中的一个错误。
getconf 返回一个内核配置值,其语义由内核代码决定,而 /sys 则返回 cpu 的物理特性。要了解差异,您需要检查内核配置变量在内核代码中的使用方式。