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

Ran*_*ook 12 c c++ memory performance caching

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

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

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

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

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

Sof*_*ner 8

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

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