当顺序迭代数组 1 并为每个元素 1 随机访问另一个数组 2 时,cpu 缓存中会发生什么?
What happens in cpu cache when sequentially iterating over an array 1, and randomly accessing another array 2 for each element 1?
我了解顺序迭代数据如何利用 cpu 缓存。我不明白如何将多个数据集加载到缓存中。在这种情况下,来自阵列 2 的数据是否与阵列 1 一起位于更高级别的缓存中?假设数组 2 可以完全放入 cpu 缓存,但不能放入数组 1;它必须以块的形式加载。
如果仅遍历数组 1,所有级别的缓存都将填充其数据块。但是我不明白当 2 个数据集需要交互时会发生什么,其中一个是非顺序的?
我正在寻找一种将两个数据集都放入缓存 (l2) 的方法,这样我就不必为每次随机访问都访问 RAM,或者如果这不可能,您能解释一下吗?
谢谢。
不会完全加载整个数组,因此它的长度并不重要。当您访问数组的元素时,将加载一个缓存行,其中包含该元素周围内存的副本。在 x86 系统上,缓存行通常为 64 字节。
如果 cpu 预取程序检测到访问模式,它将预取下一个(或两个)缓存行。假设没有其他进程 运行 并且使用你的 L1 缓存,如果预取器能够检测到它们的访问模式,你将有足够的 space 来自两个数组的缓存行。
在您的情况下,如果数组 2 中的访问取决于数组 1 中的值,则不太可能确定数组 2 的访问模式,因为访问不是顺序的。
我了解顺序迭代数据如何利用 cpu 缓存。我不明白如何将多个数据集加载到缓存中。在这种情况下,来自阵列 2 的数据是否与阵列 1 一起位于更高级别的缓存中?假设数组 2 可以完全放入 cpu 缓存,但不能放入数组 1;它必须以块的形式加载。
如果仅遍历数组 1,所有级别的缓存都将填充其数据块。但是我不明白当 2 个数据集需要交互时会发生什么,其中一个是非顺序的?
我正在寻找一种将两个数据集都放入缓存 (l2) 的方法,这样我就不必为每次随机访问都访问 RAM,或者如果这不可能,您能解释一下吗?
谢谢。
不会完全加载整个数组,因此它的长度并不重要。当您访问数组的元素时,将加载一个缓存行,其中包含该元素周围内存的副本。在 x86 系统上,缓存行通常为 64 字节。
如果 cpu 预取程序检测到访问模式,它将预取下一个(或两个)缓存行。假设没有其他进程 运行 并且使用你的 L1 缓存,如果预取器能够检测到它们的访问模式,你将有足够的 space 来自两个数组的缓存行。
在您的情况下,如果数组 2 中的访问取决于数组 1 中的值,则不太可能确定数组 2 的访问模式,因为访问不是顺序的。