我正在开发一个用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的详细信息。
答案 0 :(得分:8)
今天的CPU以(通常)64字节(称为缓存行)的块为单位获取内存。当您读取特定的内存位置时,整个缓存行将从主内存中提取到缓存中。
更多信息:http://igoro.com/archive/gallery-of-processor-cache-effects/
答案 1 :(得分:3)
任何当前Xeon处理器的高速缓存行为64字节。您可能想要考虑的另一件事是TLB。如果你真的在10GB内存中进行随机访问,那么你很可能会有很多TLB未命中,这可能与缓存未命中一样昂贵。您可以使用大页面进行解决,但这是需要牢记的。
答案 2 :(得分:2)
旧的SO问题有一些可能对您有用的信息(特别是第一个答案在哪里寻找Linux CPU信息 - 响应者没有提到正确的行大小,但在关联性等基础上的'其他信息' )。问题是x86,但答案更为一般。值得一看。
Where is the L1 memory cache of Intel x86 processors documented?
答案 3 :(得分:1)
您可能希望转到http://agner.org/optimize/并获取那里提供的优化PDF - 那里有很多好的(低级别)信息。非常注重汇编语言水平,但也有为C / C ++程序员学习的经验教训。
第3卷,“英特尔,AMD和威盛CPU的微架构”应引起关注: - )
答案 4 :(得分:1)
关于组织数据结构以便从GNU的libc维护者考虑缓存和RAM层次结构的好(长篇)文章:https://lwn.net/Articles/250967/(完整的PDF文件:http://www.akkadia.org/drepper/cpumemory.pdf)