获得2种不同的L1 icache线条尺寸

时间:2012-07-21 02:37:39

标签: cpu-cache

我在我的电脑上使用Ubuntu 12.04和intel i5 450。 我使用两种方法来获取1级指令缓存的缓存行大小。 但结果不同。

firo@snow:~/ws$ getconf LEVEL1_ICACHE_LINESIZE

32


firo@snow:~/ws$ cat /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size 

64

有什么问题吗?它太混乱了。

2 个答案:

答案 0 :(得分:1)

鉴于英特尔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路组关联,64字节行大小

所以它看起来像glibc中的一个错误。

答案 1 :(得分:0)

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