【问题标题】:Why does this code generates a cache hit many times?为什么这段代码会多次生成缓存命中?
【发布时间】:2017-02-06 22:03:17
【问题描述】:

我了解缓存命中和未命中的概念,但不知何故我并没有真正理解代码示例。下面的代码应该会生成很多 catch Hits,但是为什么呢?我们在哪一部分看到了这一点?我们现在怎么知道这段代码大部分时间会在缓存中找到数据呢?

char array[1000]; 
for ( int i=0; i<1000; i++ ){ 
printf("%d ", array[i]); 
}

【问题讨论】:

  • 如果您了解缓存的工作原理以及何时发生命中和未命中,那应该是显而易见的。如果不是,您应该阅读有关缓存的更多信息,并尝试思考它的作用以及代码的作用。在纸上画一个缓存并播放它。
  • 由于您以顺序方式访问元素并且项目是连续的,因此缓存可以发挥最佳作用,因为它旨在做到这一点。
  • 创建一个大数组,并访问彼此相距很远的元素。 0 索引然后 10000 然后 20000 然后 30000,... 或随机。
  • 可能不会。索引 4 在缓存中,因为您最近访问了索引 2。
  • 这在很大程度上取决于您非常具体的缓存实现。缓存可以有不同的缓存线大小和不同的机制来查找缓存线。

标签: c caching hardware memory-access


【解决方案1】:

给定的代码是参考的空间局部性的完美示例,因为array[i] 以连续和前向的方式访问。根据Wikipedia

空间局部性

如果在特定时间引用了特定存储位置, 那么很可能会引用附近的内存位置 不久的将来。在这种情况下,通常会尝试猜测 当前参考周围区域的大小和形状 值得准备更快的访问。

您可能还注意到,i 变量具有时间局部性,在这种情况下,optimizing compiler 很可能会将其放入 CPU 寄存器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2016-07-23
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2020-10-16
    • 2023-04-06
    相关资源
    最近更新 更多