我在我的 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:
所以它看起来像是 glibc 中的一个错误。
关于cpu-cache - 获取 2 种不同的 L1 icache 行大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11589043/