4

我在我的 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

有什么不对?太混乱了。

4

2 回答 2

2

给定一个 Intel CPU 并假设标准 Linux/glibc 并且没有cpuid...

getconf从/报告的缓存值sysconf()来自 glibc 的 i386/sysconf.c。sysfs 中的那些来自intel_cacheinfo.c

最明显的区别是 sysfs 只返回来自cpuid4 的值,而sysconf()首先查看cpuid2 并且只检查cpuid4 如果其中一个字节是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 中的一个错误。

于 2013-08-25T02:26:02.357 回答
0

getconf 返回一个内核配置值,其语义由内核代码决定,而 /sys 则返回 cpu 的物理特性。要了解差异,您需要检查内核配置变量在内核代码中的使用方式。

于 2012-07-21T03:07:49.167 回答