【问题标题】:How many bytes does a Xeon bring into the cache per memory access?Xeon 每次内存访问会将多少字节带入缓存?
【发布时间】:2012-01-27 01:32:33
【问题描述】:

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

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

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

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

更新(2014 年 10 月): 在我提出上述问题后不久,该项目就被搁置了。它已经恢复,并且根据下面答案中的建议,我围绕 RAM 访问进行了一些实验,因为 TLB 抖动似乎正在发生。我修改了程序以使用大页面(2MB 而不是标准的 4KB)运行,并观察到小幅加速,大约 2.5%。我找到了有关设置大页面 herehere 的大量信息。

【问题讨论】:

  • 是的,缓存行。您可以假设 64 字节,直到您弄清楚您拥有数十种 Xeon 处理器型号中的哪一种。 L2 和 L3 缓存也起作用。专注于顺序内存访问,不要假设任何事情。测量。
  • 感谢大家的回答。

标签: c++ c performance caching memory


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    包含一些可能对您有用的信息的旧 SO 问题(特别是在哪里寻找 Linux CPU 信息的第一个答案 - 响应者没有提到适当的行大小,而是在关联性等之上的“其他信息” )。问题是针对 x86 的,但答案更笼统。值得一看。

    Where is the L1 memory cache of Intel x86 processors documented?

    【讨论】:

    • 关于链接问题的有用提示,@gnometorule。 +1。
    【解决方案3】:

    任何当前 Xeon 处理器的高速缓存行都是 64 字节。您可能要考虑的另一件事是 TLB。如果您真的在 10GB 内存上进行随机访问,那么您可能会遇到很多 TLB 未命中,这可能与缓存未命中一样昂贵。您可以处理大页面,但请记住这一点。

    【讨论】:

    • 能否进一步详细说明,@Gabriel? TLB 代表什么,大页面有什么帮助?
    • Translate Lookaside Buffers - 他们参与降低硬件分页速度(长话短说,google :))。一页,一个 TLB 条目 - 如果将内存映射到比普通页面(4kbyte)大(4meg 或 2meg,取决于 CPU 模式)的内存,则需要更少的 TLB 条目。
    • TLB 代表“翻译后备缓冲区”。当您访问内存时,您必须将虚拟地址转换为物理地址。这是在页面粒度上完成的,x86 的典型页面大小为 4KB。 TLB 缓存从虚拟地址到物理地址的转换,但它是一个相对较小的结构(大约 200 个条目)。
    • 很好的建议; TLB 未命中可能比缓存未命中更昂贵。
    • 数据结构实际上是一组结构体数组。每个数组大约 200 MB 并分配在共享内存中。这对 TLB 未命中有帮助吗?
    【解决方案4】:

    您可能想前往http://agner.org/optimize/ 并获取那里可用的优化 PDF - 那里有很多好的(低级)信息。非常专注于汇编语言级别,但 C/C++ 程序员也需要学习一些经验。

    第 3 卷,“Intel、AMD 和 VIA CPU 的微架构”应该很有趣 :-)

    【讨论】:

      【解决方案5】:

      关于组织数据结构以考虑缓存和 RAM 层次结构的好(长)文章来自 GNU 的 libc 维护者:https://lwn.net/Articles/250967/(此处为完整 PDF:http://www.akkadia.org/drepper/cpumemory.pdf

      【讨论】:

        猜你喜欢
        • 2020-03-28
        • 1970-01-01
        • 2012-04-07
        • 2018-02-06
        • 2014-07-05
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多