我有一项任务需要超强的性能
当然,我可以优化它的算法,但我也希望在硬件层面上进行优化。
当然,我可以使用CPU关联来将整个内核分配给处理我的任务的线程
另一种优化方法是将我的任务需要完成的数据放入CPU缓存(L1、L2、L3)中,以尽可能避免“内存访问”延迟
我可以使用什么API来进行这样的开发?
(换句话说,我的问题可能是:“如何强制CPU在缓存中放置给定的数据结构?”)
谢谢你的帮助
发布于 2016-10-30 01:41:48
Peter C对预取的出色评论。作为以前的优化器,我们要改进代码的第一件事就是删除所有的SW预取。此外,不要试图在电源状态之类的东西上胡乱摆弄。它们现在是如此之好,以至于在HPC中付出的努力是不值得的。一个可能的例外是超线程。你唯一想要去那里的时候是为了某些基准测试,在那里你需要一致性和性能。
查看英特尔优化资源,如optimization guide。另外,给自己找一个好的分析器;Intel's VTune确实是最好的分析器之一。要获取来自英特尔的信息,请使用必应(或谷歌)来查找信息。英特尔的网站一直都是一团糟。VTune拥有学生和教师许可证。
以下是我在优化应用程序以提高性能时采取的步骤。首先,排查更高级别的软件变更。然后开始调整硬件性能。为什么?两个原因:(1)代码更改通常是独立于体系结构的,并且在迁移到不同的硬件平台和代之后有更好的生存机会。(2)它们要简单得多(尽管可能不是那么有趣)。
代码更改:
硬件破解/优化(使用良好的硬件性能分析器)
重新构造code.
最后一个建议,虽然我相信您已经知道这一点。记住,去寻找最热门的地方。较小的机会是耗时的,性能改进不会对整体应用程序产生影响。
祝你好运。优化可以是有趣和有益的(如果你有点疯狂)。
发布于 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
发布于 2016-10-28 03:44:16
那么,您将需要使用一种低级语言(在本例中,C语言可能是首选)。
然后你有一些阅读要做:What every programmer should know about memory。请特别关注第6章,其中包含了关于如何针对特定使用模式进行优化的非常有用的编程建议。
https://stackoverflow.com/questions/40292928
复制相似问题