优化加载到缓存中的数组

时间:2018-03-30 17:22:32

标签: caching profiling

我目前正在尝试更好地了解缓存优化,并阅读了有关该主题的各种文章。我相信我对它有了一个很好的理解,但我需要帮助澄清我的理解。

假设我有两个大型数组,我将要迭代。两者都是连续的数组,我将按顺序迭代它们。在空间上,两个阵列在内存中都没有彼此靠近。对数组执行的操作是for循环,它只是将第二个数组的索引值添加到第一个数组。

int[] someArray; 
int[] someOtherArray; //assume both arrays are initialized with some values and 100 elements 

for(int i = 0; i < someArray.Length; i++)
{
    someArray[i] += someOtherArray[i]; 
}

在这个例子中,当我们得到someArray [i]时,我们最初得到一个缓存未命中,然后当我们加载someOtherArray [i]时,我们得到另一个缓存未命中,但是我正确地假设接下来的8次迭代,所以我们不要因为两个数组的64字节现在应该加载到内存中,所以不会出现L1缓存未命中?

总的来说,缓存是如何工作的?无论何时我访问内存中的一些随机点,它都会随着处理器高速缓存行大小的地址空间被加载到内存中,并且只要我频繁地连续使用这些相同的行,我将不必前往主记忆?

例如,假设我有一个32KB的L1缓存,我在上面进行操作。 200个4字节的整数是600字节,所以它们现在都应该在L1缓存中。如果我用它们做另一个操作,这次乘以该值并将其分配给someOtherArray [i],我将永远不必从主存储器加载值,假设我立即执行操作。

1 个答案:

答案 0 :(得分:1)

分别回答每个问题:

  1. 即可。你是对的,这就是缓存的工作方式。这就是为什么空间局部性加速(在缓存的上下文中)。
  2. 是。
  3. (您的示例)取决于。在这种情况下,可能。
  4. 如果您浏览整个数组,它会为第一个缓存页面提供一些时间。如果您的程序是计算机上唯一运行的程序,那么答案是肯定的,但您必须考虑机器上同时运行其他程序,并且OS调度程序可以随时在它们之间切换。

    可能的情况是,您的流程在执行期间被切换为另一个流程,该流程会填满缓存,然后当您的流程再次获得控制权时,缓存将无法再拥有您的数据。这不太可能与您所讨论的程序和数组的大小有关,但只是表明只要在同一台计算机上运行其他程序,就无法保证缓存。