我正在尝试使用 VsPerfCmd.exe 来分析检测本机应用程序中的分支预测错误和最后一级缓存未命中。
设置就像在tin上所说的那样工作,但我得到的结果似乎并不明智。例如,一个总是接触 24MB 数据集的函数被报告为在被调用 ~2000 次时只会导致 ~700 次缓存未命中。现在让我考虑一下 - 该函数线性遍历两个 12 字节元素的 1024*1024 元素数组。对于每个元素,它随机决定是否需要它之前或之后的元素 1024 个索引的信息。这意味着为了不产生任何高速缓存未命中,CPU 必须始终在高速缓存中拥有至少三个 1024*12 字节的部分。此外,在每次迭代之后,该过程使用 sleep() 产生 CPU 大约 8 毫秒。我无法想象任何硬件预取器做得这么好。
这种愚蠢的数据量怎么不会产生比 VsPerfCmd 说的更多的最后一级缓存未命中?尽管我的 i7 有 8MB 的共享 L3 缓存,但这似乎不太可能。任何人都可以分享他们对这里可能发生的事情的看法吗?当然,“VsPerfCmd.exe 糟透了”将是一个有效的答案,但如果有人要这么说,我至少想听听有人有类似的经历作为这个断言的基础。