计算效率高的C++ - 一般阅读

use*_*822 10 c++ optimization performance

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

我不时会看到一段由一些孩子编写的代码,它与我的计算基本相同(相同的算法,类似的方法),但是 - 神奇地! - 表现得更快.在大多数情况下,我甚至无法追踪差异的起源!

我的问题是:我如何学习现代C++代码优化的艺术?也许在SSE,缓存/内存对齐问题上有什么问题?欢迎任何书籍,PDF,文章,练习或网站的建议!

PS.我很清楚这些技巧:

  • 太一般(例如'使用分析器','使用好的算法','去多线程')
  • 琐碎(例如'避免虚函数','Do ++ i代替i ++','启用-O3')
  • 有问题的(例如'使用reinterpret_cast重复使用内存<>','Tabularize正弦和余弦','写入内联汇编')
  • 荒谬(例如'做模板元编程')

这些不是我要问的.

Hig*_*ark 10

我也在科学计算方面工作的时间比OP长,主要是在Fortran中.这是我的经验中的一点建议;

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

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

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

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

4)不要嘲笑诸如模板元编程之类的想法,这些想法在帮助程序员创建快速代码方面具有很好的声誉.学习提升和闪电战.

5)程序性能是一种经验学科.仅相信数据,而不是参数.甚至不是我提出的论点.

最后,即使在大规模的高性能计算中(我最大的工作在10K CPU上运行了几天,所以我对此有一点了解),有时优化的活动是开发时间,而不是执行时间.

PS你有没有问过孩子的指导?


The*_*ist 6

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

我发现这些文章很有趣:

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

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

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