use*_*822 10 c++ optimization performance
我的工作主要是高性能的"科学"计算.我已经做了大约15年了,但直到最近才意识到我的软件浪费了计算时间.简而言之:我编写高效C++代码的方式不再适用.
我不时会看到一段由一些孩子编写的代码,它与我的计算基本相同(相同的算法,类似的方法),但是 - 神奇地! - 表现得更快.在大多数情况下,我甚至无法追踪差异的起源!
我的问题是:我如何学习现代C++代码优化的艺术?也许在SSE,缓存/内存对齐问题上有什么问题?欢迎任何书籍,PDF,文章,练习或网站的建议!
PS.我很清楚这些技巧:
这些不是我要问的.
Hig*_*ark 10
我也在科学计算方面工作的时间比OP长,主要是在Fortran中.这是我的经验中的一点建议;
1)及时了解编译器的功能.一方面,不要试图在编译器知道的优化技巧上击败编译器,另一方面,知道编译器仍然不擅长什么.例如,现在我认为我可以比循环平铺的编译器做得更好.还要了解如何使编译器轻松优化代码.
OP将试图通过这一点作为一个通用的例子,这个建议过于笼统而无法使用.我看到英特尔C++编译器手册有大约800页的编译器选项文档,还有400页有关优化应用程序的文档.OP是否已读取所有这些(或首选编译器的类似数量的文档)?
2)与计算机体系结构保持同步,特别是内存层次结构和fpus的设计.如果不出意外,这有助于理解人们可以合理预期的性能极限.但它也为程序设计和实施决策提供了输入,并指出了当程序转移到下一代硬件时这些决策应该如何改变.
3)使用库.编写代码作为最后的手段.
4)不要嘲笑诸如模板元编程之类的想法,这些想法在帮助程序员创建快速代码方面具有很好的声誉.学习提升和闪电战.
5)程序性能是一种经验学科.仅相信数据,而不是参数.甚至不是我提出的论点.
最后,即使在大规模的高性能计算中(我最大的工作在10K CPU上运行了几天,所以我对此有一点了解),有时优化的活动是开发时间,而不是执行时间.
PS你有没有问过孩子的指导?
处理器比15年前快得多.记忆并没有以相同的速度加速.这与更大的数据集相结合,特别是在大型科学模拟中,意味着您必须更仔细地考虑如何访问数据.这可能是差异之一.
我发现这些文章很有趣:
http://overbyte.com.au/2011/10/21/optimisationmasterclass1/
http://overbyte.com.au/2011/11/10/optimisation-lesson-2/
它们是由一个我认识的人编写的,他编写了游戏引擎并且现在优化了PS3游戏.您可能会发现它们很有用.