我正在为valgrind 中的 cachegrind/callgrind 工具制作一个小补丁,该补丁将使用完全通用的代码、CPU 指令和缓存配置进行自动检测(现在只有 x86/x64 自动配置,其他架构不提供CPUID 类型配置到非特权代码)。该代码将需要完全在非特权上下文中执行,即纯用户模式代码。它还需要在非常不同的 POSIX 实现中可移植,所以 grokking /proc/cpuinfo 不会做,因为我们的目标系统之一没有这样的东西。
检测 CPU 的频率、缓存的数量、它们的大小,甚至缓存行大小都可以使用 100% 通用 POSIX 代码完成,它没有任何特定于 CPU 的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖停顿,可能会在一个周期内执行)。这部分相当简单。
什么不是那么简单,为什么我问 StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是高速缓存中有多少位置可以包含来自主存储器的给定高速缓存行。我可以看到可以检测到 L1 缓存关联性,但是 L2 缓存呢?L1 关联性肯定会妨碍吗?
我很欣赏这可能是一个无法解决的问题。但我把它扔到 StackOverflow 上,希望有人知道我不知道的事情。请注意,如果我们在这里失败,我将简单地以四种方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响。
谢谢,
尼尔