【发布时间】:2012-02-27 20:07:44
【问题描述】:
我的工作主要是高性能“科学”计算。我已经这样做了大约 15 年,但直到最近才意识到我的软件浪费了计算时间。简而言之:我编写高效 C++ 代码的方式不再奏效。
有时我会看到一段代码,由某个孩子编写,其计算与我的基本相同(相同的算法,类似的方法),但是 - 神奇! - 执行得更快。在大多数情况下,我什至无法追踪差异的根源!
我的问题是:我怎样才能学习现代 C++ 代码优化的艺术?也许是关于 SSE、缓存/内存对齐问题的东西?欢迎任何关于书籍、PDF、文章、练习或网站的建议!
附言。我很清楚以下技巧:
- 过于笼统(例如“使用分析器”、“使用好的算法”、“使用多线程”)
- 琐碎(例如“避免使用虚函数”、“使用 ++i 代替 i++”、“启用 -O3”)
- 有问题(例如,“通过 reinterpret_cast 重用内存”、“将正弦和余弦表格化”、“编写内联汇编”)
- 荒谬(例如“做模板元编程”)
这些不是我要问的。
【问题讨论】:
-
一本好书 IMO:intel.com/intelpress/sum_swcb2.htm
-
从我到目前为止所看到的情况来看,我会说尽可能避免动态内存分配,并智能地而不是随机地打包数据。一般来说,应用程序内存是瓶颈(好吧,除了磁盘/网络 IO ......)。此外,在 MT 情况下,由于我们拥有真正的多核/多处理器环境,虚假共享是一个杀手;也更难诊断。但是,不知道这如何应用于科学计算。
-
"... 无法追踪差异的根源!" - 这一点,恕我直言,无意冒犯,这表明您的调试速度不够快/分析工具。
-
假设模板元编程通常很荒谬是荒谬的。尤其是当宣扬者声称具有科学背景并称那些最新的人为“孩子”时。也许你已经变得生疏甚至懒惰?
-
@Martin:我有点同意,但实际上仍然很难理解差异来自哪里。使用 O3,函数会被内联、循环展开和重新排列等等......所以理解为什么 C++ 代码更改会产生这些效果可能会令人生畏。
标签: c++ performance optimization