c++ - 缓存行大小

标签 c++ performance caching benchmarking cpu-architecture

这可能是一个非常常见和简单的问题,但我需要对我刚刚从缓存基准测试代码中获得的曲线进行一些解释。这里的目标是找到缓存行大小。我使用了这里的代码: (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 共享缓存的大小。

Cache size figure .

谢谢

最佳答案

我猜测 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/

相关文章:

c++ - C++ 有安全的导航运算符吗?

c - 哪种 MCU(Cortex-M) 适用于时间关键的 GPIO 应用?

java - Spring中缓存方法最简单/最透明的方式是什么?

caching - 告诉浏览器不要缓存的正确方法是什么?

c++ - OpenCV:如何在文件中存储描述符?

c++ - vector 类如何接受多个参数并从中创建一个数组?

c++ - 如何在 C++ 中检查对象的类?

c++ - 无竞争线程锁的实际成本

java - java中如何避免在循环中频繁创建对象?

caching - 在哪种特定情况下,只读数据缓存优于全局内存访问?