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,但答案更一般。 值得一看。

英特尔x86处理器的L1内存缓存在哪里记录?

链接地址: http://www.djcxy.com/p/36353.html

上一篇: How many bytes does a Xeon bring into the cache per memory access?

下一篇: Approximate cost to access various caches and main memory?