Xeon每次访问内存时会将多少字节带入缓存? 我正在使用C++编写的一个系统,运行在Linux上的Xeon上,需要尽可能快地运行。RAM中有一个超过10GB的大型数据结构(基本上是一个结构数组),需要定期访问其中的元素。我想修改数据结构,以便尽可能多地使用系统的缓存机制

Xeon每次访问内存时会将多少字节带入缓存? 我正在使用C++编写的一个系统,运行在Linux上的Xeon上,需要尽可能快地运行。RAM中有一个超过10GB的大型数据结构(基本上是一个结构数组),需要定期访问其中的元素。我想修改数据结构,以便尽可能多地使用系统的缓存机制,c++,c,performance,caching,memory,C++,C,Performance,Caching,Memory,目前,访问主要是在整个结构中随机进行的,每次读取1-4个32位整数。在同一个地方发生另一次读取需要很长时间,因此缓存没有任何好处 现在我知道,当您从RAM中的随机位置读取一个字节时,不仅仅是该字节会被带到缓存中。我的问题是引入了多少字节?是16、32、64、4096吗?这叫做缓存线吗 我希望重新设计数据结构,以尽量减少随机RAM访问,并使用缓存,而不是针对它。知道在随机访问时有多少字节被拉入缓存将通知我所做的设计选择 更新(2014年10月): 在我提出上述问题后不久,该项目被搁置。它已经恢复了

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

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

我希望重新设计数据结构,以尽量减少随机RAM访问,并使用缓存,而不是针对它。知道在随机访问时有多少字节被拉入缓存将通知我所做的设计选择

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

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


这里有更多信息:

旧的SO问题,其中包含一些可能对您有用的信息(特别是第一个关于在哪里查找Linux CPU信息的答案-responder没有提到正确的行大小,而是在关联性之上的“其他信息”等)。问题是针对x86的,但答案更一般。值得一看


任何当前Xeon处理器的缓存线都是64字节。您可能还需要考虑的另一件事是TLB。如果您真的要跨10GB内存进行随机访问,那么很可能会发生大量TLB未命中,其成本可能与缓存未命中一样高。你可以在大页面上找到工作,但要记住这一点。

你可能想去那里获取可用的优化PDF,那里有很多好的(低级)信息。我们非常关注汇编语言级别,但C/C++程序员也需要吸取教训


第3卷,“英特尔、AMD和VIA CPU的微体系结构”应该引起人们的兴趣:-)

关于组织数据结构以考虑缓存和RAM层次结构的好(长)文章,来自GNU的libc维护人员:(这里是完整的PDF:)

是的,缓存线。您可以假设64个字节,直到您确定了几十种Xeon处理器型号中的哪一种。二级缓存和三级缓存也起作用。关注顺序内存访问,不要做任何假设。测量。感谢大家的回答。有关链接问题的有用提示,@gnometorule+加布里埃尔,你能再详细说明一下吗?TLB代表什么,大页面有什么帮助?翻译Lookaside缓冲区-它们参与了降低硬件分页速度(长话短说,谷歌:)。一个页面,一个TLB条目-如果将内存映射为大页面(4meg或2meg,取决于CPU模式),则需要的TLB条目比普通页面(4kbyte)少。TLB代表“转换查找缓冲区”。当访问内存时,必须将虚拟地址转换为物理地址。这是在页面粒度上完成的,x86的典型页面大小是4KB。TLB缓存从虚拟地址到物理地址的转换,但它是一个相对较小的结构(大约200个条目);TLB未命中可能比缓存未命中成本更高。数据结构实际上是一组结构数组。每个阵列大约为200 MB,分配在共享内存中。这对TLB失误有帮助吗?