我正在开发一个用C++编写的系统,运行在Linux上的Xeon上,这个系统需要尽可能快地运行。RAM中有一个大的数据结构(基本上是一个结构数组),超过10 GB,需要定期访问它的元素。我希望尽可能地修改数据结构以使用系统的缓存机制。
目前,访问大多是随机跨结构进行的,每次读取1-4 32位ints时都是随机的.在同一位置进行另一次读取需要很长时间,因此缓存没有好处。
现在我知道了,当您从RAM中的随机位置读取一个字节时,不仅仅是将这个字节带入缓存中。我的问题是引入多少字节?是16,32,64,4096吗?这叫缓存线吗?
我希望重新设计数据结构,以减少随机RAM访问,并使用缓存而不是它。知道在随机访问中有多少字节被拖入缓存,将告诉我所做的设计选择。
更新(2014年10月):在我提出上述问题后不久,项目被搁置。从那以后,它又恢复了,并根据下面答案中的建议,我进行了一些关于RAM访问的实验,因为似乎有可能发生了TLB重击。我对程序进行了修改,使其运行了巨大的页面(2MB而不是标准的4KB),并观察到一个小的加速,大约2.5%。我找到了关于设置大型页面的很好的信息-- 这里和这里。
发布于 2011-12-23 20:31:34
今天的CPU以块(通常)64个字节(称为缓存行)来获取内存。当您读取特定的内存位置时,整个缓存行将从主内存中提取到缓存中。
这里有更多信息:http://igoro.com/archive/gallery-of-processor-cache-effects/
发布于 2011-12-23 23:12:24
任何当前Xeon处理器的缓存行为64字节。您可能需要考虑的另一件事是TLB。如果您确实是在对10 be内存进行随机访问,那么您可能会有很多TLB错误,这可能与缓存丢失一样昂贵。你可以使用大页面来完成工作,但要记住这一点。
发布于 2011-12-23 20:55:19
老的问题,有一些信息,可能对你有用(特别是第一个答案寻找Linux信息-响应没有提到线的大小适当,而是‘其他信息’之上的联想等)。问题是针对x86的,但答案更笼统。值得一看。
https://stackoverflow.com/questions/8620303
复制相似问题