首页 > 解决方案 > 当顺序迭代数组 1 并为每个元素 1 随机访问另一个数组 2 时,cpu 缓存中会发生什么?

问题描述

我了解顺序迭代数据如何利用 cpu 缓存。我不明白如何将多个数据集加载到缓存中。在这种情况下,来自阵列 2 的数据是否与阵列 1 一起在更高级别的缓存中?假设数组 2 可以完全适合 cpu 缓存,但不适合数组 1;它必须以块的形式加载。

如果仅对数组 1 进行迭代,则所有级别的缓存都将填充其数据块。但是我不明白当两个数据集需要交互时会发生什么,其中一个是非顺序的?

我正在寻找一种将两个数据集都保存在缓存(l2​​)中的方法,这样我就不必每次随机访问都去 RAM,或者如果这不可能,你能解释一下吗?

谢谢你。

标签: performanceloopsmemorymemory-managementcpu-cache

解决方案


整个数组不会被完全加载,所以它的长度并不重要。当您访问数组的元素时,将加载一个缓存行,其中包含该元素周围的内存副本。在 x86 系统上,高速缓存行通常是 64 字节。

如果 cpu 预取器检测到访问模式,它将预取下一个缓存行(或两个)。假设没有其他进程正在运行并使用您的 L1 缓存,如果预取器能够检测到两个阵列上的访问模式,您将有足够的空间用于两个阵列的缓存行。

在您的情况下,如果数组 2 中的访问取决于数组 1 中的值,则不太可能确定数组 2 的访问模式,因为访问不是顺序的。


推荐阅读