首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用(读/写) CPU缓存L1、L2、L3

如何使用(读/写) CPU缓存L1、L2、L3
EN

Stack Overflow用户
提问于 2016-10-28 03:38:44
回答 3查看 3.8K关注 0票数 3

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

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

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

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

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

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

谢谢你的帮助

EN

回答 3

Stack Overflow用户

发布于 2016-10-30 01:41:48

Peter C对预取的出色评论。作为以前的优化器,我们要改进代码的第一件事就是删除所有的SW预取。此外,不要试图在电源状态之类的东西上胡乱摆弄。它们现在是如此之好,以至于在HPC中付出的努力是不值得的。一个可能的例外是超线程。你唯一想要去那里的时候是为了某些基准测试,在那里你需要一致性和性能。

查看英特尔优化资源,如optimization guide。另外,给自己找一个好的分析器;Intel's VTune确实是最好的分析器之一。要获取来自英特尔的信息,请使用必应(或谷歌)来查找信息。英特尔的网站一直都是一团糟。VTune拥有学生和教师许可证。

以下是我在优化应用程序以提高性能时采取的步骤。首先,排查更高级别的软件变更。然后开始调整硬件性能。为什么?两个原因:(1)代码更改通常是独立于体系结构的,并且在迁移到不同的硬件平台和代之后有更好的生存机会。(2)它们要简单得多(尽管可能不是那么有趣)。

代码更改:

  1. 删除所有软件预取。用周期性interrupts
  2. Make替换任何轮询确保任何检查中断都有适当的间隔,使用
  3. 。真的。Fortran还活着是有原因的。查看英特尔Fortran论坛。论坛采用的都是经典的HPC。英特尔的Fortran编译器是最好的编译器之一。
  4. 使用优秀的优化编译器,并使用编译器设置和编译指示/注释(例如#编译指示循环计数)。同样,英特尔的也是最好的之一。(我讨厌这么说,但这是真的。)
  5. 使用一个很好的软件分析器来寻找优化机会(您的大部分时间都花在那里)。确保分析器能够深入研究源代码,以确定在不同函数上花费的时间。首先优化这些函数。从vectorization
  6. Convert (结构数组)到
  7. AoS (结构数组)到SofA,
  8. 为线程并行化(多线程)找到合适范围内的核心数量的机会。请注意,如果您必须在运行时进行转换,那么可能不值得对循环进行性能cost.
  9. Structure,以便它们更有利于编译器发现向量化的机会。有关如何做到这一点,请参阅任何好的优化书籍。

硬件破解/优化(使用良好的硬件性能分析器)

重新构造code.

  • Identify分支错误预测和重新构造code.

  • Identify流水线停止和重新构造代码。

最后一个建议,虽然我相信您已经知道这一点。记住,去寻找最热门的地方。较小的机会是耗时的,性能改进不会对整体应用程序产生影响。

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

票数 4
EN

Stack Overflow用户

发布于 2016-10-28 04:28:02

通常不能覆盖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

票数 2
EN

Stack Overflow用户

发布于 2016-10-28 03:44:16

那么,您将需要使用一种低级语言(在本例中,C语言可能是首选)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40292928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档