首页 > 解决方案 > 访问数组的连续元素时会发生什么类型的缓存未命中?

问题描述

在 C 中,f 你有这种类型的循环:

for (i = 0; i < N; i++)
  sum += a[i]

其中数组“a”包含整数(4 个字节),一个缓存块可以存储 32 个字节,那么我知道每 8 次循环迭代都会有一个冷缺失,因为处理器会将 8 个整数加载到一个块中,然后在第 9 次迭代之前不会出现缓存未命中。我是否理解正确,当它在 a[0] 处发生缓存未命中时,它会将 a[0]-a[7] 加载到缓存块中,并且不会再次将任何“a”加载到缓存中,直到它得到[8] 的另一个冷小姐?

假设 ^^ 是正确的,我真正的问题是,如果你有这样的事情会发生什么:

for (i = 0; i < N; i++)
      a[i] = a[i+1]

'a' 没有被初始化?你会得到与上面类似的东西吗,处理器会查找 a[i+1] 的每个连续值并且每 8 次才错过一次?或者它是否也在缓存中搜索 a[i] 以设置值?是否会有与 a[i] 或仅 a[i+1] 相关的缓存未命中?

最后,如果你有

for (i = 0; i < N; i++)
      b[i] = a[i]

这是否类似于第一个示例,它查找 a[i] 的每个值并在每 8 次迭代时获取缓存未命中,或者设置 b[i] 的值是否也会导致缓存未命中?

谢谢!

标签: ccaching

解决方案


这取决于 asm 代码,您应该阅读它并查看您的程序是先读取 a[i] 还是先读取 a[i+1]。


推荐阅读