cpu 缓存在访问多个数组时做什么?
What cpu cache does while accessing multiple arrays?
假设我们有 2 个巨大的数组 (20MB+),并且我们这样做:
for(int i = 0; i < length; i++) {
arrayA[i] = 13;
arrayB[i] = 13;
}
这将如何加载到缓存中?
何时从缓存中卸载?
CPU 缓存老实说有点善变,但是有一些方法可以改进缓存,为了不惜一切代价避免多维数组和嵌套向量,CPU 缓存讨厌这些,也避免任何类型的链表,或者我喜欢称它们为菊花链类型,例如链表、unorderedmap 和其他标准容器,它们不会直接存储在内存中,因此 CPU 不会缓存它,如果你想使用输入安全平面数组,或使用 std 数组,或走老路,简单地使用 C 样式数组,这些都是平面容器,大多数时候会在 CPU 缓存中有空间时被缓存,有很多更多关于 CPU 缓存,但这只是一个非常非常基本的洞察,关于在缓存方面容器方面什么和什么不能使用,GameDev net 和其他网站上有一些非常好的文章,如果你上 google 并搜索 c++ 缓存友好代码,
所以简单地说你当前的代码将不会被缓存....我不会说永远不会因为 CPU 这些天变得非常好,但是缓存不会有利于你的代码并且会选择只在需要时从内存中调用它,这在某些情况下会影响您的性能,
希望这能说明一些问题 (=
假设我们有 2 个巨大的数组 (20MB+),并且我们这样做:
for(int i = 0; i < length; i++) {
arrayA[i] = 13;
arrayB[i] = 13;
}
这将如何加载到缓存中? 何时从缓存中卸载?
CPU 缓存老实说有点善变,但是有一些方法可以改进缓存,为了不惜一切代价避免多维数组和嵌套向量,CPU 缓存讨厌这些,也避免任何类型的链表,或者我喜欢称它们为菊花链类型,例如链表、unorderedmap 和其他标准容器,它们不会直接存储在内存中,因此 CPU 不会缓存它,如果你想使用输入安全平面数组,或使用 std 数组,或走老路,简单地使用 C 样式数组,这些都是平面容器,大多数时候会在 CPU 缓存中有空间时被缓存,有很多更多关于 CPU 缓存,但这只是一个非常非常基本的洞察,关于在缓存方面容器方面什么和什么不能使用,GameDev net 和其他网站上有一些非常好的文章,如果你上 google 并搜索 c++ 缓存友好代码,
所以简单地说你当前的代码将不会被缓存....我不会说永远不会因为 CPU 这些天变得非常好,但是缓存不会有利于你的代码并且会选择只在需要时从内存中调用它,这在某些情况下会影响您的性能,
希望这能说明一些问题 (=