我正在为valgrind中的cachegrind/callgrind工具组建一个小补丁,该补丁将使用完全通用的代码自动检测CPU指令和缓存配置(目前只有x86/x64自动配置,其他架构不提供CPUID类型配置给非特权代码)。此代码需要完全在非特权上下文中执行,即纯用户模式代码。它还需要在非常不同的POSIX实现之间进行移植,因此无法使用grokking /proc/cpuinfo,因为我们的某些目标系统没有这样的东西。
使用100%通用的POSIX代码可以检测CPU频率、缓存数量、大小甚至缓存行大小,其中没有任何CPU特定的操作码(只有许多合理的假设,例如,如果没有内存或寄存器依赖关系停顿,则将两个数字相加可能会在单个周期中执行)。这部分相当简单。
我询问StackOverflow的原因是如何检测给定缓存的缓存行关联性,这并不那么简单。关联性是缓存中可以包含来自主存储器的给定缓存行的位置数量。我可以看到L1缓存的关联性可以被检测出来,但是L2缓存呢?肯定会受到L1关联性的影响吧?
我知道这可能是一个无法解决的问题。但我将其提交到StackOverflow上,希望有人知道我不知道的东西。请注意,如果我们在这里失败,我将仅仅硬编码一个默认的四路关联性,假设这不会对结果产生太大影响。
谢谢, Niall
使用100%通用的POSIX代码可以检测CPU频率、缓存数量、大小甚至缓存行大小,其中没有任何CPU特定的操作码(只有许多合理的假设,例如,如果没有内存或寄存器依赖关系停顿,则将两个数字相加可能会在单个周期中执行)。这部分相当简单。
我询问StackOverflow的原因是如何检测给定缓存的缓存行关联性,这并不那么简单。关联性是缓存中可以包含来自主存储器的给定缓存行的位置数量。我可以看到L1缓存的关联性可以被检测出来,但是L2缓存呢?肯定会受到L1关联性的影响吧?
我知道这可能是一个无法解决的问题。但我将其提交到StackOverflow上,希望有人知道我不知道的东西。请注意,如果我们在这里失败,我将仅仅硬编码一个默认的四路关联性,假设这不会对结果产生太大影响。
谢谢, Niall