这可能是一个非常常见和简单的问题,但我需要对我刚刚从缓存基准测试代码中获得的曲线进行一些解释。这里的目标是找到缓存行大小。我使用了这里的代码: (h**ps://github.com/jiewmeng/cs3210-assign1/blob/master/cache-l1-line.cpp)
这是我在我的机器上运行代码获得的曲线(配备核心 i7 的 Macbook Pro - 缓存行大小为 64 字节 - 一级数据缓存为 32KB)。
The Time vs different stride size curve
- 我认为峰值出现在 128 字节而不是 64 字节上。如果是真的,我想知道为什么?
- 为什么时间减少到 512 字节?
更新:
我还运行了一段代码来确定 L1 和 L2 缓存的大小。这是仅用于记录数据的图。如您所见,在 32KB(L1 缓存大小)和 256KB(L2 缓存大小)中有两个峰值。
问题:
我想知道是否有任何方法可以找到 L3 共享缓存的大小。
谢谢
最佳答案
我猜测 128B 峰值很可能是由于空间预取造成的。您可以在 Intels 的 Optimization guide 中看到, 在第 2.1.5.4 节下
This prefetcher strives to complete every cache line fetched to the L2 cache with the pair line that completes it to a 128-byte aligned chunk
这不会是一个干净的跳转,因为这种预取并不总是触发,即使触发,它也只是预取到 L2 中,但这比从内存中获取要好得多。为确保是这种情况,您可以禁用预取(通过 BIOS 或其他方式,尽管某些系统可能不支持),然后再次检查。
至于 L3 尺寸 - 你没有指定你的确切型号,但我猜你有超过 4M L3 - 保持曲线继续前进,看看它是否跳跃。
编辑
刚刚注意到另一件事 - 您的 k*i 表达式可能在最大范围内溢出 int,这意味着您的访问模式可能不像您预期的那样是循环的。
关于c++ - 缓存行大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613065/