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

10-15 04:13