【问题标题】:How to use (read/write) CPU caches L1, L2, L3如何使用(读/写)CPU 缓存 L1、L2、L3
【发布时间】:2017-03-10 15:05:41
【问题描述】:

我有一项需要超高性能的任务

当然我可以优化它的算法,但我也想在硬件层面进行优化。

我当然可以使用 CPU 亲和性来将整个内核分配给处理我的任务的线程

另一种优化可能是将我的任务需要完成的数据放入 CPU 缓存(L1、L2、L3),以尽可能避免“RAM 访问”延迟

我可以使用什么 API 进行这样的开发?

(换句话说,我的问题可能是:“如何强制 CPU 将给定的数据结构放入缓存中?”)

感谢您的帮助

【问题讨论】:

    标签: cpu cpu-usage cpu-architecture cpu-cache cpu-cores


    【解决方案1】:

    Peter C 关于预取的出色评论。作为以前的优化器,我们改进代码的第一件事就是删除所有的 SW 预取。另外,不要试图乱搞电源状态等。现在它们非常好,以至于这些努力不值得在 HPC 中获得收益。一个可能的例外是超线程。您唯一想去的地方是进行某些需要一致性和性能的基准测试。

    查看英特尔优化资源,例如optimization guide。也让自己成为一个好的分析器; Intel's VTune 确实是最好的之一。有关来自英特尔的信息,请使用 bing(或 google)查找内容。英特尔的网站现在而且一直都是一团糟。 VTune 拥有学生和教育者许可。

    以下是我用来优化应用以提高性能的步骤。首先,用尽更高级别的软件更改。然后开始调整硬件性能。为什么?两个原因:(1) 代码更改通常与架构无关,并且更有可能在迁移到不同的硬件平台和生成时幸存下来。 (2) 它们做起来要简单得多(尽管可能不那么有趣)。

    代码更改:

    1. 删除所有软件预取。
    2. 用周期性中断替换任何轮询
    3. 确保任何检查中断都有适当的间隔
    4. 使用 Fortran。真的。 Fortran 仍然存在是有原因的。查看英特尔 Fortran 论坛。论坛全是经典HPC。英特尔的 Fortran 编译器是最好的之一。
    5. 使用良好的优化编译器,并使用编译器设置和编译指示/注释(例如 #pragma 循环计数)。同样,英特尔是最好的之一。 (我讨厌这样说,但这是真的。)
    6. 使用良好的软件分析器来寻找优化机会(您的大部分时间都花在了这些地方)。确保分析器能够深入研究源代码以识别花费在不同功能上的时间。先优化这些功能。
    7. 找到合适的线程并行化(多线程)机会,以适当地限制在内核数量范围内
    8. 寻找矢量化机会
    9. 从 AoS(结构数组)转换为 SofA。请注意,如果您必须即时进行转换,则可能不值得付出性能成本。
    10. 构建循环,使其更有利于编译器寻找向量化机会。有关如何做到这一点,请参阅任何优秀的优化书籍。

    硬件黑客/优化(使用良好的硬件级性能分析器)

    1. 识别缓存和 TLB 未命中,并重组代码。
    2. 识别分支错误预测并重组代码。
    3. 识别流水线停顿并重组代码。

    最后一个建议,虽然我相信你已经知道了。记住,去最热门的地方。较小的机会是耗时的,性能改进对整个应用程序没有影响。

    祝你好运。优化可以是有趣和有益的(如果你有点疯狂)。

    【讨论】:

      【解决方案2】:

      您通常不能覆盖 CPU 缓存中的 LRU 替换策略。 x86 CPU 至少不支持以任何方式将某些地址范围“固定”到任何级别的缓存中。

      您可以做的是在使用之前“预取”。 “软件预取”很少有用。通常,硬件预取会做得很好,然后您的数据就会保留在缓存中,只要您的缓存占用空间足够小。 Ulrich Drepper 的What every programmer should know about memory 涵盖了这一点,并且仍然具有相关性。但是,它对软件预取(尤其是单独的预取线程)的强调适用于 P4,但对于其他 CPU 来说不是一个好主意。阅读时请记住这一点。

      将数据结构和访问模式设计为​​对缓存友好也非常重要。尝试谷歌搜索“缓存感知”算法,也许(或者只是阅读 Ulrich 的论文)。或者只是随手调整,使用性能计数器来查看您是否不小心做了导致大量缓存未命中的事情。


      如果您在 Intel Haswell Xeon 或更新版本(Exxx v3 或更高版本)上运行此程序,您可以对 L3 缓存进行分区,以便运行关键线程的核心拥有 L3 块,并且不会被其他核心。这称为CAT (Cache Allocation Technology)。另见this article by Dan Luu

      【讨论】:

        【解决方案3】:

        嗯,您需要使用低级语言(在这种情况下,C 可能是首选语言)。

        那么你有一些阅读要做:What every programmer should know about memory。请特别注意第 6 章,其中包含有关如何针对特定使用模式进行优化的非常有用的编程建议。

        【讨论】:

          猜你喜欢
          • 2014-07-04
          • 2020-05-19
          • 2014-02-16
          • 2021-11-24
          • 2018-01-08
          • 2014-10-30
          • 2021-11-27
          • 2011-03-27
          相关资源
          最近更新 更多