performance - 当顺序迭代数组 1 并为每个元素 1 随机访问另一个数组 2 时,cpu 缓存中会发生什么?
问题描述
我了解顺序迭代数据如何利用 cpu 缓存。我不明白如何将多个数据集加载到缓存中。在这种情况下,来自阵列 2 的数据是否与阵列 1 一起在更高级别的缓存中?假设数组 2 可以完全适合 cpu 缓存,但不适合数组 1;它必须以块的形式加载。
如果仅对数组 1 进行迭代,则所有级别的缓存都将填充其数据块。但是我不明白当两个数据集需要交互时会发生什么,其中一个是非顺序的?
我正在寻找一种将两个数据集都保存在缓存(l2)中的方法,这样我就不必每次随机访问都去 RAM,或者如果这不可能,你能解释一下吗?
谢谢你。
解决方案
整个数组不会被完全加载,所以它的长度并不重要。当您访问数组的元素时,将加载一个缓存行,其中包含该元素周围的内存副本。在 x86 系统上,高速缓存行通常是 64 字节。
如果 cpu 预取器检测到访问模式,它将预取下一个缓存行(或两个)。假设没有其他进程正在运行并使用您的 L1 缓存,如果预取器能够检测到两个阵列上的访问模式,您将有足够的空间用于两个阵列的缓存行。
在您的情况下,如果数组 2 中的访问取决于数组 1 中的值,则不太可能确定数组 2 的访问模式,因为访问不是顺序的。
推荐阅读
- regex - tshark 转储的 sed 过滤:加速
- sql - SQL 视图中的聚合或类似函数
- entity-framework - 建立关系的惯例
- javascript - nodejs:SyntaxError:意外的标识符
- python - plt.legend() 阻止 matplotlib 显示绘图
- sql-server - SQL Server 中的 Windows 组
- c# - Android 未从 LocalApplicationDirectory 加载字体
- visual-studio - 项目中缺少的文件夹,即使在使用显示所有文件后也不显示
- sql - 如何使用 Transact-SQL (t-sql) 删除尾随字符?
- nosql - 无法在 ArangoDB 中声明变量