我在我的电脑上使用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
有什么问题吗?它太混乱了。
答案 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的物理特性。要了解差异,您需要检查内核代码变量在内核代码中的使用方式。