【发布时间】:2012-01-27 01:32:33
【问题描述】:
我正在开发一个系统,用 C++ 编写,在 Linux 上的 Xeon 上运行,它需要尽可能快地运行。在 RAM 中保存了一个超过 10 GB 的大型数据结构(基本上是一个结构数组),并且需要定期访问其中的元素。我想尽可能地修改数据结构以适应系统的缓存机制。
目前,访问大多是在整个结构中随机进行的,每次读取 1-4 个 32 位整数。在同一个地方发生另一次读取之前的时间很长,因此缓存没有任何好处。
现在我知道,当您从 RAM 中的随机位置读取一个字节时,不仅仅是该字节被带入缓存。我的问题是引入了多少字节?是 16、32、64、4096 吗?这叫缓存线吗?
我希望重新设计数据结构,以尽量减少随机 RAM 访问,并使用缓存而不是与之对抗。知道在随机访问时有多少字节被拉入缓存将告知我做出的设计选择。
更新(2014 年 10 月): 在我提出上述问题后不久,该项目就被搁置了。它已经恢复,并且根据下面答案中的建议,我围绕 RAM 访问进行了一些实验,因为 TLB 抖动似乎正在发生。我修改了程序以使用大页面(2MB 而不是标准的 4KB)运行,并观察到小幅加速,大约 2.5%。我找到了有关设置大页面 here 和 here 的大量信息。
【问题讨论】:
-
是的,缓存行。您可以假设 64 字节,直到您弄清楚您拥有数十种 Xeon 处理器型号中的哪一种。 L2 和 L3 缓存也起作用。专注于顺序内存访问,不要假设任何事情。测量。
-
感谢大家的回答。
标签: c++ c performance caching memory