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

Computationally efficient C++ - general reading

本文关键字:C++- 效率高 计算      更新时间:2023-10-16

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

我不时看到一些孩子写的一段代码,它做的计算基本上和我的相同(相同的算法,相似的方法),但神奇的是!-性能要快得多。在大多数情况下,我甚至无法找到差异的根源!

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

PS。我很清楚其中一种技巧:

  • 过于笼统(例如"使用探查器"、"使用良好的算法"、"多线程")
  • 琐碎(例如,"避免虚拟函数"、"Do++i而非i++"、"Enable-O3")
  • 有问题(例如,"使用interpret_cast<>重用内存"、"将正弦和余弦制表"、"编写内联程序集")
  • 可笑(例如"执行模板元编程")

这些不是我所问的。

我也从事科学计算,尽管时间比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游戏。你可能会发现它们很有用。

我不能称这家伙为"孩子",但你可能会发现这门课很有用:高级STL来自MSDN Channel9 Stephan T Lavavej(那里的VC++团队成员和STL维护者)的讲座。不过,视频的质量对我来说并不好。也许,你会更幸运。

《计算机体系结构-定量方法》一书。不是专门针对C++,而是更重要的整体架构。这对HPC来说甚至比任何"技巧和窍门"都更重要。

记录时间前我读了两本对我有帮助的书:

  1. 利用Bulka&Meyhew
  2. 更有效的C++

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

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

这是一种提高计算时间的现代方法。

其他的往往是标准的:-高效使用缓存-延迟评估的有效利用

并且在进行所有这些操作的同时避免锁定/解锁。