每个内存访问Xeon带入缓存的字节数是多少?

我正在开发一个用C ++编写的系统,在Linux上的Xeon上运行,需要尽可能快地运行。 在RAM中保存的大型数据结构(基本上是结构数组)超过10 GB,并且需要定期访问它的元素。 我想修改数据结构以尽可能地使用系统的缓存机制。

目前,访问大多是在整个结构中随机进行的,每次读取1-4个32位的整数。 在另一次读取发生在同一个地方之前很长一段时间,因此缓存没有任何好处。

现在我知道当你从RAM中的随机位置读取一个字节时,不仅仅是那个字节被带入缓存。 我的问题是引入了多少字节? 是16,32,64,4096吗? 这被称为缓存线吗?

我希望重新设计数据结构,以最大限度地减少随机RAM访问,并使用缓存而不是缓存。 知道在随机访问中将多少字节拉入缓存将告知我所做的设计选择。

更新(2014年10月):在我提出上述问题后不久,该项目被搁置。 它已经恢复并基于下面答案中的建议,我进行了一些围绕RAM访问的实验,因为似乎TLB捶打可能正在发生。 我修改了程序以运行大页面(2MB而不是标准的4KB),观察到一个小的加速,大约2.5%。 我找到了关于在这里和这里设置大页面的很好的信息。

今天的CPU以(通常)64字节的块(称为缓存行)获取内存。 当您读取特定的内存位置时,整个缓存行将从主内存中提取到缓存中。

更多信息: http : //igoro.com/archive/gallery-of-processor-cache-effects/

任何当前Xeon处理器的高速缓存行为64字节。 您可能想要考虑的另一件事是TLB。 如果你真的在10GB内存中进行随机访问,那么你很可能会有很多TLB未命中,这可能与缓存未命中一样昂贵。 您可以使用大页面进行解决,但这是需要牢记的。

旧的SO问题,有一些可能对你有用的信息(特别是第一个答案在哪里寻找Linux CPU信息 – 响应者没有提到正确的行大小,但在关联性之上的’其他信息’等)。 问题是针对x86,但答案更为一般。 值得一看。

记录了Intel x86处理器的L1内存缓存在哪里?

你可能想要访问http://agner.org/optimize/并获取那里可用的优化PDF – 那里有很多好的(低级)信息。 非常注重汇编语言水平,但也有为C / C ++程序员学习的经验教训。

第3卷“英特尔,AMD和威盛CPU的微架构”应引起关注:-)

关于组织数据结构以便从GNU的libc维护者考虑缓存和RAM层次结构的好(长篇)文章: https : //lwn.net/Articles/250967/ (完整的PDF文件: http : //www.akkadia.org/drepper /cpumemory.pdf )