【问题标题】:Computationally efficient C++ - general reading [closed]计算效率高的 C++ - 一般阅读 [关闭]
【发布时间】:2012-02-27 20:07:44
【问题描述】:

我的工作主要是高性能“科学”计算。我已经这样做了大约 15 年,但直到最近才意识到我的软件浪费了计算时间。简而言之:我编写高效 C++ 代码的方式不再奏效。

有时我会看到一段代码,由某个孩子编写,其计算与我的基本相同(相同的算法,类似的方法),但是 - 神奇! - 执行得更快。在大多数情况下,我什至无法追踪差异的根源!

我的问题是:我怎样才能学习现代 C++ 代码优化的艺术?也许是关于 SSE、缓存/内存对齐问题的东西?欢迎任何关于书籍、PDF、文章、练习或网站的建议!

附言。我很清楚以下技巧:

  • 过于笼统(例如“使用分析器”、“使用好的算法”、“使用多线程”)
  • 琐碎(例如“避免使用虚函数”、“使用 ++i 代替 i++”、“启用 -O3”)
  • 有问题(例如,“通过 reinterpret_cast 重用内存”、“将正弦和余弦表格化”、“编写内联汇编”)
  • 荒谬(例如“做模板元编程”)

这些不是我要问的。

【问题讨论】:

  • 从我到目前为止所看到的情况来看,我会说尽可能避免动态内存分配,并智能地而不是随机地打包数据。一般来说,应用程序内存是瓶颈(好吧,除了磁盘/网络 IO ......)。此外,在 MT 情况下,由于我们拥有真正的多核/多处理器环境,虚假共享是一个杀手;也更难诊断。但是,不知道这如何应用于科学计算。
  • "... 无法追踪差异的根源!" - 这一点,恕我直言,无意冒犯,这表明您的调试速度不够快/分析工具。
  • 假设模板元编程通常很荒谬是荒谬的。尤其是当宣扬者声称具有科学背景并称那些最新的人为“孩子”时。也许你已经变得生疏甚至懒惰?
  • @Martin:我有点同意,但实际上仍然很难理解差异来自哪里。使用 O3,函数会被内联、循环展开和重新排列等等......所以理解为什么 C++ 代码更改会产生这些效果可能会令人生畏。

标签: c++ performance optimization


【解决方案1】:

我也在科学计算领域工作,但时间比 OP 长,主要是在 Fortran 领域。以下是根据我的经验提供的一点建议;

1) 及时了解编译器的功能。一方面不要试图在编译器知道的优化技巧上打败编译器,另一方面,要知道编译器仍然不擅长什么。例如,现在我认为在循环平铺方面我可以比我的编译器做得更好。也学习如何使编译器更容易优化代码。

OP 很想把这一点作为一个过于笼统而无法使用的建议的例子。我看到英特尔 C++ 编译器手册有大约 800 页的编译器选项文档,还有 400 页关于优化应用程序的文档。 OP 是否已阅读所有这些(或类似数量的首选编译器的文档)?

2) 与计算机体系结构保持同步,尤其是内存层次结构和 fpus 的设计。如果不出意外,这有助于理解人们可以合理预期的性能限制。但它也为程序设计和实施的决策提供输入,并指出当程序转移到下一代硬件时这些决策应该如何改变。

3) 使用库。写代码作为最后的手段。

4) 不要对诸如模板元编程之类的想法嗤之以鼻,这些想法在帮助程序员创建快速代码方面享有盛誉。研究 Boost 和 Blitz。

5) 项目绩效是一门经验学科。只相信数据,不相信论据。连我自己的论点都没有。

最后,即使在大规模高性能计算中(我最大的作业在 10K CPU 上运行了几天,所以我对此知之甚少),有时要优化的活动是开发时间,而不是执行时间。

PS 你有请教过孩子吗?

【讨论】:

    【解决方案2】:

    处理器比 15 年前快得多。内存的速度并没有以同样的速度增加。这与更大的数据集相结合,尤其是在大型科学模拟中,意味着您必须更仔细地考虑如何访问数据。这可能是其中的区别之一。

    我发现这些文章很有趣:

    http://overbyte.com.au/2011/10/21/optimisationmasterclass1/

    http://overbyte.com.au/2011/11/10/optimisation-lesson-2/

    它们是由我认识的一个编写游戏引擎并且现在优化 PS3 游戏的人编写的。您可能会发现它们很有用。

    【讨论】:

      【解决方案3】:

      我不能称这个人为“孩子”,但你可能会发现这门课程很有用: Advanced STL 来自 Stephan T Lavavej 的 MSDN Channel9 Lectures(VC++ 团队成员和 STL 的维护者)。但是,视频的质量对我来说并不好。也许,你会更幸运。

      【讨论】:

        【解决方案4】:

        hennessey 和 Patterson 的“计算机体系结构 - 一种定量方法”一书。不是专门针对 C++,但更重要的是整体架构。这对于 HPC 来说比任何“技巧和窍门”都更为重要。

        【讨论】:

          【解决方案5】:

          日志前段时间我读了两本书对我有帮助:

          1. Bulka 和 Meyhew 的《高效 C++ 性能编程技术》
          2. 更有效的 C++

          此外,定期访问BrDobbs,当然还有stackoverflow !!!

          【讨论】:

            【解决方案6】:

            不要忘记网格处理。可以跨多个 CPU 或多个线程执行长计算。

            这是一种改进计算时间的现代方法。

            其他的往往是标准的: - 高效使用缓存 - 有效使用惰性求值

            并在执行所有这些操作时避免锁定/解锁。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-12
              • 2020-01-21
              • 2012-09-23
              • 2016-12-18
              相关资源
              最近更新 更多