优化加载到缓存中的数组
Optimizing arrays loaded into cache
我目前正在努力更好地了解缓存优化,并阅读了有关该主题的各种文章。我相信我对它有了一个体面的理解,但我需要帮助来澄清我的理解。
假设我有两个要迭代的大数组。两者都是连续的数组,我将按顺序遍历它们。在空间上,两个数组在内存中都不靠近。对数组执行的操作是一个 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 次迭代左右是否正确我们没有得到 L1 缓存未命中,因为现在应该将两者的 64 字节数组加载到内存中?
一般来说,缓存是这样工作的吗?每当我访问内存中的某个随机点时,它将连同处理器缓存行大小等于地址 space 的任何内容一起加载到内存中,只要我频繁且连续地使用这些相同的行,我就不会必须前往主内存?
比如我有一个32KB的一级缓存,我做了上面的操作。 200 个 4 字节整数是 600 字节,所以它们现在都应该在 L1 缓存中。如果我对它们进行另一个操作,这次将值相乘并将其分配给 someOtherArray[i],我将永远不必从主内存加载值,假设我在之后立即进行操作。
分别回答每个问题:
- 是。你是对的,这就是缓存的工作原理。这就是空间局部性加快速度的原因(在缓存的上下文中)。
- 是。
- (你的例子)取决于。在这种情况下,可能。
如果你遍历整个数组,它会给第一个缓存页面一些时间来逐出。如果你的程序是计算机上唯一的一个运行,那么答案是肯定的,但是你要考虑到机器上同时还有其他程序运行,OS 调度程序可以随时在它们之间切换。
一种可能的情况是,您的进程在执行期间被切换到另一个进程,该进程填满了缓存,然后当您的进程再次获得控制权时,缓存可能不再有您的数据。这不太可能与您正在谈论的程序和数组的大小有关,但只是表明只要同一台计算机上还有其他程序 运行,您就无法保证缓存。
我目前正在努力更好地了解缓存优化,并阅读了有关该主题的各种文章。我相信我对它有了一个体面的理解,但我需要帮助来澄清我的理解。
假设我有两个要迭代的大数组。两者都是连续的数组,我将按顺序遍历它们。在空间上,两个数组在内存中都不靠近。对数组执行的操作是一个 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 次迭代左右是否正确我们没有得到 L1 缓存未命中,因为现在应该将两者的 64 字节数组加载到内存中?
一般来说,缓存是这样工作的吗?每当我访问内存中的某个随机点时,它将连同处理器缓存行大小等于地址 space 的任何内容一起加载到内存中,只要我频繁且连续地使用这些相同的行,我就不会必须前往主内存?
比如我有一个32KB的一级缓存,我做了上面的操作。 200 个 4 字节整数是 600 字节,所以它们现在都应该在 L1 缓存中。如果我对它们进行另一个操作,这次将值相乘并将其分配给 someOtherArray[i],我将永远不必从主内存加载值,假设我在之后立即进行操作。
分别回答每个问题:
- 是。你是对的,这就是缓存的工作原理。这就是空间局部性加快速度的原因(在缓存的上下文中)。
- 是。
- (你的例子)取决于。在这种情况下,可能。
如果你遍历整个数组,它会给第一个缓存页面一些时间来逐出。如果你的程序是计算机上唯一的一个运行,那么答案是肯定的,但是你要考虑到机器上同时还有其他程序运行,OS 调度程序可以随时在它们之间切换。
一种可能的情况是,您的进程在执行期间被切换到另一个进程,该进程填满了缓存,然后当您的进程再次获得控制权时,缓存可能不再有您的数据。这不太可能与您正在谈论的程序和数组的大小有关,但只是表明只要同一台计算机上还有其他程序 运行,您就无法保证缓存。