【发布时间】:2019-09-30 11:44:26
【问题描述】:
我知道 std::array 是缓存友好的,因为存储在 std::array 中的所有项目都彼此紧密排列。如果我遍历数组,当我尝试访问一个项目时,CPU 会预取接下来的几个项目。
这就是我的困惑所在:通常 XEON 缓存行是 64 字节:即 8 int64_t 。成像我有
std::array<BigObject, 100>
其中每个 BigObject 的大小为 512 字节。在这种情况下,即使所有 BigObject 项都彼此相邻打包,CPU 也无法做任何聪明的事情:它仍然必须逐行获取缓存,即每个 BigObject 8 行。因此,不应该有任何缓存友好的优势。
那么我的问题是:对于大对象的 std::array,是否还有缓存友好的优势?如果是这样,为什么?
【问题讨论】:
-
请记住,现代 CPU 具有多级缓存,x86 类型 CPU 上的第三个缓存是数兆字节。因此,即使一个对象不适合单个缓存行,它仍然可以在缓存中
-
您到底在寻找什么“洞察力”?显然,C++ 不能对 cpu 架构做任何事情,或者以某种方式将一个大对象缩小为更少的字节数。不幸的是,这将违反我们共享宇宙的几条基本物理定律。因此,目前还不清楚这里到底要问什么。
-
您的 CPU 只会为您使用的字段获取内存。如果您只使用
BigObject的前 64 个字节中的字段,则一个缓存行获取就足够了。如果一个足够智能的编译器(tm)看到你在这样一个数组上循环,它可以插入预取指令,但我不认为这是一个简单的优化。 -
在发布您的第一个问题之前,您应该在 stackoverflow.com 上使用tour,访问help center,并了解How to Ask 问题
-
缓存问题似乎是过早的优化。并非所有缓存都相同。并非所有缓存都像您所猜测的那样工作。
标签: c++ arrays caching cpu-usage cpu-cache